Tantangan
Diberikan dua string / array string, output string pertama perlahan menyusut dan berkembang kembali ke string kedua.
Anda dapat mengasumsikan string akan selalu dimulai dengan karakter yang sama.
Contoh
Input:
"Test", "Testing"
Output:
Test
Tes
Te
T
Te
Tes
Test
Testi
Testin
Testing
Pertama, Anda menghasilkan kata pertama:
Test
Kemudian Anda terus menghapus satu huruf hingga string tersebut panjangnya satu karakter:
Tes
Te
T
Kemudian terus tambahkan satu huruf dari kata kedua sampai selesai:
Te
Tes
Test
Testi
Testin
Testing
(Jika kedua string memiliki panjang satu karakter, maka cukup tampilkan satu dari mereka satu kali.)
Uji Kasus
"Hello!", "Hi."
Hello!
Hello
Hell
Hel
He
H
Hi
Hi.
"O", "O"
O
"z", "zz"
z
zz
".vimrc", ".minecraft"
.vimrc
.vimr
.vim
.vi
.v
.
.m
.mi
.min
.mine
.minec
.minecr
.minecra
.minecraf
.minecraft
" ", " "
SSSSS
SSSS
SSS
SS
S
SS
SSS
"0123456789", "02468"
0123456789
012345678
01234567
0123456
012345
01234
0123
012
01
0
02
024
0246
02468
(catatan: pada ruang / test case keempat, ganti S dengan spasi)
Aturan
Ini kode-golf , jadi jawaban tersingkat dalam byte menang! Tiebreaker adalah pos yang paling banyak dipilih. Pemenang akan dipilih pada 09/10/2016.
Celah standar dilarang.
Jawaban:
Pyth, 9 byte
Sebuah program yang mengambil string kedua, dan kemudian string pertama, seperti string yang dikutip pada STDIN dan mencetak hasilnya.
Cobalah online
Bagaimana itu bekerja
sumber
V , 14 byte
Cobalah online!
Penjelasan:
Sekarang, buffer terlihat seperti ini:
Kita hanya perlu melakukan hal yang sama secara terbalik untuk baris berikutnya:
Solusi alternatif yang lebih menarik :
sumber
Python, 93 byte
Mulai dengan string kosong
r
, tambaha
dan baris baru dan hapus karakter terakhir daria
sampaia
kosong kemudian tambahkan bagian yang diperlukan darib
dan baris baru dengan menyimpan penghitungi
,, yang dimulai pada2
sampai panjangb
terlampaui, kemudian kembalir
. Memiliki baris baru.Semua tes ada di ideone
sumber
r=""
. Sederhanar
masih akan bekerja.f=
. 2. Tanpar=''
hadiahf('test','testing')
tidak akan berhasil; yaf('test','testing','')
mau, tapi kita harus mengikuti spesifikasinya.05AB1E , 9 byte
Penjelasan
Cobalah online!
sumber
Retina,
504126 byteTerima kasih kepada Martin Ender untuk menghemat 15 (!) Byte.
Mengambil input dengan dua string yang dipisahkan oleh baris baru:
Cobalah online!
Penjelasan
Baris pertama menghasilkan "langkah" dari kedua kata:
M
adalah untuk mode kecocokan,&
mempertimbangkan kecocokan yang tumpang tindih, dan!
mencetak kecocokan alih-alih jumlahnya. Alasannya terbalik adalah opsir
ight-to-left: mesin mulai mencari kecocokan di akhir tali dan terus menuju awal.Ini mendapatkan semuanya dalam urutan yang benar: ini
O
cocok dengan semua kecocokan dari regex berikutnya: Karakter pada barisnya sendiri dan setiap karakter (termasuk baris baru) setelahnya, yang cocok dengan seluruh babak kedua sebagai satu potongan, atau sebaris karakter , yang cocok dengan setiap baris individu. Pencocokan ini kemudian disortir berdasarkan titik kode, sehingga T diikuti oleh baris yang pertama, diikuti oleh garis, naik menurut panjangnya.Sekarang kita hanya memiliki baris karakter pertama di atas sehingga kita menggunakan
A
mode ntigrep untuk membuang pertandingan pertama dari regex default.+
.Versi lama
Coba versi ini secara daring!
Penjelasan
Baris pertama sama, jadi lihat penjelasannya di atas.
Ini membalikkan baris bagian pertama (kata input kedua). Ini sebenarnya
O
baris, dan regex membatasi pertandingan: itu harus menjadi garis dua atau lebih karakter (..+
) diikuti oleh baris baru (¶
) yang dimulai di mana yang terakhir tinggalkan (\G
). Pada contoh di atas, singleT
di tengah tidak cocok, jadi tidak ada hasilnya.Sekarang kita memiliki dua komponen yang benar, tetapi dalam urutan yang salah.
¶.¶
cocok dengan satu-satunya T di tengah, yang tidak kita butuhkan tetapi memisahkan dua bagian. Keduanya(.*)
menangkap semuanya sebelum dan sesudah, termasuk baris baru berkats
mode ingle-line. Dua tangkapan diganti dalam urutan yang benar dengan baris baru di antaranya.Sekarang kita sudah selesai, kecuali string input panjangnya satu karakter, dalam hal ini input tidak berubah. Untuk menghilangkan duplikat, kami mengganti
¶.$
(ketika baris terakhir dari string karakter tunggal) dengan apa-apa.sumber
Python 2,
8882 byteMengambil dua input, masing-masing dikelilingi oleh tanda kutip.
Terima kasih @JonathanAllan untuk menyimpan beberapa byte dan menunjukkan bug.
sumber
len(x)
masukx=x[:len(x)-1]
karena mengiris mengimbangi negatif bekerja - Anda hanya dapat menulisx=x[:-1]
. Satu-satunya masalah adalah kode Anda tidak akan menangani" ", " "
test case dengan sangat baik.input()
dan menggunakan format input seperti"<str1>", "<str2>"
for i in range(x):print x[-i:]
, dan baris keempat menjadifor i in range(1,y):print y[:-i]
. Tapi tidak yakin itu akan berhasil.Perl,
3428 byteTermasuk
+2
untuk-0n
Jalankan dengan string pada baris terpisah di STDIN:
slow.pl
:Biarkan regex mundur melakukan pekerjaan ...
sumber
Cheddar , 76 byte
Sedikit lebih lama dari yang saya sukai. Saya akan segera menambahkan penjelasan
Cobalah online!
sumber
|>
harus dilakukanBrachylog , 32 byte
Cobalah online!
Penjelasan
Brachylog tidak memiliki awalan built-in, oleh karena itu kami akan mendapatkan awalan dengan menggunakan
concatenate
(Lihat predikat 2): awalanS
adalahP
jikaP
digabungkan denganQ
(apa pun itu) menghasilkanS
.Predikat utama:
Predikat 1:
Predikat 2:
sumber
Javascript,
10381 byteContoh:
f("Test", "Testing")
Keluaran:
Jawaban asli
sumber
Java,
188179 byteMemperbarui
Tidak Terkumpul :
Penggunaan :
sumber
Haskell,
545347 byteContoh penggunaan:
((.reverse.t).(++).init.t) "Hello" "Hi!"
->["Hello","Hell","Hel","He","H","Hi","Hi!"]
.Beberapa sihir pointfree. Ini sama dengan di
f x y = (init(t x))++reverse (t y)
manat
membuat daftar semua substring awal mist "HI!"
- -["H","HI","HI!"]
.sumber
t=reverse.tail.inits
,?inits
perluimport Data.List
.Pyke, 14 byte
Coba di sini!
Dan 17 byte hanya karena ini solusi yang luar biasa:
Coba di sini!
sumber
GNU sed,
5745 + 2 (rn flags) = 47 byteMenjalankan:
Input harus berupa dua string yang dipisahkan oleh baris baru. Kode dijalankan oleh sed untuk setiap baris.
Loop
:
menghapus satu karakter dari ujung string secara iteratif. Output yang berhubungan dengan string pertama dicetak langsung, kecuali karakter pertama:1{/../p}
. Output untuk string kedua disimpan dalam ruang tunggu dalam urutan terbalik (2G;2h
) selama penghapusan dan dicetak di akhir.sumber
C (gcc) ,
102979593 byteCobalah online!
Loop pertama menimpa string dengan 0 byte mulai dari akhir, dan digunakan
puts()
untuk mencetak string. Loop kedua tidak bisa hanya menimpa dari awal, ia harus menyimpan nilai lama sehingga dapat mengembalikannya; 0 byte hanya berjalan menuju akhir.Terima kasih kepada @homersimpson dan @ceilingcat untuk setiap pengurangan 2 byte!
sumber
n
sebagai int global seperti:n;f(char*a,char*b){n=strlen(a)...
. Dan Anda mungkin bisa melakukann=*a=0
tugas berantai di tubuh for for loop Anda.Python 3, 104 byte
Ah.
Terima kasih kepada @DJMcMayhem untuk bermain golf 21 byte.
Ide itu!
sumber
n='\n'
dan menggunakan n sebagai gantinya'\n'
. Anda bisa melepas 8 lagi jika menggunakan lambda alih-alih mencetak:n='\n';lambda x,y:n.join(x+n+n.join(x[:-i]for i in range(1,len(x)-1))+n+n.join(y[:i]for i in range(1,len(y)+1)))
REPL / Javascript, 109 Bytes
Menggunakan string palsu untuk memotong string asli
Pelanggaran substring dengan angka yang lebih besar untuk menumbuhkan yang kedua, berhenti ketika akan mencetak kata yang sama seperti terakhir kali.
Demo:
sumber
a=>b=>...
dan memanggil fungsi dengan (a) (b)Brainfuck,
3855 byteSunting: termasuk baris baru dalam output
sumber
Dyalog APL ,
2013 byte↑
matrify(⌽,\⍞)
terbalik (⌽
) gabungan kumulatif (,\
) dari input karakter (⍞
),
ditambahkan ke1↓
satu elemen jatuh dari,\⍞
gabungan kumulatif input karakterTryAPL online!
sumber
Racket 193 byte
Pengujian:
sumber
Floroid , 69 byte
Ini awal. Mengambil input dari STDIN.
Testcases
sumber
JavaScript (ES6), 92 byte
The
replace
pernyataan membangun sebuah segitiga string, yang persis apa yang diperlukan untuk paruh kedua output, namun babak pertama perlu dibalik dan duplikat baris-karakter dihapus. Catatan: menampilkan baris baru terkemuka jika string pertama adalah satu karakter. Jika ini tidak diinginkan maka untuk byte tambahan versi ini selalu menampilkan baris tambahan:sumber
C, 142 byte
Menyediakan
f(char* str1, char* str2)
.sumber
TI-Basic, 56 byte
Contoh penggunaan
sumber
Java,
168136 byteProgram tes tidak digabungkan
sumber
(Lambdabot) Haskell - 41 byte
Lebih mudah dibaca, tetapi dua byte lebih panjang:
Keluaran:
sumber
J, 18 byte
Tidak Disatukan:
Ini adalah kereta 7:
Kereta terdalam
[: |. ]\@[
terdiri dari topi[:
di sebelah kiri, jadi kami menerapkan|.
(mundur) ke hasil]\@[
, yaitu]\
(awalan) di atas[
(argumen kiri).Inilah yang terlihat pada
testing, test
input:Ini memberi kita porsi pertama, hampir. 5-kereta di luar itu adalah
([: }: ([: |. ]\@[))
, yang berlaku}:
(betail, hapus elemen terakhir) dengan ungkapan di atas:(Ini karena kami tidak dapat memiliki titik tengah rangkap.)
Bagian luar akhirnya:
Ini terdiri dari
]\@]
(awalan argumen kiri) dan,~
(tambahkan apa ke kiri dengan apa ke kanan), meninggalkan kita dengan hasil yang diinginkan:Uji kasus
sumber
(,~}:@|.)&(]\)
PHP,
117109 bytePHP, 107 byte (tidak bekerja dengan string yang mengandung
0
)sumber
C, 111 byte
Tes tidak serigala
sumber
brainfuck, 162 byte
Coba di sini
Input mengambil dua string yang dipisahkan oleh umpan baris.
Program pertama dengan brianfuck dan kode golf pertama jadi saya yakin ada banyak optimasi yang harus dilakukan. Bersenang-senang melakukannya.
Tidak disatukan
sumber