Tantangan:
Cetak setiap kata 2 huruf yang dapat diterima di Scrabble menggunakan sesedikit mungkin byte. Saya telah membuat daftar file teks di sini . Lihat juga di bawah. Ada 101 kata. Tidak ada kata yang dimulai dengan C atau V. Kreatif, bahkan jika solusi tidak optimal, dianjurkan.
AA
AB
AD
...
ZA
Aturan:
- Kata-kata yang dikeluarkan harus dipisahkan entah bagaimana.
- Kasus tidak masalah, tetapi harus konsisten.
- Ruang tambahan dan baris baru diizinkan. Tidak boleh ada karakter lain yang dihasilkan.
- Program seharusnya tidak mengambil input apa pun. Sumber daya eksternal (kamus) tidak dapat digunakan.
- Tidak ada celah standar.
Daftar kata:
AA AB AD AE AG AH AI AL AM AN AR AS AT AW AX AY
BA BE BI BO BY
DE DO
ED EF EH EL EM EN ER ES ET EX
FA FE
GO
HA HE HI HM HO
ID IF IN IS IT
JO
KA KI
LA LI LO
MA ME MI MM MO MU MY
NA NE NO NU
OD OE OF OH OI OM ON OP OR OS OW OX OY
PA PE PI
QI
RE
SH SI SO
TA TI TO
UH UM UN UP US UT
WE WO
XI XU
YA YE YO
ZA
Jawaban:
Python 3,
194188 byteHampir pasti bukan metode yang terpendek, tetapi saya pikir ini akan menjadi awal yang baik. Cobalah untuk mengemas setiap pasangan ke jalur dengan tumpang tindih sebanyak mungkin (misalnya
"ODEX..."
=["OD", "DE", "EX", ...]
). Spasi digunakan untuk memisahkan jalur, dan setiap pasangan dengan spasi di dalamnya akan dihapus (ruang trailing adalah untuk mencegah satuE
dari dicetak pada akhir).Saya juga mencoba regex golf ini tetapi itu lebih lama.
sumber
AYAHOYOWOMUNUHAID
!CJam,
9694 byteDi atas adalah hexdump, yang dapat dibalik dengan
xxd -r -c 16 -g 1
.Cobalah online di juru bahasa CJam .
Bergantung pada apa yang sebenarnya dianggap terpisah , entah bagaimana , jumlah byte bisa diturunkan menjadi 93 atau bahkan 92 :
Jika kita ganti
-55
dengan59
, kata-kata akan dipisahkan oleh spasi yang tidak putus (0xA0).Jika kita ganti
-55
denganW
, kata-kata akan dipisahkan dengan tanda-at (0x40).Ide
Kita dapat menyandikan setiap pasangan huruf xy sebagai (ord (x) - 65) × 25 + (ord (y) - 65) . 1
Alih-alih menyimpan bilangan bulat yang dihasilkan, kami akan menyimpan perbedaan semua pasangan yang sesuai dengan dua kata yang berdekatan (diurutkan berdasarkan abjad).
Perbedaan tertinggi adalah 35 , jadi kami menganggap mereka digit basis 36 integer dan mengonversi integer itu menjadi string byte.
Kode
1 Karena huruf kedua tidak pernah Z , menggunakan 25 bukan 26 sudah cukup.
sumber
PHP
224, 218, 210206Jelas bukan skor yang bagus, tetapi saya menyukai tantangannya.
Saya membuat tabel opsi, menciptakan sistem bitwise untuk menandai opsi mana yang valid.
Kemudian saya base-36 mengkodekan opsi-opsi itu untuk mendapatkan string:
Perhatikan entri ke-3 dalam array string itu tidak memiliki nilai, karena C tidak memiliki opsi.
Untuk mencetak nilai, saya hanya mengonversi opsi yang valid ke karakter.
Mungkin ada sesuatu yang bisa saya lakukan untuk mengurangi pengakuan bahwa tidak ada kata yang diakhiri dengan C, J, K, Q, V atau Z, tetapi saya tidak bisa memikirkan metode untuk menguranginya atm.
Dengan transposing tabel, ada lebih banyak elemen kosong dan data dikodekan sedikit lebih kompak yang mencukur beberapa byte. Array sekarang dicetak dalam urutan yang berbeda:
Terima kasih kepada Ismael untuk ledakan dan untuk petunjuk lingkaran.
Dengan pembaruan ke php5.6,
pow(,)
dapat diganti dengan**
menyimpan 4 byte lainnya.sumber
","
, Anda dapat menggunakanexplode(0,UB1YB0100CUP[...])
3
bisa saya gunakan itu! Terima kasih$e++;for($f=0;$f<26;$f++)
denganfor($e++,$f=0;$f<26;$f++)
, dan sekarang Anda dapat menghapus sial itu{}
. Dan jika Anda ingin mengonversi karakter menjadi huruf kecil, gunakan$e^' '
.Perl,
167164157 byteTulis skrip terpisah untuk mengelompokkan huruf-huruf tersebut menjadi seringkas mungkin menjadi string yang berisi semua kata 2 huruf yang valid. Ini kemudian mengulangi semua kata dua huruf dan mencetak yang valid, satu per baris. Jalankan dengan
perl -M5.10.1 script.pl
.sumber
-M5.10.1
untuk menggunakansay
kata kunci yang ditambahkan dalam versi itu, atau menambahkanuse feature 'say';
di badan skrip.C, 155 byte
Versi golf
Keluaran
Versi tidak disatukan
String sihir 51-byte dalam versi golf berisi banyak karakter di luar ASCII 126, yang hampir pasti telah diubah menjadi setara Unicode. Versi ungolfed menggunakan hex sebagai gantinya, dan sebagai konstanta daripada literal. Juga, versi yang tidak dipisahkan memisahkan kata-kata dengan baris baru, yang membuatnya lebih mudah untuk menyalin dan menempel ke Excel, memesan daftar dan membandingkannya dengan yang diperlukan.
Penjelasan
Jika kita memperluas definisi vokal untuk memasukkan 8 huruf AHMEIOUY, kami mengamati bahwa semua kata terdiri dari satu vokal dan satu huruf lainnya (yang mungkin atau mungkin bukan vokal.) Oleh karena itu, untuk semua kata yang diakhiri dengan vokal, kami memerlukan tabel 26 byte, satu untuk setiap huruf pertama, dengan bit individual yang sesuai dengan vokal. Kita membutuhkan tabel yang sama untuk kata-kata yang dimulai dengan vokal, kecuali bahwa kali ini kita hanya membutuhkan 25 byte, karena tidak ada kata yang diakhiri dengan Z. Kedua tabel tersebut di-riffled bersama untuk membuat tabel final.
Untuk menghindari kode ASCII di wilayah 0..31, dua "vokal" paling umum M dan H ditugaskan ke bit ke-6 dan ke-7, dan pengkodean menganggap 1 untuk kata yang tidak benar dan 0 untuk kata yang valid. Karena tidak ada konsonan yang berpasangan dengan M dan H, dimungkinkan untuk memastikan setidaknya satu dari bit-bit ini adalah 1.
Bit ke-8 ditugaskan ke A, yang merupakan vokal paling umum, untuk mencoba membatasi karakter non-ASCII (masih ada cukup banyak dari mereka.)
Tabel yang digunakan di bawah ini. Untuk kata-kata yang mengandung 2 vokal, saya mengutamakan huruf pertama yang dianggap sebagai "vokal" dan huruf kedua sebagai "huruf." Pengecualian untuk ini adalah kata-kata yang dimulai dengan M, karena ini menghindari bentrokan antara MM dan HM.
Hex encoding kata-kata dimulai dengan vokal
Pengodean heks kata-kata yang berakhir dengan vokal
sumber
Java,
484448407391389 bytePercobaan pertama saya
Diformat:
Cobalah online
sumber
\n
dengan hanya mengganti spasi. Mereka tidak harus dipisahkan oleh garis baru."".format
menyakitkan untuk dilihat, tetapi lucu.Ruby, 166 byte
Meminjam metode rapi sp3000 untuk menyandikan kata-kata menjadi string yang ringkas. Kicker di sini adalah metode pendek untuk mendekodekannya kembali ke dalam kata-kata dua huruf: Menggunakan lookahead di regex diteruskan ke metode pemindaian String untuk mengekstraksi pertandingan yang tumpang tindih, bukan ruang containg:
Ruby, 179 byte
Pendekatan saya sendiri: Hasilkan semua kata dua huruf antara
AA
danZA
, dan pilih yang valid menggunakan basis 36 bitmask yang disandikan:sumber
Matlab, 177 byte
Hasilkan matriks biner yang mendefinisikan semua pasangan huruf yang diizinkan, bentuk ulang dan basis-64 mengkodekannya. String encoded base-64 (
'CR+ ... % '
) digunakan sebagai data dalam program. Program membalikkan operasi untuk membongkar matriks, dan kemudian membaca pasangan yang diperbolehkan:sumber
Malbolge , 2118 bytes
Cobalah online!
sumber
Bash, 179 byte
Ini digunakan
sed
untuk melakukan penggantian regex. Input regex pertama didasarkan pada ide Sp3000 sedangkan regex kedua menggunakan input umum tanpa spasi.Penjelasan:
sumber
`grep -o ..
di tempat`sed -r 's/ / &/g'
, trik dari jawaban saya di bawah ini.Karena semua kata panjangnya dua karakter, kita dapat menghancurkan semuanya bersama-sama dan kemudian memecahnya lagi menggunakan ekspresi reguler sederhana.
Bahasa ramah regex apa pun bisa melakukan ini, beberapa lebih efisien daripada yang lain:
Grep (via Bash), 215 byte
Javascript, 224 byte
Perl, 225 byte
Python, 245 byte
Sebagai catatan, beberapa jawaban di sini lebih panjang dari
echo
yang saya anggap sebagai dasar:Shell POSIX, 307 byte
sumber
C -
228217 Bytes - GCCAkan memperbarui jika saya bisa membuatnya lebih kecil, hanya kompilasi dengan gcc -w, ./a.out output dengan sempurna. Jika ada minat pada ungolfed, beri tahu saya.
Saya tidak bisa memikirkan cara untuk memendekkannya dari atas kepala saya, (Anda dapat menghapus tanda kutip secara teknis dan Anda masih akan mendapatkan jawaban yang benar, hasilnya hanya terlihat seperti sampah) jadi tolong beri tahu saya lagian untuk mempersingkatnya
sumber
_;main(){char*z="AABDEGHILMNRSTWXY AEIOY EO DFHLMNRSTX AE O AEIMO DFNST O AI AIO AEIMOUY AEOU DEFHIMNPRSWXY AEI I E HIO AIO HMNPST EOU IEO A A ";for(;_++^26;)for(;*++z^32;printf("%c%c ",_+64,*z));}
Saya telah mengubah pembatas output dari baris baru ke spasi, tetapi jika Anda lebih suka baris baru (satu byte tambahan) ubah string format printf ke"%c%c\n"
C #, 348 byte
Saya sudah mencoba:
Tidak Disatukan:
sumber
Pyth , 140 byte
Cobalah online!
Metode kompresi: Karena tidak ada
Z
di posisi kedua kata apa pun, gunakan alfabet yang disusun ulangbcdfghjklmnpqrstvwxyaeiou
untuk menyandikan validitas masing-masing huruf sebagai huruf kedua untuk setiap huruf pertama (huruf pertama dalam urutan abjad).Ini adalah 25 bit per huruf, atau tepatnya 5 Base-32 digit. Karena sebagian besar konsonan hanya menggunakan huruf vokal sebagai huruf kedua, saya meletakkan huruf vokal di bagian akhir untuk mendapatkan angka 1 digit untuk mereka. Saya yakin secara keseluruhan dapat ditingkatkan dengan analisis lebih lanjut dan penyusunan ulang alfabet, meskipun kemudian definisi alfabet yang disusun ulang akan memakan lebih banyak byte.
Penjelasan
sumber
PHP:
211209204Anda harus mematikan peringatan, jika tidak, orang akan mencetak sehubungan dengan pembuatan implisit dari
$b
Sangat menyenangkan. Upaya awal berada di kisaran 250, tapi ini adalah yang tertipis saya.
sumber
!
pada jika .. Anda membutuhkannya.CJam (99 bytes)
Ini termasuk beberapa karakter khusus, jadi paling aman untuk memberikan hexdump. (Khususnya, karakter dengan nilai
0xa0
, yang sesuai dengan ruang tanpa putus, menyebabkan saya sedikit kesulitan dalam mengatur demo online).Demo online .
Pendekatan ini adalah pengkodean perbedaan pada basis-26.
sumber
65f+:c
dengan'Af+
.md
ini adalah peningkatan yang brilian, tetapi saya tidak menyadari seberapa dekat jawaban saya dengan jawaban Anda.CJam,
10098 byte(permalink)
Ini adalah entri CJam pertama saya, jadi mungkin ada potensi untuk bermain golf lagi. Namun, saya menemukan cara untuk mengompres daftar karakter hingga 63 byte yang, semoga, orang lain akan menemukan bermanfaat.
Metode Kompresi
Sejauh ini sebagian besar metode yang saya lihat menyandikan kedua huruf dari setiap kata. Namun, ketika kita meletakkan kata-kata dalam urutan abjad, huruf pertama tidak terlalu sering berubah, jadi sepertinya sia-sia untuk menyandikannya secara eksplisit.
Saya menyandikan hanya karakter terakhir dari setiap kata, dan memasukkan item khusus setiap kali karakter pertama bertambah. Karakter dikodekan sebagai karakter pertama, lalu daftar perbedaan. Karena tidak ada kata-kata rangkap, perbedaannya semua harus setidaknya
1
. Jadi saya bisa gunakan0
sebagai item pemisah. (Perhatikan bahwa saya kemudian harus menyimpan huruf pertama dari setiap urutan sebagai satu-diindeks, jika tidak akan ada kebingungan antara 'karakter rollover pertama0
' dan 'mulai dengan A0
'.)Karena perbedaan dalam hal ini tidak pernah lebih besar dari 15, kita dapat menggunakan basis-16 dan mengemas dua (4-bit) item ke dalam masing-masing (8-bit) byte. (Dalam kode aktual saya mengkonversi dari base-260 bukannya base-256 untuk menghindari masalah dengan karakter yang tidak patut dicetak.)
sumber
G
danN
, yang mendorong 16 dan linefeed.%-3<
dengan/;;
atau bahkan/&
. (Opsi kedua akan menghasilkan pesan kesalahan. Konsensus tentang meta adalah tidak apa-apa untuk melakukan ini.)brainfuck , 1371 byte
Cukup golf, tapi saya tidak berusaha terlalu keras ke dalamnya.
Cobalah online!
sumber
Zsh, 175 byte
Solusi ini menggunakan string 125-char, di mana huruf kecil berfungsi sebagai pembatas dan huruf pertama dari urutan huruf kapital berikut.
Kami beralih pada surat-surat dari
$L
. Jika huruf saat ini$X
adalah huruf kecil dengan perbandingan ascii, setel$W
ke$X
. Jika tidak, cetak$W
digabungkan dengan$X
untuk membuat kata saat ini.Cobalah secara Online!
Edit: ditambahkan
:l
ke set huruf kecil secara konsisten, sesuai kebutuhanEdit2: -4 byte menggunakan
$X
variabel dan disederhanakan jika[[..]]
kondisiEdit3: -4 byte dengan menghapus tanda kutip (
"
)Edit5: -5 byte menggunakan konversi array, bukan iterasi
L
per bawahEdit4: pendekatan alternatif untuk 182 byte , mengeksploitasi string reversibel dalam 33 huruf pertama,
$L
hanya 107 hurufsumber
Stax , 91 byte
Jalankan dan debug itu
Satu-satunya trik rapi yang digunakan jawaban ini adalah menggunakan token "," untuk menunjukkan perubahan pada huruf pertama, daripada menyimpannya untuk setiap kata.
Berkat rekursif untuk gagasan menggunakan operator m
sumber
M
alih-alih1/
, dan gunakan peta stenom
alih-alih foreach dan cetak eksplisit{ ... PF
. Yang satu ini paket ke 89.Python 3, 224 byte
Menggunakan bit mask panjang variabel untuk menyandikan huruf kedua mana yang ada untuk setiap huruf pertama yang mungkin. Topeng bit bisa panjang 0,1,3,7,15 atau 31 bit. Bit dipetakan ke huruf dengan
for d in 'AOIEHMUSTMNDFPYBCGJKLQRVWXZ':
, bit sebelumnya digunakan untuk huruf yang lebih umum sehingga topeng bit bisa pendek dalam kebanyakan kasus (biasanya 3 atau 7 bit karena sebagian besar konsonan hanya diikuti oleh salah satu dari 5 vokal atau YM atau H). Sayangnya kode untuk memecahkan kode itu meniadakan penghematan dibandingkan dengan metode yang lebih sederhana (daftar aslinya hanya 303 byte).sumber
Haskell, 192 byte
Untuk setiap kata yang dipisahkan spasi dalam string, letakkan huruf pertama di depan semua huruf lain dan tambahkan spasi, misalnya
SHIO
->SH SI SO
.sumber
Java, 334 byte
Diformat:
Secara terpisah, saya menyandikan daftar kata menjadi panjang 26x26 = 676 BitSet, mengubahnya menjadi array byte, dan akhirnya ke Basis 64. String itu adalah kode keras dalam program ini, dan prosedur sebaliknya digunakan untuk mereproduksi BitSet, dan akhirnya mencetak daftar kata-kata
sumber
Java, 356 byte
Gunakan generator angka acak untuk mendapatkan kata-kata:
Tidak Disatukan:
Anda dapat mencobanya di sini: http://ideone.com/Qni32q
sumber
Perl, 248 byte
Pertama kali menggunakan perl (dan golf pertama kali), jadi pasti ada ruang untuk perbaikan. Memfaktorkan vokal dan mengelompokkan huruf-huruf yang tersisa berdasarkan bagaimana kata yang dihasilkan dibuat - menambahkan vokal pertama, terakhir, atau keduanya vokal pertama dan terakhir membuat kata dalam daftar.
sumber
"MM "."MY "."BY "."HM "."SH "
bisa disingkat"MM MY BY HM SH"
.Javascript (ES6), 214
Mungkin bukan cara terpendek untuk melakukannya, tetapi pasti menarik.
Putar setiap huruf dalam string pertama, tambahkan ke setiap huruf pada baris yang sesuai dari yang kedua. Ini mengembalikan kata-kata dalam urutan surat terakhir mereka, seperti:
Saran diterima!
sumber
Java,
255254 byteMenemukan cara untuk memeras satu byte lagi dari itu.
Atau (meskipun tidak jauh lebih jelas):
sumber
'A'
menjadi65
.Haskell,
333308298 byteHanya untuk bersenang-senang!
Mengevaluasi
s
akan mencetak semua kata dalam urutan yang aneh - Saya menggunakan fakta bahwa sebagian besar kombinasi adalah vokal-konsonan atau sebaliknya, mungkin dapat lebih mengoptimalkan dengan karakter "kelas" kustom, memperpendek matriks yang dikodekan (di sini,w
dank
).Apakah ada yang tahu cara yang lebih pendek untuk mencetak string tanpa tanda kutip dan tanda kurung dari pada yang monadik? Tipe kelas bahkan lebih lama sejauh yang saya tahu.
Selain itu, mungkin juga ada cara yang lebih pendek untuk melakukan
p
pekerjaan ...sumber
sequence_
sama denganvoid$sequence
? Maka Anda dapat menghilangkan jugaimport
.void
harus diimpor. Bagaimanapun, aku harus ingat ini.sequence_$map putStrLn
sekarangmapM_ putStrLn
. Ganti(
,)
mainkanconcat$...
dengan yang lain$
.05AB1E , 143 byte (Tidak bersaing)
Cobalah online!
sumber
PHP, 170 byte
pendekatan terpendek yang bisa saya temukan sejauh ini ...
kerusakan
Catatan Versi pemetaan bit tersingkat dengan biaya ascii yang dapat dicetak menghabiskan biaya 190 byte (113 data byte + 77 byte decoding) menggunakan 6 bit = base 64, 174 byte (97 data, 77 decoding) menggunakan 7 bit (base 128); mungkin beberapa lagi untuk melarikan diri.
Basis 224 (menggunakan ascii 32..255) membutuhkan 87 byte data (+ melarikan diri); tapi saya kira decoding akan dikenakan biaya lebih dari 10 byte tambahan.
Tidak termasuk C dan V dari peta akan menghemat 16/14/13 byte pada data tetapi membutuhkan banyak biaya dalam decoding.
sumber