Bagaimana string dipelintir
Algoritma memutar sangat sederhana. Setiap kolom digeser ke bawah oleh indeksnya (col 0 bergerak turun 0, col 1 bergerak 1, ...). Pergeseran kolom terbungkus ke atas. Ini berfungsi seperti ini:
aaaa
bbbb
cccc
Menjadi:
a
ba
cba
----
cba
cb
c
Dengan segala sesuatu di bawah garis yang membungkus ke atas. Contoh nyata:
Original:
\\\\\\\\\\\\
............
............
............
Twisted:
\...\...\...
.\...\...\..
..\...\...\.
...\...\...\
Memasukkan
Input adalah array dari string, atau string multi-line. Semua garis memiliki panjang yang sama.
Keluaran
Twisted string, output multi-line ke std-out (atau alternatif terdekat).
Contoh:
( >
menunjukkan input, spasi tambahan penting)
>Hello, world!
>I am another
>string to be
>twisted!
Hwrmoe oo br!
Ieii ,dttr e
s lsna !ohl
ttaltgnw ed
>\\\\\\\\\\\\
>............
>............
>............
\...\...\...
.\...\...\..
..\...\...\.
...\...\...\
>abcdefg
>.......
a.c.e.g
.b.d.f.
>abcdefghij
>..........
>..........
a..d..g..j
.b..e..h..
..c..f..i.
>\\\\.....././
>...../.......
>........././.
>..../.^\\....
\.........../
.\....^..../.
..\../.\../..
...\/...\/...
>cdeab
>deabc
>eabcd
>abcde
cbbbb
ddccc
eeedd
aaaae
>aeimquy37
>bfjnrvz48
>cgkosw159
>dhlptx260
ahknqx147
beloru258
cfipsvy69
dgjmtwz30
>abcdefghi
>jklmnopqr
>stuvwxyz1
>234567890
a3ume7yqi
jb4vnf8zr
skc5wog91
2tld6xph0
Jawaban:
Brachylog , 5 byte
Cobalah online!
Mendapat input sebagai array kolom (yang tampaknya berada dalam spesifikasi pertanyaan).
iᵇ
- Untuk setiap elemen dalam array, pasangkan dengan indeks (berbasis-0)ᵐ
- petakan predikat ini untuk setiap elemen dari hasil:↻₎
- permute (kolom) secara melingkar dengan jumlah yang ditentukan sebagai elemen terakhir (indeks)Mudah diperluas ke versi yang menerima string multiline tunggal:
13 byte
Cobalah online!
sumber
Pyth, 11
Coba di sini
sumber
APL (Dyalog) , 7 byte
Membutuhkan
⎕io←0
Cobalah online!
⍬⍋⍉
mendapatkan rentang dari 0 hingga jumlah kolom⊖
membalikkan⊖⊖⍨⍬⍋⍉
memutar secara vertikal (vertikal) input (terbalik) terbalik dengan0,1..
⊖
membalikkannya, dan mengembalikannya.sumber
Retina ,
1111019287 byteHitungan byte mengasumsikan penyandian ISO 8859-1.
Woo, menyelesaikannya dalam substitusi regex tunggal. :) (Kemungkinannya adalah, ada solusi yang lebih pendek dengan menggunakan beberapa, tapi di mana asyiknya ...)
Cobalah online!
Penjelasan
Ini membutuhkan pengetahuan dasar tentang menyeimbangkan kelompok . Singkatnya, rasa .NET memungkinkan Anda untuk menangkap beberapa kali dengan satu kelompok, mendorong semua tangkapan ke tumpukan. Tumpukan itu juga dapat muncul, yang memungkinkan kita menggunakannya untuk menghitung hal-hal di dalam regex.
Ini mendorong satu tangkapan ke kedua kelompok
1
dan2
untuk setiap karakter di depan pertandingan (di baris saat ini). Artinya, itu menghitung posisi horizontal pertandingan.Sisanya ada di lookahead:
Kami mencocokkan setiap baris dan juga mendorongnya ke grup
1
, sehingga grup1
tersebut sekarang merupakan jumlah posisi horizontal dan vertikal (di mana yang terakhir dihitung dari bawah ). Ini pada dasarnya memberi label diagonal grid dengan nilai yang meningkat mulai dari sudut kiri bawah. Itu.*
kemudian hanya memindahkan kursor mesin ke ujung string.Kami sekarang beralih ke tampilan di belakang, yang dicocokkan dari kanan ke kiri di .NET:
Berulang kali ini akan
H
menangkap dengan tepat dari grup1
(di manaH
ketinggian input) Tujuannya adalah untuk mengambil modulo grupH
. Setelah itu, grup1
berisi baris (dihitung dari bawah) untuk memilih karakter baru di kolom saat ini.Terlihat lagi di belakang, lagi mulai dari kanan.
(?<-1>.+¶)*.+
sekarang menggunakan grup1
untuk menemukan baris dari mana untuk memilih karakter baru dan kemudian lookahead menemukan kolom yang benar menggunakan grup2
.Karakter yang diinginkan ditangkap dalam grup
3
dan ditulis kembali oleh substitusi.sumber
$+
terlihat berguna ... terutama jika Anda hanya ingin melakukan satu substitusi: ^)$+
sebenarnya sangat tidak berguna ... itu deskripsi pada MSDN terdengar jauh lebih berguna daripada karena itu menyiratkan bahwa(a)|(b)
->$+$+
akan menggandakan semuaa
danb
s tetapi malah menghapus semuaa
s, karena itu hanya merujuk pada kelompok terakhir secara sintaksis . Itu berarti itu hanya cara untuk menghindari penghitungan semua grup jika Anda terlalu malas (seperti saya sebelumnya). Untuk bermain golf, ia hanya menghemat byte ketika Anda memiliki lebih dari 9 grup, yang mungkin cukup langka untuk memulainya.Regex.Replace
untuk Retina, tapi saya belum sempat mengimplementasikannya).CJam, 13 byte
Uji di sini.
Penjelasan
sumber
TeaScript, 10 byte
Berkat sintaksis TeaScript 3 yang sangat ringkas, ini sangat singkat: D
Akan lebih pendek 1-byte jika loop Sigma tidak buggy
Cobalah online
Penjelasan
sumber
Python 3, 164 byte
Bukan jawaban terbaik dengan tembakan panjang, tapi yang pertama dengan Python ...
sumber
)
atau]
dalam kebanyakan kasus, misalnya''.join(l)for l in....
benar-benar validMATLAB,
9236 bytesDengan asumsi bahwa string input
s
sudah dalam bentuk array / matriks char 2D, misalnyaPenjelasan: beralih melalui kolom matriks. Untuk setiap kolom lakukan pergeseran melingkar dari elemen-elemennya dengan jumlah karakter yang sama dengan indeks kolom (-1 karena pengindeksan MATLAB).
sumber
Brachylog , 96 byte
Ini mengharapkan daftar string kode karakter sebagai input dan tidak ada output, misalnya
brachylog_main([`aaaa`,`bbbb`,`cccc`],_).
Itu satu jawaban yang sangat panjang, dan mungkin ada cara yang jauh lebih pendek untuk melakukannya.
Penjelasan
sumber
JavaScript,
9289 byteOff 3 byte terima kasih @Neil .
Tampilkan cuplikan kode
sumber
replace
:m.replace(/./g,(n,j)=>z[((l=z.length)*j+i-j)%l][j])
.[...m].map(
semua jalan menuju dan termasuk yang pertama.join
.Python 2, 115 byte
Berkat keajaiban
zip
berhasil turun ke satu baris. Lihat beraksi di sini .sumber
MATL , 18
21byteInput berupa formulir
Cobalah online!
Cara kerjanya :
sumber
F #, 105 byte
Pertama saya menusuknya (hanya a
\n
karakter yang diperlukan):Pemakaian:
sumber
JavaScript (ES6), 73 byte
Penjelasan
Uji
Tampilkan cuplikan kode
sumber
Japt, 29 byte
Uji secara online!
Bagaimana itu bekerja
sumber
Haskell, 81 byte
implementasi ulang contoh CJam, meskipun sebaliknya, peta dan penghitungan adalah bagian dari mapAccumR, snd menghapus akumulator karena kita tidak membutuhkannya lagi, pembalikan hanya efek samping dari lipatan yang tepat.
sumber
Haskell, 65 byte
Contoh penggunaan:
g ["1111","2222","3333"]
->["1321","2132","3213"]
.sumber
MATL , 9 byte
Cobalah online!
Cukup mirip dalam inti dengan jawaban MATL Luis Mendo yang ada , tetapi lebih pendek dengan menggunakan fitur yang mungkin tidak dalam bahasa pada saat itu: 1.
"
iterates melalui kolom matriks secara otomatis sekarang, jadi tidak ada bisnis yang mahal untuk membangun indeks kolom dan mengindeks ke dalamnya ( ini adalah masalah besar), 2.&h
sebagai cara cepat untuk mengatakanN$h
, dan 3. berakhir secara implisit jika]
tidak ditentukan.Bergantian, untuk bytecount yang sama:
Cobalah di MATL Online
sumber
C (dentang) , 114 byte
Bekerja di GCC di bawah MinGW. GCC TIO menjadi bingung dengan menggunakan
strlen
init ekspresi pertama untuk loop.Cobalah online!
sumber