Pertimbangkan daftar kata yang diurutkan berdasarkan abjad berikut:
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
Semua kata mulai dengan b
, dan 5 pertama mulai dengan bal
. Jika kita hanya melihat 2 kata pertama:
balderdash
ballet
kita bisa menulis:
balderdash
+let
di mana ' '
digunakan di mana kata berbagi karakter awalan dengan kata sebelumnya; kecuali untuk '+'
karakter yang menunjukkan karakter TERAKHIR di mana kata kedua berbagi awalan dengan kata sebelumnya.
Ini adalah semacam visualisasi 'trie' : induknya adalah ' bal
', dan memiliki 2 keturunan: 'derdash'
dan 'let'
.
Dengan daftar yang lebih panjang, seperti:
balderdash
ballet
brooding
kita juga dapat menggunakan karakter pipa '|'
untuk membuatnya lebih jelas di mana awalan bersama berakhir, sebagai berikut:
balderdash
| +let
+rooding
dan pohon yang setara akan memiliki akar 'b'
memiliki dua anak: pohon itu memiliki akar 'al'
dan dan dua anaknya 'derdash'
dan 'let'
; dan 'rooding'
.
Jika kami menerapkan strategi ini ke daftar asli kami,
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
kami mendapatkan output yang terlihat seperti:
balderdash
| +let
| +oonfish
| | +ist
| +t
+rooding
+m
Jika dua kata berurutan dalam daftar tidak memiliki awalan bersama, tidak ada karakter khusus yang diganti; misalnya untuk daftar:
broom
brood
crude
crumb
kami ingin output:
broom
+d
crude
+mb
Memasukkan
Kata-kata dalam input hanya terdiri dari alfanumerik (tanpa spasi atau tanda baca); ini mungkin dalam bentuk daftar string, string tunggal, atau pendekatan masuk akal lainnya, selama Anda menentukan format yang Anda pilih. Tidak ada dua kata berurutan yang akan sama. Daftar ini akan disortir berdasarkan abjad.
Keluaran
Output Anda dapat berisi spasi spasi per baris atau total, tetapi tidak ada spasi putih terkemuka. Daftar string atau yang serupa juga akan diterima.
Ini adalah kode-golf ; kode terpendek di setiap bahasa tetap memiliki hak untuk menyombongkan diri. Larangan biasa terhadap celah berlaku.
Uji Kasus
Input:
apogee
apology
app
apple
applique
apply
apt
Output:
apogee
|+logy
+p
|+le
| +ique
| +y
+t
Input:
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
donald
donatella
donna
dont
dumb
Output:
balderdash
| +let
| +oonfish
| | +ist
| +t
+rooding
+m
donald
| |+tella
| +na
| +t
+umb
ball
setelahballoon
. Output apa yang harus kita harapkan?+
bawah yang pertamao
, tapi saya tidak menulis tantangan jadi saya tidak yakin.Jawaban:
Retina 0.8.2 ,
5857 byteCobalah online! Tautan mencakup satu test case. Edit: Disimpan 1 byte berkat @FryAmTheEggman menunjukkan bahwa saya diabaikan beralih dari
\b
ke^
dimungkinkan olehm)
. Penjelasan:Aktifkan per-line
^
untuk seluruh program.Untuk setiap kata, cobalah untuk mencocokkan sebanyak mungkin dari awal kata sebelumnya. Ubah kecocokan menjadi spasi, kecuali karakter terakhir, yang menjadi a
+
.Ganti semua ruang secara berulang tepat di atas
+
s atau|
s dengan|
s.sumber
m)
secara khusus untuk dapat melakukan itu, jadi saya kesal karena saya melewatkan sebuah instance.JavaScript (ES6), 128 byte
Mengharapkan dan mengembalikan daftar daftar karakter.
Cobalah online!
Bagaimana?
Spasi dan
+
's dapat dimasukkan dengan berjalan melalui kata pertama ke kata terakhir secara berurutan, tetapi|
' s hanya dapat disisipkan posteriori setelah a+
telah diidentifikasi. Ini dapat dicapai dengan melakukan dua lintasan yang berbeda, tetapi sebaliknya kami menyimpan pointer ke setiap entri yang dimodifikasia[~y]
sehingga nanti dapat diperbarui lagi dalammap()
loop yang sama .Secara teori, solusi yang lebih sederhana adalah berjalan melalui kata-kata dalam urutan terbalik dan membalik output juga pada akhir proses. Tapi ini agak mahal di JS dan saya tidak menemukan cara untuk mendapatkan versi yang lebih pendek dengan metode ini.
sumber
JavaScript (Node.js) ,
125122118117 byteCobalah online!
sumber
Python,
263260 byte- 3 byte terima kasih kepada Jonathan Frech
Kode:
Cobalah secara Online!
Penjelasan:
Solusi ini membangun trie dari kata-kata input dan mem-parsing secara rekursi ke dalam output yang diperlukan. Fungsi a mengambil trie t dan string s dan menambahkan x ke t. Mencoba diimplementasikan sebagai kamus bersarang. Setiap kamus mewakili sebuah simpul dalam trie. Misalnya, kamus yang mewakili trie yang dihasilkan oleh test case pertama terlihat seperti ini:
Fungsi p berulang melalui struktur ini dan menghasilkan representasi string dari trie yang diharapkan oleh tantangan. Fungsi f mengambil banyak string sebagai argumen, menambahkan semuanya ke sebuah trie dengan a, lalu mengembalikan hasil memanggil p pada trie.
sumber
C (gcc) ,
165155 byteMembawa tiga argumen:
char** a
: array kata-kata yang diakhiri nolchar* m
: array panjang setiap kataint n
: jumlah kata dalam arrayCobalah online!
sumber
++i<n&j<m[i]&a[i--]
perilaku tidak terdefinisi? Bisakah saya mengandalkan gcc untuk mengevaluasinya dari kiri ke kanan?Perl 6 ,
149 144142 byteCobalah online!
Saya yakin ini bisa bermain golf lebih, terutama karena saya bukan ahli regex. Ini menggunakan banyak proses yang sama dengan jawaban Neil's Retina .
sumber
Python 2 , 191 byte
Cobalah online!
sumber
Ruby , 118 byte
Cobalah online!
Menerima larik string, menghasilkan output dengan memodifikasi larik input asli di tempat.
Penjelasan
Transformasi string dasar tidak terlalu rumit, tetapi untuk memasukkan pipa vertikal dengan benar, kita perlu beralih dalam urutan terbalik, dan karena
reverse
metode ini cukup bertele-tele, kita akan melakukannya dengan cara yang lebih rumit. Di sini, kami menggunakanmap
hanya untuk menjalankan loop, biarkan kata pertama saja, dan kemudian beralih dari akhir menggunakan indeks negatif:sumber