Latar Belakang
Berdasarkan permainan, anak saya yang berumur empat tahun dapatkan dari rabinya.
"Tujuan" adalah untuk "menemukan" surat-surat dalam urutan tertentu, misalnya aecdb
. Anda diberi setumpuk kartu surat, mis daceb
. Anda hanya dapat mencari melalui tumpukan dalam urutan yang diberikan, meskipun secara siklis. Ketika Anda memenuhi surat yang Anda butuhkan, Anda mengeluarkannya dari tumpukan.
Objektif
Diberi perintah dan tumpukan (permutasi duplikat bebas satu sama lain), temukan urutan huruf tumpukan teratas (semuanya dapat dicetak ASCII) yang Anda lihat saat bermain game.
Contoh langkah demi langkah
Kami perlu menemukan pesanan aecdb
, mengingat tumpukan daceb
:
Atas tumpukan d
: Tidak apa yang kita cari ( a
), jadi kami menambahkannya ke urutan: d
dan memutar untuk mendapatkan stack: acebd
.
Top of stack a
: Ya! jadi kami menambahkannya ke urutan: da
dan menghapusnya dari stack: cebd
.
Atas tumpukan c
: Tidak apa yang kita cari ( e
), jadi kami menambahkannya ke urutan: dac
dan memutar untuk mendapatkan stack: ebdc
.
Top of stack e
: Ya! jadi kami menambahkannya ke urutan: dace
dan menghapusnya dari stack: bdc
.
Atas tumpukan b
: Tidak apa yang kita cari ( c
), jadi kami menambahkannya ke urutan: daceb
dan memutar untuk mendapatkan stack: dcb
.
Atas tumpukan d
: Tidak apa yang kita cari ( c
), jadi kami menambahkannya ke urutan: dacebd
dan memutar untuk mendapatkan stack: cbd
.
Top of stack c
: Ya! jadi kami menambahkannya ke urutan: dacebdc
dan menghapusnya dari stack: bd
.
Atas tumpukan b
: Tidak apa yang kita cari ( d
), jadi kami menambahkannya ke urutan: dacebdcb
dan memutar untuk mendapatkan stack: db
.
Top of stack d
: Ya! jadi kami menambahkannya ke urutan: dacebdcbd
dan menghapusnya dari stack: b
.
Top of stack b
: Ya! jadi kami menambahkannya ke urutan: dacebdcbdb
dan menghapusnya dari stack: .
Dan kita selesai. Hasilnya adalah dacebdcbdb
.
Implementasi referensi
def letters(target, stack):
string = ''
while stack:
string += stack[0]
if stack[0] == target[0]:
stack.pop(0)
target = target[1:]
else:
stack.append(stack.pop(0))
return string
print letters('aecdb', list('daceb'))
Uji kasus
try
, yrt
→yrtyry
1234
, 4321
→4321432434
ABCDEFGHIJKLMNOPQRSTUVWXYZ
, RUAHYKCLQZXEMPBWGDIOTVJNSF
→RUAHYKCLQZXEMPBWGDIOTVJNSFRUHYKCLQZXEMPWGDIOTVJNSFRUHYKLQZXEMPWGIOTVJNSFRUHYKLQZXMPWGIOTVJNSRUHYKLQZXMPWIOTVJNSRUYKLQZXMPWOTVNSRUYQZXPWOTVSRUYQZXPWTVSRUYQZXWTVSRUYZXWTVSUYZXWTVUYZXWVYZXWYZXYZ
?
, ?
→?
a
, a
→a a
abcd
, abcd
→abcd
99
khusus?APL (Dyalog Classic) , 21 byte
Cobalah online!
Ini setara dengan kereta api
{∊⍵,(⊂⍵)~¨(,\⍺⊂⍨1,2>/⍺⍋⍵)}
⍋
memberikan permutasi argumen kanan⍵
dalam argumen kiri⍺
1,2>/
bandingkan pasangan berturut-turut dengan>
dan tambahkan 1⍺⊂⍨
gunakan topeng boolean di atas untuk dipecah⍺
menjadi beberapa kelompok; 1s di mask menandai awal grup baru,\
gabungan kelompok secara kumulatif(⊂⍵)~¨
melengkapi masing-masing sehubungan dengan⍵
⍵,
lebih dulu⍵
∊
ratakan sebagai string tunggalsumber
Batch, 155 byte
Mengambil target dan menumpuk sebagai input pada STDIN.
sumber
JavaScript (ES6), 54 byte
Mengambil target sebagai string dan tumpukan sebagai array karakter. Mengembalikan string.
Uji kasus
Tampilkan cuplikan kode
Bagaimana?
Pada setiap iterasi, kami mengekstrak karakter
c
di bagian atas tumpukan dan menambahkannya ke hasil akhir. Kami kemudian melakukan panggilan rekursif yang parameternya bergantung pada hasilc == t[0]
, di manat[0]
karakter yang diharapkan berikutnya.Jika
c
cocokt[0]
:c
dari string target dengan melewatit.slice(1)
c
dari tumpukan dengan melewatis
tidak berubahJika
c
tidak cocokt[0]
:t.slice(0)
c
kembali di ujung tumpukansumber
Python 2 , 73 byte
Cobalah online!
Saya menduga ini sangat golf.
sumber
Python 2 , 65 byte
Cobalah online!
sumber
Haskell ,
4946 byteCobalah online!
Cukup sederhana. Argumen kiri adalah "tujuan" dan kanan adalah tumpukan. Jika kepala sasaran cocok dengan bagian atas tumpukan, kami akan menambahkannya di awal, dan berulang dengan sisa tujuan dan tumpukan (tanpa menambahkan kembali item di atas). Jika tidak, kami akan menambahkan item teratas dan berulang dengan tujuan yang sama, membaca item teratas hingga akhir tumpukan. Ketika tujuan kosong, pencocokan pola memilih baris kedua dan daftar kosong dikembalikan.
EDIT: -3 byte terima kasih kepada @GolfWolf dan @Laikoni!
sumber
Bersih , 85 byte
Cobalah online!
Menentukan
f
pengambilan fungsi parsial[Char]
dan[Char]
, di mana argumen pertama adalah target dan yang kedua adalah tumpukan.sumber
Java 8, 88 byte
Input sebagai
char[]
danjava.util.LinkedList<Character>
(java.util.Queue
implementasi)Penjelasan:
Cobalah online.
sumber
> <> ,
3832 byteEdit: Teal pelican memiliki lebih banyak
><>
pendekatan disini bahwa swap metode masukanCobalah online!
Mengambil urutan huruf melalui
-s
bendera, dan tumpukan melalui input.Bagaimana itu bekerja:
sumber
Perl 5 , 42 + 2 (
-pl
) = 44bytesCobalah online!
sumber
> <> ,
2116 byteCobalah online!
Flow diubah untuk memanfaatkan ruang kosong dan menghapus rerouting kode tambahan. (-5 byte) - Terima kasih kepada @ JoKing
> <> , 21 byte
Cobalah online!
Jawaban lain> <> dapat ditemukan di sini.
Penjelasan
Tumpukan dimulai dengan set karakter awal menggunakan flag -s. Input adalah urutan karakter yang diberikan pengguna. Penjelasan ini akan mengikuti alur kode.
sumber
Perl, 62 byte
Mengambil argumen pertama, urutan, sebagai daftar karakter dan yang kedua, tumpukan, sebagai string.
Tidak Disatukan:
Anda pernah bertanya-tanya untuk apa semua variabel regex yang tidak jelas itu? Jelas, mereka dirancang untuk tantangan yang tepat ini. Kami cocok dengan karakter saat ini
$x
(yang sayangnya harus melarikan diri kalau-kalau itu adalah karakter khusus regex). Ini dengan mudah membagi string menjadi "sebelum pertandingan"$`
, "pertandingan"$&
, dan "setelah pertandingan"$'
. Dalam pencarian siklik, kami melihat dengan jelas setiap karakter sebelum pertandingan dan memasukkannya kembali ke tumpukan. Kami juga melihat karakter saat ini tetapi tidak mengembalikannya. Jadi kami menambahkan "sebelum pertandingan" ke daftar "terlihat"$z
dan menyusun tumpukan dari "setelah pertandingan" diikuti oleh "sebelum pertandingan".sumber
SNOBOL4 (CSNOBOL4) , 98 byte
Cobalah online!
Mencetak setiap huruf pada baris baru. Gunakan versi ini untuk mendapatkan semuanya untuk dicetak pada baris yang sama. Mengambil input sebagai tumpukan, lalu menargetkan, dipisahkan oleh baris baru.
sumber
Perl, 44 byte
Termasuk
+4
untuk-lF
Berikan input seperti pada STDIN sebagai target kemudian susun (ini adalah urutan terbalik dari contoh):
Jika Anda tidak keberatan dengan trailing newline ini
40
berfungsi:sumber