Memasukkan:
Sebuah benang
Keluaran:
1) Pertama-tama kita ambil karakter hapus pada akhir input-string sampai kita dibiarkan dengan panjang yang persegi (yaitu 1, 4, 9, 16, 25, 36, dll.)
Jadi abcdefghijklmnopqrstuvwxyz
(panjang 26) menjadi abcdefghijklmnopqrstuvwxy
( panjang 25).
2) Lalu kita menempatkan ini dalam kotak, satu baris pada satu waktu, dari kiri ke kanan:
abcde
fghij
klmno
pqrst
uvwxy
3) Kami melipatnya di keempat arah, seperti ini (kami terus membuka sampai 'blok' terlipat tidak memiliki karakter dalam untuk dibuka lagi):
m
qrs
l n
ghi
abcde
ihgf jihg
mn lk on lm
srqp tsrq
uvwxy
qrs
l n
ghi
m
Beberapa hal yang perlu diperhatikan, ketika kita melipat ke luar, pada dasarnya kita mencerminkan seperti ini (angka ditambahkan sebagai klarifikasi, yang mewakili 'indeks' dalam contoh ini):
Ketika kami melipat sisi kiri:
123 to: 321 123
fghij ihgf j
Ketika kita melipat sisi kanan:
123 to: 123 321
fghij f jihg
Saat kami melipat ke atas:
3q
2l
1g
b to: b
1g 1
2l 2
3q 3
v v
Ketika kita melipat ke bawah:
b b
1g 1
2l 2
3q 3
v to: v
3q
2l
1g
Aturan tantangan:
- Anda dapat berasumsi bahwa input akan selalu memiliki setidaknya 1 karakter (yang juga akan menjadi output).
- Format output fleksibel, sehingga Anda dapat mencetak ke STDOUT atau STDERR; kembali sebagai string-array / daftar atau karakter 2D-array; string tunggal dengan baris baru; dll.
- Input hanya akan berisi karakter alfanumerik (
a-zA-Z0-9
) - Anda juga dapat menggunakan karakter non-alfanumerik untuk mengisi spasi di dan / atau di sekitar keluaran ASCII-art, seperti titik
.
. - Ruang trailing dan satu garis baru trailing adalah opsional.
- Kami terus membuka sampai blok luar yang terlipat tidak memiliki lagi pusat untuk dibuka.
Aturan umum:
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'. - Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
- Celah default tidak diperbolehkan.
- Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
- Juga, silakan tambahkan penjelasan jika perlu.
Kasus uji:
Input: abcdefghijklmnopqrstuvwxy
Output:
m
qrs
l n
ghi
abcde
ihgf jihg
mn lk on lm
srqp tsrq
uvwxy
qrs
l n
ghi
m
Input: A
Ouput:
A
Input: ThisIsATest
Output:
I
Thi
Is sI
ATe
I
Input: HowAboutAVeryLongExampleWhichIsAlsoAnEvenSquareInsteadOfOddOneAndExceeds64Chars
Output:
An
ch
xamp
i I
o E
quar
steadO
S e
s v
h s
E l
VeryLo
HowAbout
oLyreVA noLyreV
xampl Eg el Examp
hci Is hW As hi Ihc
nAo Ev sl ev so EnA
quare Sn Ie Squar
Odaetsn fOdaets
OddOneAn
steadO
S e
s v
h s
E l
VeryLo
xamp
i I
o E
quar
An
ch
Input: Lenght7
Output:
Le
ng
Input: abc
Output:
a
Jawaban:
SOGL V0.12 , 75 byte
Coba Di Sini!
Ini mengharapkan input pada stack, jadi untuk kemudahan penggunaan saya tambahkan
,
di awal. Itu bisa menimbulkan masalah jika input hanya berisi angka jadi di sini ada test-suite untuk itu.70 byte
√lH»{ā;l⁾:A∫Ba{bIwFIWhFbž;FIbI@ž}};}¹K⁴{ē2\⌡±e{@Κ};⁴┼┼};0E{ē2\⌡№:h++}╚
juga berfungsi, tetapi karena saya baru sekarang menerapkan√
string dan dokumentasi tidak menyebutkan bahwa itu akan mempengaruhi panjangnya saya tidak akan menghitungnya.Penjelasan:
sumber
√
hanya bekerja pada angka. Alasan mengapa saya tidak menghitung versi 75 byte adalah karena saya merasa seperti itu jatuh di bawah celah menambahkan built-in hanya untuk tantanganArang ,
120109 byteCobalah online! Catatan yang
A
telah diubah≔
dan tautannya mencerminkan hal ini. Penjelasan:Menghitung
h = int(sqrt(len(q)))
. (Floor
belum diterapkan ...)Ekstrak
h
irisan panjangh
dari input. (Sebenarnya saya tidak repot memotong irisan memanjangh
.) Saya menggunakanfor
loop daripadaMap
karena saya perluAssign
hasil dariMap
suatu tempat dan ini tidak biasa ketika berurusan dengan aSlice
.Berlangsung terjadi 4 kali, sekali untuk setiap arah (bawah, kanan, atas, kiri sebagai kode). Variabel loop untuk loop ini adalah
i
.Ambil salinan string yang diiris.
Langsung kembali ke asal kanvas sehingga setiap buka dimulai dengan
h
-denganh
kotak di tempat yang sama.Ulangi
(h+1)/2
kali; sekali untuk masing-masing buka, ditambah sekali untuk kotak asli. Variabel loop untuk loop ini adalahk
.Ulangi 4 kali, sekali untuk setiap sisi dari bujur sangkar. (Saya tidak menggunakan variabel loop
l
.)Cetak satu sisi kotak yang tidak dilipat. Karena ini adalah yang
k
terungkap, sisi kotak adalahh-2k
, dan mengambil karakterk
dari tepi kotak asli.Pivot siap mencetak sisi persegi berikutnya.
Putar string yang diiris. (Ya, itu a
ξ
. Saya tidak sering menggunakannya!)Eη
Juga akan berfungsi untuk bagian luarMap
. Rotasi juga memiliki efek samping yang nyaman untuk memotong lebar arrayh
.Setelah mencetak sisi, kursor bergerak dari tepi kotak. Mencetak satu karakter lebih sedikit gagal untuk kotak sisi 1 dan kurang golfy. Setelah sebelumnya diputar, mencetak baris baru dengan mudah memindahkan kursor kembali ke sudut.
Balikkan kotak secara vertikal atau horizontal sesuai kebutuhan.
Hitung perpindahan ke buka berikutnya.
Pindahkan secara horizontal atau vertikal ke buka berikutnya sebagaimana mestinya.
Berikut ini tautan ke versi 97-byte yang diperoleh dengan memanfaatkan semua fitur Arang terbaru termasuk
Floor
: Coba online! Tautan adalah untuk mengucapkan versi kode.sumber