Ganjil: surat


11

Objektif

Tulis program atau fungsi (atau yang setara) yang memilah dan mengembalikan huruf aneh dalam matriks ukuran acak.

Detail

Anda akan diberikan sebuah matriks (sebagai string) sebagai input dari dimensi acak seperti ini.

bbbbbbbbbb
bbbbbdbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb

Tugas Anda adalah menemukan huruf yang tidak cocok dengan yang lainnya (dalam hal ini d, ditemukan di baris 2, kolom 6) dan mengembalikan surat itu sebagai output. Matriks akan terdiri dari huruf A-Z,, a-zbaris baru ( \n, hanya pada ujung baris) dan memiliki dimensi mulai dari 5x5 hingga 10x10 (25-100 huruf).

Celah standar berlaku. Ini adalah tantangan kode golf; entri dengan kode setidaknya byte menang.

Memasukkan

Input akan diteruskan melalui input standar sebagai string jika itu adalah program atau sebagai argumen jika suatu fungsi (atau serupa).

Keluaran

Karakter tunggal yang merupakan "aneh" dalam matriks atau None ,nil , NUL, atau string "None"jika tidak ada "aneh" karakter.

Lebih banyak contoh

AAAAAAA
AAAAAAA
AAAAAAA
AAAIAAA
AAAAAAA

Menjawab: I

vvqvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv

Menjawab: q

puuuuuuuuu
uuuuuuuuuu
uuuuuuuuuu
uuuuuuuuuu
uuuuuuuuuu
uuuuuuuuuu
uuuuuuuuuu
uuuuuuuuuu
uuuuuuuuuu
uuuuuuuuuu

Menjawab: p

Generator

Berikut ini adalah generator matriks acak yang ditulis dengan Python yang dapat Anda gunakan untuk menguji program Anda. Catatan: Ada sedikit kemungkinan bahwa itu bisa membuat kesalahan dan tidak memasukkan huruf aneh.


1
Berikut ini adalah terjemahan harfiah kode Python Anda ke dalam JS.
Arnauld

1
@juniorRubyist "menghapus bonus" tidak sama dengan "membuat bonus wajib". Dengan memindahkan bagian yang opsional sejauh ini ke persyaratan tantangan, Anda telah membatalkan sebagian besar jawaban yang ada.
Martin Ender

Jawaban:



6

J , 12 10 7 byte

-.}./.~

Cobalah online!

    /.~        Group identical items together
  }.           Remove one item from each group
-.             Remove the rest from the input

Versi 10 byte

