Memutar kata-kata!

34

Memutar kata-kata!

Diberikan string dan bilangan bulat positif. Anda harus memutar senar, maju dan mundur.

Contoh Input / Output

Memasukkan

Programming Puzzles & Code Golf
4

Keluaran

Prog
mmar
ing 
zzuP
les 
oC &
de G
 flo

Memasukkan

Input dapat diambil melalui STDIN, atau argumen fungsi. Input akan terdiri dari string dan integer positif, n . Bilangan bulat akan menentukan panjang setiap garis bengkok.

Tali diputar bolak-balik. Input dari HELLO, WORLD!dan 5 akan terlihat seperti:

HALO DUNIA!

Keluaran

Output akan menjadi teks bengkok. Ini mungkin bukan spasi putih tambahan. Jika panjang string input tidak dapat dibagi menjadi panjang baris, tambahkan spasi hingga baris diisi:

Contoh dari ini:

Memasukkan

Hello, World!
5

Output (Perhatikan spasi putih di bagian paling akhir)

Hello
roW ,
ld!  
Downgoat
sumber
Ini mungkin bukan spasi putih tambahan. Memotong kata kerja?
Adem
Bisakah kita mengembalikan daftar baris?
Adem

Jawaban:

10

Pyth, 19 15

VPc+z*dQQ_W~!ZN

Pra-bantalan string, lalu balikkan satu sama lain garis saat mencetaknya. Padding sama dengan ukuran kotak, tetapi baris terakhir setelah memotong input dibuang.

Coba di sini

FryAmTheEggman
sumber
6

CJam, 19 byte

