Tujuan:
Diberikan array string, buat versi singkat dari setiap string.
Spesifikasi:
Untuk tantangan ini, singkatan adalah karakter N pertama dari sebuah string. Untuk string abc
: a
,, ab
dan abc
semua singkatan yang valid, sementara bc
, dan ac
tidak.
Diberikan serangkaian string, kami ingin menemukan kumpulan singkatan terpendek, sehingga memberikan input dan singkatan apa pun, Anda bisa menentukan item input mana yang mengacu pada singkatan tersebut.
Contoh:
Memasukkan: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
Kami bekerja melalui string yang dimulai dengan yang pertama.
Monday hanya string item dengan
M
, jadi singkatan yang sesingkat mungkin adalahM
.Selasa dimulai dengan
T
, tetapi begitu juga Kamis. Ini artinya kita mencoba stringTU
. Karena tidak ada string lain yang dimulai dengan itu, kami menggunakanTU
.Rabu adalah
W
, KamisTh
, dan JumatF
.
Lebih banyak contoh:
Input: "one,two,three,four,five,six,seven"
Output: "o,tw,th,fo,fi,si,se"
Input: "red,orange,yellow,green,blue,purple"
Output: "r,o,y,g,b,p"
Input: "a,ab,abc"
Output: Not valid! No abbreviation for `a` that doesn't apply to the other items.
Catatan:
Anda membuat input dan output dengan cara yang masuk akal.
Anda dapat mengasumsikan bahwa input akan selalu berupa array string yang valid.
Anda dapat mengasumsikan bahwa akan selalu ada solusi, tidak seperti pada test case terakhir.
String hanya akan terdiri dari ASCII yang dapat dicetak (atau karakter yang dapat dicetak dalam penyandian Anda)
Ini kode golf, byte paling sedikit menang!
U
untuk hari Selasa, tetapi huruf kecilh
untuk hari Kamis.Jawaban:
Retina , 29 byte
Input dan output adalah daftar string yang dipisahkan oleh linefeed.
Cobalah online! (Test suite dengan pemisahan koma untuk kenyamanan.)
Penjelasan
Ini hanya cocok dengan semua awalan dengan satu regex dan mencetaknya (
!
).m
dans
merupakan pengubah regex yang biasa untuk membuat^
awal.
baris pertandingan dan mencocokkan baris baris.sumber
Python 2 ,
8786 byteCobalah online!
sumber
lambda a:[[b[:i]for i in range(len(b))if sum(s[:i]==b[:i]for s in a)<2][0]for b in a]
untuk 85 bytelen(b)
dengan4**8
menyimpan 2 byte lebih banyak, dengan asumsi string tidak boleh lebih dari 65536 karakterJavaScript (ES6),
81787470 byteMengambil input sebagai array string.
Diformat dan dikomentari
Uji kasus
Tampilkan cuplikan kode
sumber
reduce
.Jelly , 14 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Haskell , 48 byte
Cobalah online!
f
adalah fungsi utama, mengambil daftarString
s dan mengembalikan aString
. Definisinya adalah jalan pintas monadik untukf a=map (a#) a
.a#x
melihat stringx
dan daftara
dan mencoba menemukan awalan terpendekx
yang unik dia
. Jikaa
memiliki elemen tunggal, cukup gunakan string kosong. Jikaa
belum menjadi elemen tunggal, potong karakter pertamax
, filter dan potong elemena
dimulai dengan karakter yang sama, lalu ulangi.sumber
Mathematica, 64 byte
sumber
Jelly ,
1412 byteCobalah online!
Bagaimana itu bekerja
sumber
C ++ 11 (MinGW), 198 byte
Telepon dengan:
Menambahkan
void
identifier sebelum fungsi harus membuatnya dikompilasi pada kompiler lain juga, sehingga menambah panjang 5 byte.sumber
void f...
, itu tidak berfungsi sebaliknya ... + 5 byte, sayangnya. Fungsi, sejauh yang saya tahu, perlu jenisJavascript ES6, 70 karakter
sumber
PHP,
131 120 119118 byteTerima kasih @ Jorg untuk
preg_grep
.mengambil input dari argumen baris perintah; hasil cetak masing-masing satu baris.
Jalankan dengan
-nr
atau coba online .-
.+15 byte untuk diperbaiki: ganti yang kedua
$argv
denganarray_slice($argv,1)
.a&
dengan""<
(+1 byte) untuk memperbaikinya.Masukkan
&($t.=$c)
sebelum&&
dan ganti". preg_quote($t.=$c)."
dengan$t
.kerusakan
versi non-regex,
131130 byteGanti yang pertama dan yang terakhir
a&
dengan""<
(+2 byte) untuk diperbaiki untuk PHP 7.1.kerusakan
catatan sama sekali tidak menarik:
strstr($u,$t)==$u
dan0===strpos($u,$t)
memiliki panjang yang sama dan hasil yang sama.sumber
0x0A
) alih-alih\n
, itu akan menghemat satu byte;).PHP, 127 Bytes
berfungsi tidak dengan array yang tidak valid
PHP, 132 Bytes
Versi Online
151 Bytes mendukung karakter khusus
PHP, 140 Bytes
sumber
preg_quote
Make hanya 10 Bytes lagi0
. Tetapi Anda dapat menyimpan satu byte dengan$i=+$s=""
.count()-count()
barang: input dijamin valid (-21 byte). Saya pikir saya bisa memperbaiki dan golf ini hingga 120 byte.$_GET
itu ide yang bagus!Clojure, 118 byte
Ini berfungsi pada awalan hingga panjang
1e2
tetapi jumlah byte yang sama dapat mendukung hingga1e9
.i
panjang loop awalan,S
adalah urutan panjang substringi
. Yang terakhirfor
menggantikan substring dengannil
yang terjadi lebih sering dari sekali. Pengurangan membuat nilai non-nil pertama untuk setiap string, sayang sekalior
bukan fungsi jadi saya harus membungkusnya.Ini sebenarnya mengembalikan daftar daftar karakter seperti
((\M) (\T \u) (\W) (\T \h) (\F))
, tapi saya kira itu dapat diterima. Clojure cukup verbose dengan string, dansubs
akan melemparStringIndexOutOfBoundsException
tidak sepertitake
.Contoh lengkap:
sumber
SQL (rasa PostgreSQL 9.4), 219 byte
Sekarang untuk jawaban terlama :) Saya tidak berpikir ini bahkan bisa mengalahkan Java. Saya akan mencoba untuk mencukur lebih sedikit dari ini. Berharap untuk menyingkirkan salah satu kueri bersarang, tetapi tidak suka peluang saya.
Ini mengasumsikan bahwa ada tabel yang berisi string untuk dikerjakan. Karena ini adalah SQL, urutan pengembalian tidak dijamin sama dengan urutan tabel dan dalam hal ini tidak mungkin. Jika ini masalah, saya akan hapus.
Penjelasan SQL Fiddle
Kueri terdalam menggunakan
generate_series
danLATERAL
bergabung untuk membuat baris untuk string yang dipisah menjadi panjang yang bertambah, jadi 'satu' menjadi 'o', 'on', 'one'. Jumlah karakter dalam pengembalian juga disimpan.Kemudian kami menambahkan jumlah rekaman yang memiliki hasil yang sama. Misalnya 'f' dari empat dan lima memiliki 2, tetapi 'fo' dan 'fi' masing-masing memiliki satu. The
OVER
pernyataan SQL dapat cukup kuat.COUNT(*)
akan menjadi cara yang biasa, tetapiSUM(1)
memberikan hasil yang sama.Kemudian kami memberi peringkat hasil untuk setiap input berdasarkan pada pengulangan dan karakter yang paling sedikit.
ROW_NUMBER
akan bekerja di sini juga, tetapi lebih lama.Akhirnya kami memilih nomor peringkat terendah untuk setiap kata.
sumber
Bash Murni , 146 byte
Cobalah online!
sumber
APL (Dyalog) , 27 byte
Cobalah online!
{
fungsi anonim, di mana ⍵ mewakili argumen ...∘.(
tabel fungsi tempat fungsi tersebut⊃
elemen pertama dari⍷
daftar Boolean "argumen kiri dimulai di sini dalam argumen yang benar?")
dimana argumen yang benar⍵
arguemts(
dan argumen kiri adalah↑
sebuah tabel dengan baris yang terdiri dari,/
awalan dari¨
setiap⍵
argumen+/
jumlah keseluruhan (menghitung berapa banyak argumen yang diakhiri dengan awalan ini)↓
pisahkan tabel menjadi daftar baris⍳⍨¨
di masing-masing, cari lokasi yang pertama1
satu (yaitu awalan pertama yang hanya memimpin satu argumen)↑¨⍨
untuk setiap lokasi, ambil banyak karakter dari elemen yang sesuai dari⍵
argumen}
akhir fungsi anonimsumber
PowerShell,
151139 byteTertarik jika ada cara yang lebih baik untuk melakukan ini. Harus menggunakan
foreach
(lebih dari a|%
) untuk dapat melakukanbreak
dalam loop bersarang tanpa label.Sunting: 2 golf dari AdmBorkBork
sumber
-notin
bukannya-not$x.contains($a)
dan!($w...
bukan-not($w...
untuk menghemat byte, ya?APL, 26 byte
Penjelasan:
↓↑⍵
: pad setiap string⍵
agar sesuai dengan panjang string terpanjang∘.(
...)⍨
: untuk setiap pasangan string yang mungkin, temukan awalan bersama:≢
: ketimpangan array∧
: dan=
: kesetaraan itemwise∧\
: and-scan (hanya simpan yang terkemuka)+/¨
: jumlah masing-masing vektor dalam tabel, memberikan panjang awalan bersama⌈/
: temukan nilai maksimum di setiap kolom1+
: tambahkan satu, berikan jumlah karakter yang dibutuhkan untuk menjaga setiap string tetap unik⍵↑¨⍨
: ambil banyak karakter dari setiap stringUji:
sumber
Q, 93 byte
Dipecahkan secara rekursif, mengambil string sebagai input, mendapatkan elemen pertama dari setiap string dengan setiap rekursi. Jika salah satu dari elemen-elemen itu tidak unik itu menggantikannya dengan elemen n + 1 pertama.
sumber