-._1 1{\:~

desis ...

       \:~        Sort down
  _1 1{           Take the last character (which is a newline) and the second one.
-.                Remove those from the input

2
@ FrownyFrog Ini adalah cara cerdas untuk menemukan karakter aneh
Galen Ivanov

tidak dapat memutuskan apa yang saya sukai lebih baik: kait yang indah ini atau lelucon naga Anda ...
Jonah

4

Brachylog , 8 4 byte

oḅ∋≠

Cobalah online!

Penjelasan

Saya belum pernah menggunakan Brachylog sebelumnya, jadi ini mungkin tidak optimal.

oḅ∋≠  Input is a string.
o     Sort the input.
 ḅ    Split it into blocks of equal elements.
  ∋   There is a block
   ≠  whose elements are all different.
      That block is the output.

Bahwa penggunaan ∋≠after untuk mendapatkan hasil panjang 1 sangat pintar. Anda harus mempostingnya di pertanyaan kiat Brachylog .
Fatalkan

@Formatisasi Terima kasih, saya menambahkan tipnya.
Zgarb

3

K (oK) , 7 6 byte

Larutan

*<#:'=

Cobalah online!

Contoh:

*<#:'="vvqvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"q"

Penjelasan:

Menemukan pendekatan yang sedikit lebih pendek: Evaluasi kanan-ke-kiri:

*<#:'= / the solution
     = / group matching items together
  #:'  / count (#:) each (')
 <     / sort ascending
*      / take the first one

Catatan:

Sementara saya mengharapkan aspek bonus dari tantangan ini hilang, solusi ini akan mengembalikan karakter baris baru \njika tidak ada karakter aneh:

*<#:'="vvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"\n"

3

Prolog (SWI) , 46 byte

p(L):-select(X,L,Y),\+member(X,Y),writef([X]).

Cobalah online!

Atau jika output true standar dari kueri prolog tidak apa-apa:

Prolog (SWI) , 48 byte

Z*L:-select(X,L,Y),\+member(X,Y),char_code(Z,X).

Cobalah online!

Penjelasan

Find the first element X in the input  
that when removed, results in output  
that does not contain X

then depending on the version above either:  
print X as a character  
or  
return X as an atom

3

C (gcc) , 93 92 90 66 62 Bytes

Jauh lebih pendek sebagai fungsi

t;f(char*p){for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

Cobalah online!

kode uji

main()
{
    char s[99];
    for(;gets(s);)f(s);
}

versi lama adalah sebuah program

C 86 Bytes

char*p;s[9];main(t){for(;p=gets(s);)for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

Menghasilkan karakter aneh, atau tidak sama sekali. lari seperti ini;

C:\eng\golf>python matrix_gen.py | a.exe
X
C:\eng\golf>python matrix_gen.py | a.exe
G
C:\eng\golf>python matrix_gen.py | a.exe
x
C:\eng\golf>python matrix_gen.py | a.exe

C:\eng\golf>python matrix_gen.py | a.exe
J

Saya tidak tahu bahwa cukup adil untuk memasukkan gets()driver tes karena membersihkan input dengan menghapus \ n karakter untuk Anda. Itu melakukan beberapa pekerjaan sehingga fungsi Anda tidak bekerja pada input asli.
Michael Dorgan

@MichaelDorgan Ia bekerja dengan input pipa dari skrip python serta input pada TIO. Yang lain hanya dengan keras memasukkan input yang tampaknya tidak dengan semangat tantangan.
Cleblanc

3

05AB1E ,  4  2 byte

Disimpan 2 byte berkat Adnan

.m

Cobalah online!

Penjelasan

.m   # push a list of the least frequent character(s) in input

Apakah Anda perlu menghapus baris baru, mengingat kami dijamin inputnya akan minimal 5 baris?
Shaggy

@ Shaggy: Tidak, saya tidak. Itu untuk menangani 2x2matriks. Saya merindukan bagian tentang5x5 dan ke atas. Terima kasih!
Emigna

Itu harus kembali niljika tidak memiliki "yang aneh" bukan?
Magic Gurita Guci

@MagicOctopusUrn Bagian itu opsional ketika jawaban ini diposting. Saya kira perubahan itu membatalkan sebagian besar jawaban sekarang ...
Martin Ender


2

Sekam , 2 byte

◄=

Cobalah online!

Ini adalah fungsi yang mengambil string sebagai input dan mengembalikan karakter. Dibutuhkan minimum dari string input ketika membandingkan karakter untuk kesetaraan (yaitu mengembalikan karakter yang sama dengan jumlah terkecil dari karakter lain).


2

C, 94 byte

Kembali dengan pointer. Jika tidak ada, kembali \0.

Ini akan menyebabkan kebocoran memori. Anggap int4 byte.

*t;f(c,p,i)char*c,*p;{t=calloc(64,8);for(*p=-1;*c;c++)t[*c]--;for(i=0;++i<128;)!~t[i]?*p=i:0;}

Cobalah online!



@ Shaggy Sebenarnya, saya tidak tahu bagaimana menafsirkan aturan itu, karena saya melihat beberapa pengguna (yang lain) secara eksplisit tahu tentang aturan itu tetapi masih memposting jawaban seperti ini.
user202729

2
@ user202729, hanya karena orang lain melakukannya bukan berarti itu benar;) Jika Anda menemukan solusi seperti itu, lebih baik tunjukkan pada mereka.
Shaggy

@ Shaggy Yah, saya secara eksplisit menunjuk aturan tetapi pengguna itu berkata "aturan secara eksplisit mengatakan bahwa yang ini valid". Saya tidak tahu harus berkata apa. | Dalam hal ini fungsi tersebut mengharuskan array tuntuk memusatkan perhatian sebelum memanggil setiap kali bukan yang pertama kali.
user202729

@Shaggy Terima kasih, sudah diperbaiki.
Colera Su


2

Bash , 15 20 byte

fold -1|sort|uniq -u

Cobalah online!

Penjelasan: fold s input ke 1karakter per baris, sorts ke dalam kelompok huruf yang cocok, lalu cetak hanya baris yang adauniq ue.

Terima kasih @Nueluel Fouilleul untuk menangkap dan membantu memperbaiki masalah dengan pendekatan ini.


tidak berfungsi jika karakter ganjilnya adalah karakter kedua atau penuitlimate
Nahuel Fouilleul

@NahuelFouilleul Tangkapan bagus ... Saya tidak yakin bagaimana cara memperbaikinya saat ini, tetapi saya akan memperbaiki atau menghapusnya nanti kecuali Anda memiliki perbaikan yang disarankan.
Justin Mariner

itu bisa diperbaiki dengan mudah |sort|tetapi mungkin ada solusi yang lebih baik
Nahuel Fouilleul

juga menemukan solusi dengan grep tetapi lebih lamagrep -oP '^(.)((?=(?!\1).){2}|.*\K(?!\1).)'
Nahuel Fouilleul

@NahuelFouilleul Saya akan sortmemperbaikinya, terima kasih. Anda selalu dapat memposting jawaban grep itu sebagai milik Anda jika Anda mau.
Justin Mariner



1

Matlab, 25 Bytes

a=input('');a(a~=mode(a))

Input "a" di mana "a" bukan mode "a". Keluaran array kosong tanpa keanehan.


1

Haskell, 33 * 0,75 = 24,75 byte

f s=[c|[c]<-(`filter`s).(==)<$>s]

Mengembalikan daftar kosong jika tidak ada karakter aneh.

Cobalah online!

Untuk setiap karakter cdalam matriks (diberikan sebagai string s) buat string dari semua karakter syang sama dengan cdan pertahankan panjangnya 1.


1

JavaScript (ES6), 37 byte

Kembali nulljika tidak ada surat aneh.

s=>s.match(`[^
${s.match(/(.)\1/)}]`)

Uji kasus


1

Japt , 6 byte

Mengambil input sebagai string multi-line dan menghasilkan string karakter tunggal, atau string kosong jika tidak ada solusi.

k@èX É

Cobalah


Penjelasan

Hapus karakter yang mengembalikan truey ( k) ketika melewati fungsi ( @) yang menghitung ( è) kemunculan elemen saat ini ( X) di input dan kurangi 1 ( É).


1

Gangguan Umum, 47 byte

(lambda(s)(find-if(lambda(x)(=(count x s)1))s))

Cobalah online!

Mengembalikan huruf ganjil atau NIL jika tidak ada.


1

Jelly , 4 byte

ċ@ÐṂ

Cobalah online!

Kembali \n(satu baris baru) jika tidak ada karakter aneh. Jelas \nbukan karakter yang dapat dicetak.

Kebetulan algoritma ini persis sama dengan jawaban Mr.Xcoder Python. (Saya datang dengan itu secara mandiri)

Penjelasan:

  ÐṂ    Ṃinimum value by...
ċ@      ċount. (the `@` switch the left and right arguments of `ċ`)

Itu bekerja karena dalam sebuah m×nmatriks:

  • Jika ada karakter aneh: Ada m-1baris baru, 1 karakter aneh dan m×n-1karakter normal, dan 1 < m-1 < m×n-1karena5 ≤ m, n ≤ 10 .
  • Jika tidak ada karakter aneh: Ada m-1baris baru dan m×nkarakter normal, dan m-1 < m×n.


1

C (gcc) , 91 86 82 79 71 byte

f(char*s){for(;*++s==10?s+=2:0,*s;)if(*s^s[-1])return*s^s[1]?*s:s[-1];}

Cobalah online!

  • Terima kasih untuk Gastropner untuk xor dan? trik (-3 byte)
  • Mengolah versi perbandingan untuk memperbaiki bug dan menggunakan sihir Gastropner dari komentar.

Penjelasan:

Bandingkan karakter saat ini dan sebelumnya sambil melewatkan baris baru. Jika berbeda, bandingkan dengan char berikutnya. Ini memberitahu kita jika kita mengembalikan karakter saat ini atau sebelumnya. Fungsi mengembalikan nilai karakter "ganjil" jika ada atau 0 jika array tidak aneh. Kami lolos dengan cek char "selanjutnya" karena selalu ada baris baru sebelum \0char. Jika tidak ada char aneh, kami pada dasarnya mengembalikan \ 0 dari for loop.


Kode lama atau lebih seksi Penjelasan:

Buat xor mask berjalan dari 3 nilai string berikutnya. Jika semuanya sama, maka nilainya akan sama dengan salah satu dari ketiganya. Jika mereka berbeda, maka 2 identik akan membatalkan satu sama lain meninggalkan yang unik.

Harus faktor / n sebelum xor atau menjadi berantakan. Juga harus memeriksa 2 karakter untuk ketidaksamaan dalam kasus s [0] adalah nilai ganjil. Ini membutuhkan biaya tambahan || memeriksa.

v;f(char*s){while(s[3]){s[2]==10?s+=3:0;v=*s^s[1]^s[2];if(v^‌​*s++||v^*s)break;}}

79 dengan beberapa penyesuaian. Pengembalian jatuh tidak setuju dengan kompiler saya, jadi hanya diuji pada TIO:v;f(char*s){while(s[3]){s[2]==10?s+=3:0;v=*s^s[1]^s[2];if(v^*s++||v^*s)break;}}
gastropner

Untuk omong kosong yang saya tulis, TIO adalah apa yang saya pertahankan. Terima kasih!
Michael Dorgan

Menyusun ulang beberapa ekspresi memungkinkan -2 untuk 77: v;f(char*s){while(s[2]==10?s+=3:0,v=*s^s[1]^s[2],s[3])if(v^*s++||v^*s)break;} Namun kuda Anda yang menang adalah yang lain, jika Anda mengutakv;f(char*s){for(v=-1;*++s==10?s+=2,v--:0,*s;v=0)if(*s^s[-1])return s[v];}
atiknya

Ya, tapi xor sepertinya sangat seksi. :)
Michael Dorgan

Sarankan s+=*++s-10?0:2alih-alih*++s==10?s+=2:0
ceilingcat

1

Oktaf , 26 25 byte

1 byte disimpan berkat @Giuseppe

@(x)x(sum(x(:)==x(:)')<2)

Fungsi anonim yang mengambil array char 2D sebagai input, dan menampilkan huruf ganjil atau string kosong jika tidak ada.

Cobalah online!


0

Alice , 16 * 75% = 12 byte

/-.nDo&
\i..*N@/

Cobalah online!

Keluaran Jabberwockyjika tidak ada karakter duplikat.

Penjelasan

/...@
\.../

Ini adalah kerangka kerja untuk program linier yang beroperasi sepenuhnya dalam Ordinal (mode pemrosesan string). Kode aktual dieksekusi dengan cara zigzag dan membuka ke:

i..DN&-o

i   Read all input.
..  Make two copies.
D   Deduplicate one copy, giving only the two letters and a linefeed.
N   Multiset difference. Removes one copy of each letter and one linefeed.
    Therefore it drops the unique letter.
&-  Fold substring removal over this new string. This essentially removes
    all copies of the repeated letter and all linefeeds from the input,
    leaving only the unique letter.
.   Duplicate.
n   Logical NOT. Turns empty strings into "Jabberwocky" and everything else
    into an empty string.
*   Concatenate to the previous result.
o   Print the unique letter or "Jabberwocky".

Alih-alih &-, kita juga bisa menggunakan ey(transliterasi ke string kosong). Sebagai alternatif, dengan mengeluarkan satu karakter lagi pada manipulasi tumpukan, kita juga dapat menduplikat input yang memungkinkan kita menghapus karakter yang tidak diinginkan N, tetapi masih dengan byte yang sama:

i.D.QXN.n*o@

Alice , 13 byte

/N.-D@
\i&.o/

Cobalah online!

Ini adalah solusi tanpa bonus, itu hanya melewatkan .n*.



0

APL + WIN, 16 byte

(1=+/a∘.=a)/a←,⎕

Meminta input layar dan mengeluarkan huruf ganjil atau tidak sama sekali jika tidak ada huruf ganjil


a/⍨1=+/a∘.=a←,⎕untuk satu byte
Uriel

@Uriel Terima kasih tapi saya khawatir operator ⍨ tidak tersedia di APL + WIN versi 5 :(
Graham

0

PowerShell , 39 byte

([char[]]"$args"|group|sort c*)[0].Name

Cobalah online!

Mengambil input sebagai string dengan baris baru (seperti yang ditentukan dalam tantangan), mengubahnya menjadi char-array. Kami kemudian Group-Objectkarakter, sehingga karakter dikelompokkan bersama dengan nama mereka, kemudian sortberdasarkan pada count. Ini memastikan bahwa karakter yang kesepian adalah yang pertama, jadi kami ambil[0] indeks dan menampilkannya.Name .

Jika baris baru dapat diterima untuk "tidak ada" maka ini memenuhi syarat untuk bonus.


Saya berharap sort c*)[0]bisa dipersingkat, tetapi yang saya dapatkan adalah jumlah byte yang sama ? c* -eq 1),.
root

dapat dipersingkat dengan menghapus tanda kutip ganda di sekitar $args. Juga lebih akurat untuk dilakukan ([char[]]$args|group|? c* -eq 1).Namekarena akan kembali secara akurat nullketika tidak ada karakter aneh (bukan baris baru). Namun dalam hal byte, ini masih tidak akan membawa Anda di bawah 37.
cogumel0

@ cogumel0 Tidak berjalan tanpa tanda kutip ganda.
root

@ root Anda benar. Namun untuk lulus salah satu syarat (Sebuah karakter tunggal yang adalah "aneh" dalam matriks atau None, nil, NUL, atau string "None"jika tidak ada "aneh" karakter.) Itu masih harus diubah. Newline bukan bagian dari jawaban yang dapat diterima.
cogumel0

@ cogumel0 Ah, tantangannya berubah sejak saya memposting jawaban saya. "Tidak ada / nihil / apa pun" digunakan hanya sebagai bonus daripada wajib. Saya akan menjaga jawaban saya apa adanya.
AdmBorkBork

0

Perl 6 ,  27  24 -25% = 18 byte

*.comb.Bag.min(*.value).key

Menguji

{%(.comb.Bag.invert){1}}

Menguji

Ini akan mengembalikan nilai yang tidak ditentukan saat diberi input yang tidak memiliki karakter aneh.

Diperluas:

{  # bare block lambda with implicit parameter 「$_」

  %(        # coerce into a Hash

    .comb   # split the input into graphemes (implicit method call on 「$_」)
    .Bag    # turn into a weighted Set
    .invert # invert that (swap keys for values) returns a sequence

  ){ 1 }    # get the character that only occurs once
}

0

Brainfuck, 125 byte

,[----------[>],]<[->+<]<<[[->->+<<]>[>[->-<<<+>>]>[,<<,>>]<<<[->+<]>[->+<]<]>[-<<+>>]>[-<+>]<<<<]>>>>[<]<++++++++++.

Cobalah secara Online

Mencetak huruf dari matriks jika tidak ada yang aneh


0

Java 8, 85 byte

Ini adalah lambda dari Stringke String(misalnya Function<String, String>). Ini pada dasarnya adalah salinan dari solusi Luca , tapi aku sudah sedikit mengurutkan string.

s->new String(s.chars().sorted().toArray(),0,s.length()).replaceAll("(.)\\1+|\\n","")

Cobalah secara Online

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.