Untuk tantangan ini, Anda harus mengimplementasikan Abbrev
modul Ruby dalam kode sesedikit mungkin.
Tantangan
Input akan berupa apa pun bahasa Anda sebagai array (array, daftar, urutan, dll.) Dari string. Anda dapat menulis suatu fungsi, atau Anda dapat menerima kata-kata yang dipisahkan koma di STDIN.
Anda kemudian harus menghitung set awalan yang tidak ambigu untuk string tersebut. Ini berarti Anda harus mengembalikan hash (atau peta, objek, dll.) Singkatan ke string aslinya.
"Awalan" adalah substring dari string asli yang dimulai pada awal string. Misalnya, "pref" adalah awalan dari kata "prefix."
Sebuah ambigu prefix adalah salah satu yang hanya bisa berarti satu kata. Misalnya, jika input Anda adalah
car,cat
, makaca
bukan awalan yang tidak ambigu karena bisa berarti "mobil" atau "kucing."Pengecualian untuk aturan ini adalah bahwa kata selalu merupakan awalan dari dirinya sendiri. Misalnya, jika Anda memiliki input seperti
car,carpet
,car:car
harus di output Anda.
Anda kemudian dapat mengembalikan hash / map / object / etc. dari fungsi Anda (atau lakukan yang setara dalam bahasa Anda), atau cetak untuk STDOUT
key:value
berpasangan dalam bentukf:foo,fo:foo,...
. (Pasangan nilai kunci juga dapat dipisahkan oleh spasi putih jika membuat kode Anda lebih pendek.)
Uji kasus
Input code,golf,going
Output c:code,co:code,cod:code,code:code,gol:golf,golf:golf,goi:going,goin:going,going:going
Input pie
Output p:pie,pi:pie,pie:pie
Input pie,pier,pierre
Output pie:pie,pier:pier,pierr:pierre,pierre:pierre
Input a,dog
Output a:a,d:dog,do:dog,dog:dog
Aturan
Input tidak akan mengandung elemen duplikat.
Output Anda mungkin dalam urutan apa pun; Anda tidak perlu mengatasinya.
Anda tidak boleh menggunakan
Abbrev
modul / fungsi / hal bawaan seperti Ruby.Ini adalah kode-golf , jadi kode terpendek dalam byte akan menang!
key:value\nkey:value\nkey:value
...?Jawaban:
APL (46)
(Ya, rangkaian aplikasi APL cocok dalam satu byte, dengan ruang yang tersisa.)
Ini adalah fungsi yang mengambil daftar string, dan mengembalikan matriks 2-oleh-N, di mana setiap baris berisi awalan yang tidak ambigu dan kata itu milik:
Penjelasan:
∆←⍵
: simpan argumen yang tepat di∆
.{↑∘⍵¨⍳⍴⍵}¨∆
: untuk setiap elemen∆
, dapatkan awalan yang mungkin dari elemen itu:⍳⍴⍵
: dapatkan daftar dari1
hingga panjang⍵
↑∘⍵¨
: untuk masing-masing angka itu, dapatkan banyak elemen dari⍵
.∪⊃,/
: menyatukan daftar dan mengambil nilai-nilai unik.{
...}¨
: untuk setiap awalan unik:∆/⍨⊃¨⍵∘⍷¨∆
: pilih kata-kata yang dimulai dengan awalan itu(⊂⍵),
: juga melampirkan awalan, dan menyatukan∆/⍨2=⍴∆←
: hanya mengembalikan daftar jika ada dua elemen (awalan dan satu kata yang cocok)↑
: ubah daftar tupel menjadi matrikssumber
Python 2.7 -
146141 bytePerhatikan bahwa lekukan pada baris 4 dan 5 bukan 4 spasi, itu adalah efek samping dari penerjemah markdown SE. Itu karakter tab literal, jadi hanya satu byte.
Secara teknis ini tidak sesuai dengan spesifikasi, tetapi saya akan mengubahnya jika Doorknob mengklarifikasi. Ini menggunakan baris baru, bukan koma untuk memisahkan output. Sebagai contoh:
Baru: Saya dapat menghilangkan 5 karakter dengan menetapkan string yang saya periksa ke variabel
e
. Ini berarti bahwa saya hanya perlu mengetik,e
bukanw[:a]
tiga kali. Ini juga berarti saya menyimpan karakter dengan melakukane=w[:a+1]
dan mengubah...range(1,len(w)+1)
kerange(len(w))
.Penjelasan:
sumber
sum(b.startswith(e) for b in l)
sebagai gantilen(filter(lambda b:b.startswith(e),l))
b.startswith(e)
menjadib.find(e)==0
ataub[:a+1]==e
, dan memeriksa<2
jumlah alih-alih==1
.e=""\n for a in w:\n\te+=a
daripadafor a in range(len(w)):\n\te=w[:a+1]
menghemat 10 karakterJ - 47 char
J melihat string sebagai hanya vektor karakter, yang berarti bahwa ketika mencoba membuat daftar string, ia akhirnya membuat tabel karakter, sehingga ujungnya diisi dengan spasi. Solusi J untuk ini disebut kotak , jadi fungsi ini mengambil sebagai argumen daftar kotak string, sehingga dapat mempertahankan panjang.
Juga, J tidak memiliki tipe hash, jadi yang paling dekat dengan itu adalah tabel dua kolom item, misalnya string kotak, misalnya. Jika itu tidak dapat diterima dan saya harus default ke bentuk nilai kunci, saya dapat memformat ulang output ke formulir ini dalam total 67 karakter :
Penjelasan demi ledakan:
Contoh:
sumber
Haskell
9687Versi tidak disatukan:
Contoh:
Saya menggunakan
inits
fungsi, yang menemukan semua awalan daftar / string. Apakah ini dianggap sebagai kecurangan?sumber
concatMap
dengan(=<<)
, yang ada di Prelude. Menghemat 10 karakter.concatMap
tetapi saya tidak dapat menyimpan lebih dari 9 karakter.>>=\
sebagai leksem tunggal. Maaf tentang itu ...Python 3 (97)
Kami mengulangi awalan setiap kata dalam input, mencetak awalan yang sesuai / pasangan kata jika salah satu muncul tepat sekali atau untuk seluruh kata. Kami memanfaatkan perilaku hubungan arus pendek
or
(danprint
menjadi fungsi) untuk mencetak hanya jika salah satu dari kondisi ini terpenuhi.The
while
Loop berulang kali memotong karakter terakhir untuk membuat prefiks lebih pendek dan lebih pendek, mengakhiri ketika sisa-sisa string kosong. Ini adalah satu-satunya saat kami mengindeks atau mengiris apa pun.Kami menghitung kemunculan awalan
e
dalam input dengan mencari string input yang dipisahkan koma asliS
untuk substring','+e
. Kami menambahkan koma ke string input terlebih dahulu. Penambahan ini menyebabkan elemen string ekstra kosong ketika kitasplit
, tetapi ini tidak berpengaruh karena tidak memiliki substring kosong.Untuk memeriksa kasus ketika substring
e
adalah seluruh kataw
, kami membandingkannya menggunakan operator perbandingan string. Ini membandingkan secara leksikografis, sehingga awalan yang lebih pendek lebih kecil. Perbandingan ganda gagal jika salah satue==w
atauS.count(c+e)<2
.Jika hasil cetak dalam bentuk
e,w
diizinkan, saya akan menyimpan karakter dengan menulise+c+w
sebagai gantinya.Kredit untuk undergroundmonorail dari yang jawabannya saya berdasarkan struktur kode saya secara keseluruhan.
sumber
(e<w)*S.count(c+e)>1
dapat di-golfe<w<w*S.count(c+e)
untuk menghemat 2 karakter.Ruby, 114
Tidak Disatukan:
sumber
k4 (70)
tidak terlalu golf; Saya yakin itu bisa lebih pendek
sangat mirip dengan J impl. di atas, saya pikir - pada dasarnya hanya mengumpulkan semua awalan (yang tepat), menghapus kata-kata dari awalan lagi (untuk menangani kasus
"car"
/"carpet"
), mengelompokkan mereka ke dalam kelas kesetaraan, memilih kelas dengan hanya satu elemen, mengurangi mereka dari daftar ke string, dan menambahkan di peta dari string ke diri mereka sendiri.beberapa kasus uji
perhatikan bahwa dalam
k
/q
, string adalah daftar karakter, jadi string yang hanya berisi satu karakter perlu ditandai seperti itu menggunakan,
fungsi unary ; & mmwrt daftar string yang hanya berisi satu stringPenggunaan ini
q
'sshow
fungsi, yang telah built-in format untuk beberapa struktur data, untuk membuat hasil yang lebih mudah dibaca:sumber
JavaScript - 212
Golf awal.
Memasukkan:
code,golf,going
Keluaran:
["c:code", "co:code", "cod:code", "code:code", "gol:golf", "golf:golf", "goi:going", "goin:going", "going:going"]
sumber
Perl,
9377Dengan baris baru dan lekukan agar mudah dibaca:
Sedikit terlambat dan terlalu lama, tapi saya senang akhirnya sampai di bawah 100. Fungsi mengembalikan daftar yang dapat ditugaskan ke variabel hash:
dan
Sebenarnya, daftar yang dikembalikan belum difilter - konstruksi hash selesai pada saat penugasannya yaitu fungsi luar. JIKA itu tidak cukup bersih / adil, tambahkan 3 untuk menghitung dan memasukkan konten fungsi ke kurung kurawal, tambahkan sebelumnya
+
- lalu fungsi mengembalikan referensi hash 'benar'.sumber
T: 44 Bytes
CATATAN
Bahasa Q memiliki inti dalam bernama internal K4 (digunakan dalam jawaban ini dan jawaban lain sebelumnya untuk pertanyaan ini)
Untuk menguji kode, unduh juru bahasa (kx.com, gratis untuk penggunaan non-komersial, dukungan untuk Windows, Linux, Mac)
Penerjemah mengakui dua sintaks:
verbose (lebih banyak nama yang bisa dibaca, nama berbeda untuk moand dan diad, lebih banyak perpustakaan, ...). Muat file sumber dengan ekstensi q, atau interpreter interaktif
kompak (inti dalam fungsional, operator satu huruf, huruf yang sama untuk keduanya menggunakan monad / diad, ...). Muat file sumber dengan ekstensi k, atau juru bahasa interaktif dalam mode k (tulis \ saat diminta). Kode harus diuji dalam mode ini
Kode mendefinisikan lambda (fungsi anonim). Untuk memberi nama pada fungsi tersebut, kita memerlukan nama awalan: (ex f: {..}), jadi perlu 46 Bytes
UJI
(dengan asumsi fungsi bernama: jika tidak ganti f untuk kode)
mengembalikan kamus (kunci sintaks! nilai). Kunci adalah daftar simbol (`symb`symb ..), dan nilai daftar daftar simbol. Jika kami mengeksekusi sentente di interpreter interaktif, kami memiliki presentasi yang lebih nyaman (setiap kunci dan nilai asosiasi pada baris yang berbeda)
PENJELASAN
x
adalah argumen implisit ke lambda$x
konversi daftar simbol ke daftar string(-1_)\
beralih di setiap elem dari daftar simbol(dibaca sebagai untuk setiap string menghitung awalan (saat makan iterasi menjatuhkan karakter terakhir dari string) (-1_), hingga string kosong)
$
mentransformasikan ke daftar simbol lagi (daftar semua awalan)p:
dan ditugaskan ke hal,/
meruntuhkan semua (menggabungkan dan menciptakan struktur satu tingkat)=
mengklasifikasikan -> untuk setiap awalan unik, mengaitkan kata-kata yang sesuai#:'
menghitung panjang (jumlah kata yang terkait dengan setiap awalan)1=
true jika length = 1 (unambiguous), false sebaliknya&
di mana -> indeks elemen sejatip in\:
menentukan untuk semua awalan jika mereka dalam awalan jelas(..)'
berlaku (..) untuk setiap nilai di sebelah kanan (awalan jelas)?0,&:
-> berbeda 0 disatukan di mana (untuk mengatasi kata-kata sebagai awalan itu sendiri)p@
mengubah indeks menjadi simbolx!..
buat kamus dengan x (kata) sebagai kunci, dan .. sebagai nilaiBaca sebagai:
Buat dan kembalikan kamus dengan kata-kata sebagai kunci, dan nilai-nilai ..
... nilai indeks pada posisi berbeda 0 (semua kata) dan awalan yang tidak ambigu
... tidak ambigu dihitung sebagai awalan yang hanya muncul di satu kata (asosiasi daftar kata untuk setiap simbol memiliki panjang satu)
... daftar yang dihasilkan dari mengklasifikasikan semua simbol unik dengan kata-kata yang sesuai
... awalan dihitung dengan mengulangi karakter terakhir dari setiap kata
sumber
PHP 7.0, 67 byte (mengunggah tantangan)
mengambil input dari argumen baris perintah; mencetak tanda koma; jalankan bersama
-nr
.untuk PHP yang lebih baru , tambahkan satu byte: Ganti
&a
dengan""<
.untuk PHP yang lebih lama, gunakan 70 byte ini:
PHP, 70 byte
sumber
Brachylog , 23 byte
Cobalah online!
Mengambil input sebagai daftar melalui variabel input, dan menghasilkan daftar
[key, value]
pasangan melalui variabel output. Setiap string input yang bukan merupakan awalan dari string input lain akan dihasilkan sebagai awalan dari dirinya sendiri dua kali, meskipun header pada TIO menyembunyikan ini dengan menggunakanᵘ
untuk mendapatkan daftar lengkap sebagai gantinyaᶠ
.sumber
{}ᵘ
, kecuali ada beberapa cara yang lebih pendek untuk mengecualikan bentuk sesuatu menjadi awalan itu sendiri, atau menghasilkan setiap pasangan output yang diperlukan tanpa aturan tambahan∋gj
.Perl 5
-a
, 76 byteCobalah online!
sumber
APL (Dyalog Classic) , 38 byte
terima kasih Erik Outgolfer untuk mengingatkan saya untuk menggunakan pengkodean karakter byte tunggal
Cobalah online!
sumber
Python (127)
Jadi saya tidak bisa mengomentari @undergroundmonorail, tapi saya pikir mengambil pendekatan kamus akan lebih baik? Saya yakin dengan beberapa daftar / kamus pemahaman itu dapat dikurangi dengan sangat baik, tetapi tidak bisa membuatnya bekerja dengan muncul dari dikt.
Hasil cetak akan menampilkan kamus, tidak disusun.
EDIT: Ahh Saya merindukan mobil: mobil / mobil: kriteria karpet. Mungkin cek panjang?
sumber
Groovy - 212 karakter
Golf:
contoh output:
Tidak Disatukan:
sumber
JavaScript (Node.js) , 88 byte
Cobalah online!
sumber
Zsh , 95 byte
Cobalah online!
Satu-satunya cara untuk "mengembalikan" array asosiatif di Bash / Zsh adalah dengan mendeklarasikannya tanpa
local
kata kunci dan kemudian mengaksesnya dalam lingkup induk. Ini akan menghemat satu byte. Namun, I / O via variabel umumnya disukai, jadi kami mencetak definisi array sebagai gantinya.sumber
Ruby , 84 byte
Hanya perhatikan sudah ada solusi Ruby yang ada, oh well. Ini pada dasarnya meningkatkan solusi lama dengan memilih awalan dengan cara yang lebih cerdas (menghilangkan kebutuhan untuk menambahkan setiap kata sebagai "awalan" di akhir) dan menghitung awalan untuk memeriksa keunikan sebelum menambahkannya ke hash, alih-alih menimpa nilai dengan tiruan jika ada duplikat dan kemudian menghapus entri.
Cobalah online!
sumber