q~1$S*+/W<{(N@Wf%}h

Contoh input:

5 "Hello, World!"

Penjelasan

q~         e# Input n and the string.
1$S*+      e# Append n spaces to the string.
/W<        e# Split by each n characters, and remove the last chunk.
{          e# While the array of chunks isn't empty:
    (N     e# Extract the first chunk and push a newline.
    @Wf%   e# Reverse every chunk left in the array.
}h
jimmy23013
sumber
5

Snowman 1.0.1 , 91 byte

{vg10vg|sB*#.'aGal'NdE'aaAaL|al!*+#5nS" "'aR'!#aCwR|.aC2aG:0aa|sP"
"sP'NdE|1aA.aNsP"
"sP;aE

Atau semua dalam satu baris (untuk estetika, atau lebih khusus, anti-estetika), dengan biaya 2 byte:

{vg10vg|sB*#.'aGal'NdE'aaAaL|al!*+#5nS" "'aR'!#aCwR|.aC2aG:0aa|sP10wRsP'NdE|1aA.aNsP10wRsP;aE

Ini terlalu pendek, untuk Snowman. (Ini mungkin yang terpendek yang bisa didapat, saya bekerja di golf untuk waktu yang cukup lama.)

Ini memiliki satu peringatan: ia akan keluar dengan kesalahan (tetapi masih menghasilkan output yang benar) 50% dari waktu, ketika baris terakhir tidak terbalik. (Ini karena saya gunakan aguntuk mengelompokkan elemen array dalam kelompok dua sehingga saya dapat membalikkan satu sama lain, tapi saya tidak memeriksa apakah elemen terakhir memiliki kedua elemen yang diharapkan, sehingga akan mencoba mengakses elemen yang tidak ada jika ada jumlah garis ganjil.)

Tidak dikelompokkan / penjelasan:

{vg10vg|sB*#      // get input, convert second string to number and store
.'aG              // split string into groups of n chars
al'NdE'aaAaL      // take out the last element of the array
|al!*+#5nS" "'aR  // subtract its length from 5, repeat that many spaces
'!#aCwR|.aC       // concat spaces to last el. and that back to the array
2aG               // split in groups of 2, so we can reverse every other string
// for each sub-group in the array of groups...
:
    0aa|sP10wRsP         // print the first element as is
    'NdE|1aA.aNsP10wRsP  // print the second element, reversed
;aE
Gagang pintu
sumber
5

Python 2, 60

s,n=input()
d=1
while s:print(s+n*' ')[:n][::d];s=s[n:];d=-d

Mengambil nkarakter pada satu waktu dari dari s, mencetaknya dengan arah dyang bergantian antara 1dan -1. Untuk penspasian pada baris terakhir, sdiisi dengan nspasi di bagian akhir sebelum dicacah, yang hanya memengaruhinya jika memiliki lebih sedikit dari nkarakter yang tersisa.

Solusi rekursif akan menghemat char (59) kecuali bahwa itu meninggalkan baris tambahan, yang tidak diperbolehkan.

f=lambda s,n,d=1:s and(s+n*' ')[:n][::d]+"\n"+f(s[n:],n,-d) 
Tidak
sumber
4

Haskell , 83 75 byte

(id!)
(f![])_=[]
(f!l)n=f(take n$l++cycle" ")++'\n':((f.reverse)!drop n l)n

chunksOfImplementasi sederhana dengan take and drop, menerapkan jumlah genap atau ganjil pada output saat kita berjalan.

Terima kasih kepada @BMO untuk lima byte dan @ ØrjanJohansen selama tiga byte!

Cobalah online!

Angs
sumber
2
Menggunakan cyclemenghemat 5 byte, coba online!
ბიმო
Simpan tiga byte lagi dengan menghapus gdan menukar ndan l: Cobalah online!
Ørjan Johansen
3

Terjebak , 42 41 40 38 Bytes

Ini agak terlalu lama, mungkin akan mencoba bermain golf lebih banyak!

tg;_lu_@%u;-_0G<*' *+0GKE"];2%;Y_Y?p":

Inputnya harus seperti "string"|n.

Penjelasan:

tg                 # Take input, place each item on stack, save the int to variable stack                                        
;_l                # Swap the top two items, duplicate the string and obtain length
u_@%               # Rotate to the left, duplicate, rotate right and take mod
u;-                # Rotate left, swap the top two and subtract from each other
_0G<*              # duplicate this value, check if less than stored int and multiply
' *+               # Push space onto stack n times, append to starting string
0GKE               # Split this string into segments, and enumerate
"];2%;Y_Y?p":      # For each segment, determine if should be reversed, and print
Kade
sumber
2

Haskell, 108 byte

(#)=splitAt
s!n=let(a,t)=n#s;(b,u)=n#t in a:reverse b:(u!n)
s%n=unlines$takeWhile(any(>' '))$(s++cycle" ")!n

Itu agak lama, ya ampun. Ini dia sedang beraksi:

*Main> putStrLn $ "Programming Puzzles & Code Golf" % 4
Prog
mmar
ing
zzuP
les
oC &
de G
 flo
Lynn
sumber
Bagaimana cara mengikat letekspresi bekerja?
xnor
Ini adalah pernyataan dua-dalam-satu letyang dipisahkan oleh tanda titik koma - biasanya Anda akan menggunakan baris baru dan lekukan, tetapi Haskell juga memungkinkan Anda untuk menulis let a=b; c=d in expr.
Lynn
Saya tidak tahu ini diizinkan, mengeluarkan putStrLn dari program!
Leif Willerts
1
@LeifWillerts, baru-baru ini, tantangan di sini cenderung memungkinkan Anda untuk melakukan I / O melalui argumen fungsi / hasil atau stdin / stdout - di sini, solusi saya adalah fungsi (%) :: String -> String -> Stringalih-alih IO ().
Lynn
2

Python 2, 109 byte

Harus menambahkan padding dengan spasi untuk baris terakhir menjadi benar.

Coba di sini

I,c=input()
I+=(c-len(I)%c)*" "
L=[]
i=0
while I:s=I[:c];L+=[[s,s[::-1]][i%2]];i+=1;I=I[c:]
print"\n".join(L)
mbomb007
sumber
2

Lua, 91 88 88 84 83 82 byte

Versi lama:

a=arg for i=1,#a[1],a[2]do s=a[1]:sub(i,i+a[2]-1)print(d and s:reverse()or s)d=not d end

Versi baru:

arg[1]:gsub((".?"):rep(arg[2]),function(s)print(d and s:reverse()or s)d=not d end)
Trebuchette
sumber
2

O, 60 byte

z""/rlJ(Q/{n:x;Q({+}dxe{`}{}?p}drQJQ%-{' }dJQ/e{r}{}?Q({o}dp

Program O pertama saya, dan yang lama itu!

Demo langsung.

kirbyfan64sos
sumber
2

Perl, 87 byte

sub f{$_=@_[0].$"x(@_[1]-1);$a.=(($i++&1?reverse$1:$1).$/)while/(.{@_[1]})/g;chop$a;$a}

Versi lama (mencetak baris baru):

sub f{$_=@_[0].$"x(@_[1]-1);print(($i++&1?reverse$1:$1).$/)while/(.{@_[1]})/g}

String dilewatkan sebagai argumen fungsi tanpa baris baru. Panggil seperti ini:

$_=<>;chomp;print f($_,5);
samgak
sumber
2

Mumps, 86 byte

R I,S,! S P=$L(I),$P(I," ",P)=P F Q=1:S:P S F=$E(I,Q,Q+S-1),P='P W $S('P:F,1:$RE(F)),!

Meskipun bisa jadi 2 byte lebih pendek jika Anda menghapus yang pertama ',!' karakter dalam pernyataan R (baca dari STDIN); yang menambahkan carriage return antara input dan output. Jika itu tidak ada, output secara teknis benar, tetapi baris pertama akan muncul ditambahkan ke string input.[[Terminal Mumps standar yang saya gunakan tidak memiliki gema lokal. ]]   Saat duduk, inilah ujiannya:

R I,S,! S P=$L(I),$P(I," ",P)=P F Q=1:S:P S F=$E(I,Q,Q+S-1),P='P W $S('P:F,1:$RE(F)),!
ABCDEFGHIJKLMNOPQRSTUVWXYZ1236
ABCDEF
LKJIHG
MNOPQR
XWVUTS
YZ123 

Perhatikan juga, sebenarnya ada carriage return / Enter penekanan tombol antara '123' dan '6' di akhir input. [[Masalah gema lokal lagi. ]]

Jika ada yang tertarik, saya bisa menjelaskan apa yang terjadi dengan kode; tapi saya sadar tidak ada banyak penggemar Mumps di luar sana ... :-)

pengguna43315
sumber
2

PowerShell, 102 Bytes

param($s,$i)$l=$s.Length;$s+' '*($i%$l)-split"(.{$i})"|?{$_}|%{$r=-not$r;@($_,($_[$l..0]-join''))[$r]}

Diminta sebagai berikut (jika disimpan ke file CodeGolf55051.ps1)

.\CodeGolf55051.ps1 -s '1234567890' -i 4

Usaha Sebelumnya

(lebih panjang atau tidak valid)

PowerShell, 110 Bytes

param($s,$i)$l=$s.Length;$s+' '*(($i-$l%$i)%$i)-split"(.{$i})"|?{$_}|%{$r=-not$r;@($_,($_[$l..0]-join''))[$r]}

PowerShell, 111 Bytes

param($s,$i)$s+' '*(($i-$s.Length%$i)%$i)-split"(.{$i})"|?{$_}|%{$r=-not$r;@($_,($_[$_.length..0]-join''))[$r]}

Penjelasan

param($s,$i)                         #Take input text (s) and column width (i)
$s                                   #take the user entered string
+ ' ' * (($i - $s.Length % $i) % $i) #add the least number of spaces required to make its length divisible by i
-split"(.{$i})"                      #break it into chunks of i characters in length
| ?{$_}                              #skip any blank lines created in the process
| %{                                 #for each line
    $r = -not $r;                    #    toggle a boolean value
    @(                               #    define an array
        $_                           #    index 0 = the string going forwards
        ,($_[$_.length..0] -join '') #    index 1 = the string reversed (by taking each character from the last to the first, then joining them)
    )[$r]                            #    if our boolean value is false take the forward string (index 0), if true take the backwards one (index 1)
}                                    #next

PowerShell, 180 Bytes

param($s,$i)$x="`${0}|{1}|`${2}";$w=$x;1..$i|%{$w=$w-f$_,$x,($i+$_)};$w=$w-replace'\||\${.*}';$r=$w-replace'\$\d+','(.)?';$s+' '*($i-$s.Length%$i)-replace$r,$w-split"(.{$i})"|?{$_}

PowerShell, 196 Bytes

param($s,$i)$x="{0}|{1}|{2}";$w=$x;1..$i|%{$w=$w-f$_,$x,($i+$_)};$w=$w-replace'(\d+)','$$$1'-replace'\||{.*}';$r=$w-replace'\$\d+','(.)?';$s+' '*($i-$s.Length%$i)-replace$r,$w-split"(.{$i})"|?{$_}

Penjelasan

param ($s, $i)                      #Take input text (s) and column width (i)

$x = "{0}|{1}|{2}"                  #Define string format which takes 3 entries and pipe delimits them

$w = $x                             #initialise our replacement regex with this format
1..$i | %{                          #for 1 to the specified column width
    $w = $w -f $_, $x, ($i + $_)    #update the regex 1|{...}|5, 1|2|{...}|6|5, etc
}                                   #resulting in w = 1|2|3|4|{...}|8|7|6|5
$w = $w -replace '(\d+)', '$$$1'    #now prefix the numbers with a dollar (so they're regex replacement variables)
        -replace '\||{.*}'          #and remove the delimiters and superfluous `{...}` left from our middle insertion routine

$r = $w -replace '\$\d+', '(.)?'    #then create the match pattern by replacing the variables with optional single character captures

$s                                  #now take the user entered string
    + ' ' * ($i - $s.Length % $i)   #add the least number of spaces required to make its length divisible by i
    -replace $r, $w                 #perform a replacement using the regex match and replace patterns created above
    -split "(.{$i})"                #then split the string into blocks of length i
    | ?{$_}                         #removing any blank lines created in the process

( {...}dalam komentar di atas sebenarnya {0}|{1}|{2}; saya menempatkan {...}untuk meningkatkan keterbacaan.

Powershell, 120 Bytes (tidak valid)

param($s,$i)$s + ' ' * ($i-$s.Length%$i) -replace '(.{4})?(.)(.)(.)(.)',"`$1`n`$5`$4`$3`$2`n" -split "`n" | ?{$_ -ne ""}
JohnLBevan
sumber
1
Luar biasa untuk melihat PowerShell slinger lain! Awal yang mudah adalah menyingkirkan dang di dekat setiap ruang param($s,$i)$s+' '*($i-$s.Length%$i)-replace'(.{4})?(.)(.)(.)(.)',"`$1`n`$5`$4`$3`$2`n"-split"`n"|?{$_-ne""}yang akan membuat Anda turun ke 108.
AdmBorkBork
Terima kasih @TimmyD; hanya melihat beberapa kesalahan mendasar dengan skrip saya (tidak memenuhi persyaratan / hardcoded hanya berfungsi untuk 4 ... memperbaiki sekarang)
JohnLBevan
Saat menguji, untuk mendapatkan aliran bolak-balik untuk memulai di arah yang benar, saya perlu menukar [$r]indeks akhir dengan [-not$r]... kalau tidak, baris pertama membaca yang sebaliknya (yaitu, kanan-ke-kiri) daripada dalam contoh yang diberikan. Kalau tidak, eksekusi benar-benar apik!
AdmBorkBork
1
Juga, karena kita diberi nomor input npositif, dan kami dijamin bahwa panjang string adalah non-negatif (menurut definisi), itu berarti (($i-$l%$i)%i)setara dengan ($i-$l%$i), menghemat empat karakter.
AdmBorkBork
1
Ups, entah bagaimana saya mengetik itu, maksud saya semula (-$l)%$i. Tidak tahu dari mana asalnya. Menarik, bagaimanapun, itu tidak setara, meskipun seharusnya. Ini tampaknya merupakan kekhasan bagaimana PowerShell (di antara bahasa lain) mengimplementasikan fungsi modulo, yang berbeda dari yang saya (menjadi jurusan matematika) atau yang diharapkan oleh Wolfram-Alpha. Tampaknya, Anda harus tetap menggunakan versi yang lebih panjang. Bukti Referensi ->((y-x%y)%y) ==> ((y%y)-(x%y%y))%y ==> ((0)-(x%y))%y ==> (-x%y)%y ==> (-x)%y
AdmBorkBork
2

Clojure, 83 byte, 87 byte , 79 byte

(fn[n s](map #(apply str(% %2))(cycle[#(or %)reverse])(partition n n(repeat\ )s))))

beberapa koreksi setelah komentar di bawah, terima kasih Ørjan .

Cobalah online!

Clojure tampaknya sering absen dari jawaban kode golf. Ini tentu saja tidak dapat bersaing dalam byte panjang dengan bahasa golf, tapi saya pikir total absennya agak tidak beralasan.

Penjelasan:

  • dalam data, dua argumen berupa angka dan string
  • mulai dengan menjalankan partisi fungsi built-in clojure pada string yang smemotongnya menjadi urutan daftar karakter di mana daftar memiliki panjang n. Potongan terakhir akan diisi dengan spasi memanjang nmenggunakan "koleksi pad" yang dikembalikan dari (repeat " ")mana mengembalikan urutan ruang malas yang tak terbatas
  • kami kemudian memanggil peta dengan tiga argumen:
    • fungsi anonim (yang #(..))
    • urutan malas bergantian yang tak terbatas dari fungsi #(or %)yang berfungsi seperti fungsi identitas dan membalikkan (yaitu [#(or %) reverse #(or %) reverse ...]) yang dikembalikan oleh siklus .
    • urutan malas daftar yang dikembalikan oleh partisi.
  • akhirnya fungsi anonim #(apply ...) :
    • memanggil salah satu identityatau secara reversebergantian pada chunk. Ini dilakukan melalui (% %2)ekspresi yang memanggil fungsi yang dikirim sebagai argumen pertama ke fungsi anonim [yaitu identityatau reverse] menggunakan argumen kedua [yaitu potongan] ke fungsi anonim sebagai argumen untuk panggilan.
    • panggilan (apply str ...)untuk mengubah daftar karakter menjadi string
  • fungsi luar mengembalikan urutan string yang malas

satu trik yang kami gunakan di sini adalah bahwa banyak fungsi clojure seperti mapmengambil jumlah koleksi sewenang-wenang sebagai args, yaitu di (map f coll1 coll2 coll3 ...)mana fungsi f hanya perlu menerima argumen sebanyak ada koleksi. Dalam hal ini kami mengirimkan dalam dua koleksi, koleksi referensi fungsi bergantian dan string chunked.

Matias Bjarland
sumber
1
Ini bagus tetapi tampaknya tidak memiliki spasi yang diperlukan di akhir ld! .
Ørjan Johansen
Anda paling benar. Menambahkan koleksi buku catatan yang harus memperbaiki masalah ini ... dan menghabiskan biaya 8 byte ...
Matias Bjarland
Saya punya pertanyaan tentang aturan golf: jika Anda menggunakan fungsi bawaan yang akan memerlukan impor atau pernyataan serupa (mengharuskan dalam clojure, impor di java, dll), apakah mengimpor bawaan itu harus menjadi bagian dari jumlah byte solusi golf? Saya berasumsi ya, tapi rasanya agak abu-abu.
Matias Bjarland
Ya, impor dihitung.
Ørjan Johansen
Oh, tetapi ada aturan lain yang Anda langgar: Anda tidak dapat mengambil input dalam variabel yang telah ditentukan, Anda perlu membuat solusi baik keseluruhan program atau fungsi. (Menggunakan salah satu fnatau defntidak apa-apa.) Di sisi lain fungsi Anda diperbolehkan untuk hanya mengembalikan hasilnya daripada mencetaknya.
Ørjan Johansen
2

Python 3, 110 108 107 103 byte

def a(s,n):l=len(s)//n+1;s+=' '*(len(s)-l);print('\n'.join([s[x*n:n*x+n][::(-1)**x]for x in range(l)]))

(melihat jawaban lain), dengan rjust :95 93 92 90 byte

def a(s,n):print('\n'.join([s[x*n:n*x+n][::(-1)**x].rjust(n)for x in range(len(s)//n+1)]))
bobrobbob
sumber
Baris terakhir dari output Anda salah. Jalankan di sini. Ini adalah posting pertama yang bagus, dan setelah Anda memperbaikinya saya akan menyarankan beberapa cara untuk mematikan beberapa byte, yang pertama adalah Anda dapat menghapus semua spasi / tab dari jawaban Anda.
mbomb007
haha, kamu benar sekali. memperbaiki ini akan memakan banyak biaya tetapi saya sedang melakukannya. terima kasih
bobrobbob
Juga, Anda mengalahkan jawaban saya beberapa waktu yang lalu: codegolf.stackexchange.com/a/55082/34718
mbomb007
baca tipsnya. terima kasih lagi
bobrobbob
1

PHP, 135 byte

Membawa dua argumen baris perintah seperti yang ditunjukkan pada $argv.

<? foreach($a=str_split($s=$argv[1],$n=$argv[2])as$k=>&$v)$v=$k%2?$v:strrev($v);echo implode("\n",$a).str_repeat(' ',$n-strlen($s)%$n);
rink.attendant.6
sumber
1

CoffeeScript, 131 byte

Ini sepertinya terlalu lama.

f=(s,n,r=l=s.length,i=0,z='')->(t=s[i...i+=n].split '';t=t.reverse()if r=!r;z+=t.join('')+(i<l&&'\n'||' '.repeat n-l%n))while i<l;z
rink.attendant.6
sumber
1

Julia, 104 byte

f(s,n)=(L=length(s);L+=L÷n;j=0;for i=1:n:L-n+1 x=rpad(s,L)[i:i+n-1];println(j%2<1?x:reverse(x));j+=1end)

Tidak Disatukan:

function f(s::String, n::Int)
    L = length(s) + length(s) ÷ n
    j = 0
    for i = 1:n:L-n+1
        x = rpad(s, L)[i:i+n-1]
        println(j % 2 == 0 ? x : reverse(x))
        j += 1
    end
end
Alex A.
sumber
1

Python 3, 101 byte

t,x=eval(input())
print("\n".join([t[c:c+x].ljust(x)[::1-2*(int(c/x)%2)] for c in range(0,len(t),x)]))

Coba di sini

Alexander Nigl
sumber
1

q, 46

{-1@neg[y]$@[a;(&)(til(#)a:y cut x)mod 2;|:];}

.

q){-1@neg[y]$@[a;(&)(til(#)a:y cut x)mod 2;|:];}["Programming Puzzles & Code Golf";4]
Prog
mmar
ing
zzuP
les
oC &
de G
 flo
tmartin
sumber
Ini tidak benar ketika baris terakhir lebih pendek dan tidak diputar, saya ingin memposting perbaikan bug dalam jawaban saya, tetapi saya pikir akan lebih baik jika Anda dapat memperbarui Anda sebagai gantinya: {-1@[l;(&)(til(#)l:y cut x)mod 2;'[neg[y]$;|:]];}(49 byte). Terima kasih atas ilhamnya! :)
hjk
1

Q, 64 56 byte

{c::neg y;-1(til(#)l){$[x mod 2;c$(|:)y;y]}'l:y cut x;}
  • {}adalah fungsi yang harus disebut sebagai {}[x;y].
    • x akan menjadi string.
    • y akan menjadi panjang dari garis yang dihasilkan.

Uji:

{c::neg y;-1(til(#)l){$[x mod 2;c$(|:)y;y]}'l:y cut x;}["Programming Puzzles & Code Golf";4]
Prog
mmar
ing
zzuP
les
oC &
de G
 flo

sunting : Menggunakan fungsi yang lebih pendek seperti yang diilhami oleh jawaban q lainnya oleh @tmartin

hjk
sumber
1

Python 2, 82 75 byte

s,n=input()
k=0
while k<=len(s):print s[k:k+n].ljust(n)[::1-2*(k/n%2)];k+=n

Saya tidak bisa mengomentari @willem tapi saya membuat kodenya lebih kecil.

Coba di sini. Coba di sini

Alexander Nigl
sumber
Hai AlexN, bagus. Saya pikir baris terakhir Anda dalam contoh 'Coba di sini' tidak benar. Itu harus dibenarkan benar. Saya juga menghitung 86 karakter? Lihat entri saya untuk pembaruan.
Willem
Hai willem, Anda benar, saya mengoreksi kode dan menemukan bahwa Anda memiliki kesalahan di milik Anda: ideone.com/GOmMrE Seharusnya ada di sebelah kanan.
Alexander Nigl
1

Perl, 72 byte

perl -p0e's/\n(.*)/$"x($1-$-[0]%$1)/e;s/.{$1}/($i++%2?reverse$&:$&)."\n"/ge;chop'

70 byte, ditambah 2 byte untuk -p0.

Demo:

$ echo -en 'Hello, World!\n5' | perl -p0e's/\n(.*)/$"x($1-$-[0]%$1)/e;s/.{$1}/($i++%2?reverse$&:$&)."\n"/ge;chop'
Hello
roW ,
ld!  $

Perhatikan bahwa input yang dibaca dari STDIN tidak dapat diakhiri dengan baris baru (yang akan menelan biaya 2 byte tambahan).

Penjelasan:

perl -p0e'  # Read from STDIN, splitting on null bytes,
            # and print $_ automatically at the end

    s/
        \n(.*)  # Replace everything after first newline,
                # capturing wrap length in $1...
     /
        $"x($1-$-[0]%$1)  # ...with spaces until the total length of $_ is
                          # a multiple of $1 (i.e. right-pad with spaces)
     /e;

    s/
        .{$1}  # Replace series of $1 contiguous chars...
     /
        ($i++%2?reverse$&:$&)."\n"  # ...alternately with themselves or in
                                    # reverse, with a trailing newline
     /ge;

    chop'  # Remove final newline
IniSuitIsBlackNot
sumber
1

JavaScript ES6, 123 byte

var t=(s,n)=>{for(var d=1,i=0,o='',l=s.length;i<l;i++){o+=d?s[i]:s[i-i%n+n-1-i%n]||' ';if(i%n==n-1){d=!d;o+='\n'}}return o}

Panggil dengan t(input_string, twist_length), yang mengembalikan string output.

DankMemes
sumber
1
Maaf, diposting agak terlalu cepat. Sudah diperbaiki.
DankMemes
0

Ruby, 80

->s,l{s+=' '*(l-s.size%l)
(s.size/l).times{|i|puts [x=s[i*l,l],x.reverse][i%2]}}

Demo online: http://ideone.com/w6o8PI

Cristian Lupascu
sumber
0

Coffeescript, 151 byte

f=(s,n)->r="";d=n;i=0;_="\n";u=" ";l=s.length;(d--and(r+=s[i]or u;++i)or(r+=_;r+=s[c]or u for c in[i+n-1..i];i+=d=n;r+=_ if i<l))while i<(l/n+1>>0)*n;r

Terlalu banyak = (

Ignacio Lago
sumber
0

Bash, 83 74

for((i=0;i<${#1};i+=$2));do b=cat;((i/$2%2))&&b=rev;echo ${1:i:$2}|$b;done

Ini bergantian antara catdanrev untuk substring dari argumen pertama dengan panjang argumen kedua.

Variabel khusus yang digunakan meliputi

  • ${#1} (panjang tali) $1 )
  • ((i/$2%2))(Ekspresi aritmatika membagi incrementor $idengan $2dan kemudian mengambil modulo untuk menentukan odd vs even, yang menentukan apakah akan digunakan atau tidak rev)
  • ${1:i:$2}(substring $1mulai dari posisi $idengan panjang $2).
Adam Katz
sumber
Hm, saya melakukan ini terlepas dari bashjawaban yang lain , yang baru saja saya lihat sekarang. Kami secara efektif memiliki logika yang sama. ... sebenarnya jawaban viktorahlström biarkan aku mengurangi 9 karakter lainnya.
Adam Katz
0

JavaScript ES6, 113 byte

Hanya celah saya sendiri pada pertanyaan saya sendiri. Ini akan menambah spasi sehingga dapat dibagi oleh n, dengan cara itu hanya membelah dan membalikkan.

(s,n)=>(s+' '.repeat(n-s.length%n)).match(eval(`/.{1,${n}}/g`)).map((l,i)=>i%2?[...l].reverse().join``:l).join`
`
Downgoat
sumber