Pertanyaan ini terinspirasi oleh pertanyaan Kevin Cruijssen .
Sekarang karpet sudah ditata, kami ingin menggulungnya. Tugas Anda adalah menulis program yang mengambil string dan mengembalikan spiral yang dibuat dari string ini (mewakili karpet yang digulung dilihat dari samping).
Prosedur untuk satu langkah menggulung karpet adalah sebagai berikut. Ada contoh untuk menggambarkan apa yang saya maksud. Perhatikan bahwa contoh dimulai dengan karpet yang digulung sebagian untuk pemahaman yang lebih baik:
ac
rpet
- pisahkan "kepala" dari "ekor" karpet: kepala adalah apa yang telah digulung sejauh ini, ekor adalah apa yang masih harus digulung.
Head: ac Tail:
rp et
- Putar kepala 90 °, searah jarum jam.
Rotated head: ra Tail (unchanged):
pc et
- jika lebar kepala baru (di sini
2
) kurang atau sama dengan panjang ekor (di sini2
)- lalu, letakkan di atas ekor
- selain itu, karpet (seperti pada awal langkah) digulung
New carpet: ra
pc
et
Ulangi prosedur ini sebanyak yang diperlukan.
Dua contoh yang menunjukkan semua langkah rolling karpet:
carpet
c
arpet
ac
rpet
ra
pc
et
0123456789
0
123456789
10
23456789
21
30
456789
432
501
6789
Beberapa ketentuan:
- Anda tidak perlu menunjukkan semua langkah perantara, hanya karpet yang digulung (mis. Jika Anda menemukan cara yang tidak berulang untuk menghitung hasilnya, itu sempurna). Juga, Anda tidak perlu mencetak spasi putih terkemuka, dalam contoh di atas, saya hanya menunjukkan mereka untuk menyelaraskan hal-hal.
- Input adalah String, daftar / array char
- Output dicetak ke stdout atau ke file.
- Input bagus: panjangnya minimal 1 karakter, dan paling banyak konstanta cukup kecil sehingga tidak menimbulkan masalah, tetapi Anda tidak dapat menggunakan konstanta itu dalam program Anda; isi string hanya karakter yang bagus ([a-zA-Z0-9]), yang disandikan sesuai keinginan Anda.
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang. Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa yang bukan kode. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'.
- Celah default tidak diperbolehkan.
- Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
- Juga, tambahkan penjelasan untuk jawaban Anda jika menurut Anda diperlukan.
ProgrammingPuzzlesAndCodeGolf
- panjang ekor akhir lebih dari 1 membuat saya tersandung.print
di dalamlambda
.Jawaban:
Arang , 15 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Loop di atas karpet.
Periksa apakah ada sesuatu di atas kursor.
Jika tidak maka gulung karpet.
Bergerak ke kanan dan tampilkan karakter saat ini.
Contoh: Untuk input
0123456789
, tindakan berikut terjadi:0
dicetak.Kursor bergerak ke kanan dan
1
dicetak.Karena tidak ada yang di atas
1
, kanvas diputar.Kursor bergerak ke kanan dan
2
dicetak.Karena tidak ada yang di atas
2
, kanvas diputar.Kursor bergerak ke kanan dan
3
dicetak.Kursor bergerak ke kanan dan
4
dicetak.Karena tidak ada yang di atas
4
, kanvas diputar.Kursor bergerak ke kanan dan
5
dicetak.Kursor bergerak ke kanan dan
6
dicetak.Karena tidak ada yang di atas
6
, kanvas diputar.Kursor bergerak ke kanan dan
7
dicetak.Kursor bergerak ke kanan dan
8
dicetak.Kursor bergerak ke kanan dan
9
dicetak.sumber
⟲
?Pyth, 37 byte
Coba online di sini , atau verifikasi semua uji sekaligus di sini .
sumber
Sekam , 24 byte
Cobalah online!
Penjelasan
sumber
J , 69 byte
-3 byte terima kasih kepada FrownyFrog
Cobalah online!
penjelasan
Algoritma ini mudah meskipun sedikit bertele-tele untuk J.
Strategi Keseluruhan: Kurangi input ke tabel persegi, dengan bagian sisa (mungkin kosong).
Saat kami mengurangi, kami akan menggunakan daftar elemen 2 kotak. "Hasil sejauh ini" kami akan menjadi kotak pertama, dan "barang yang tersisa untuk diproses" akan menjadi kotak ke-2. Kotak pertama akan diinisialisasi ke kepala input (tetapi dikonversi ke tabel):
dan "item yang tersisa untuk diproses" akan menjadi ekor input:
Sekarang kita punya:
di mana 'c' sebenarnya adalah tabel 1x1.
Kami mengurangi itu menggunakan loop J Do ... While:
Di mana bagian dalam tanda kurung adalah kondisi "terus berjalan":
yang mengatakan "terus berjalan sementara panjang kotak kanan lebih besar dari atau sama dengan panjang kotak kiri (yaitu, panjang sisi matriks persegi)
Apa artinya "terus berjalan"? Itu didefinisikan dalam kata kerja di sebelah kiri yang pertama
^:
, yang memberitahu kita bagaimana mengambil hasil saat ini dan menghasilkan iterasi berikutnya. Kata kerja itu adalah:Mari kita jabarkan:
Artinya, ini hanya algoritma yang dijelaskan dalam OP yang diterjemahkan secara harfiah ke J.
Akhirnya kita berurusan dengan (mungkin 0) barang sisa, ekor dari karpet kami:
Ini mengatakan "ambil semua kecuali bagian terakhir dari hasil":
dan menambahkannya ke
,
item terakhir hasil{:@[
dengan item yang tersisa ditambahkan ke item terakhir, ]
sumber
,.
dapat melakukan apa yang dapat1 1$]
dan$
dapat digunakan sebagai{.
.$ can be used as {.
- dapatkah Anda mengklarifikasi?R ,
146132 byteCobalah online!
Menerapkan prosedur menggulung karpet. Mengambil input sebagai daftar karakter dan mencetak ke stdout.
Disimpan 14 byte dengan menemukan cara untuk menggunakan
do-while
lingkaran dan menginisialisasi menggunakanF
.sumber
Jelly , 30 byte
Tampaknya terlalu lama ...
Cobalah online!
Bagaimana?
sumber
05AB1E , 41 byte
Terlalu lama, tapi saya ingin menggunakan Kanvas .. Yang mungkin merupakan pilihan yang buruk sekarang saya sudah selesai dan ternyata selama ini ..
Cobalah online . (Tidak ada test suite, karena sepertinya ada masalah aneh dengan
.Λ
builtin ..)Penjelasan:
Mari saya mulai dengan memberikan penjelasan umum tentang Canvas dan apa yang saya ingin kode saya capai. Informasi lebih rinci dapat ditemukan di tip tambang 05AB1E relevan ini , tetapi untuk tantangan ini saya ingin melakukan hal berikut:
Canvas builtin mengambil tiga parameter:
[2,2,3,3,4,4,5,5,...]
.carpet
adalah0123456789ABCDEFGHI
adalahAdapun kode:
Lihat ini 05AB1E ujung tambang (bagian Cara kompres bilangan bulat besar? ) Untuk memahami mengapa
Ž8O
adalah2064
.sumber
Python 3 , 112 byte
Dalam hal ini, output adalah nilai fungsi.
Cobalah online!
Jika Anda suka, di sini solusi lain (lebih lama, 129 byte ) yang mencetak secara langsung input yang digulung:
Cobalah online!
sumber
MATLAB / Oktaf , 154 byte
Bukan yang terpendek, tetapi untuk golf di MATLAB / Oktaf selalu menyenangkan :)
Cobalah online!
sumber
disp
itu, aku akan mengatakan Anda harus menghapusdisp
untuk membiarkan orang yang tidak tahu R bahwa itu tidak menulis untuk STDOUT secara default