Từ vặn vẹo!


34

Từ vặn vẹo!

Cho một chuỗi và một số nguyên dương. Bạn phải xoắn chuỗi, qua lại.

Ví dụ đầu vào / đầu ra

Đầu vào

Programming Puzzles & Code Golf
4

Đầu ra

Prog
mmar
ing 
zzuP
les 
oC &
de G
 flo

Đầu vào

Đầu vào có thể được thực hiện thông qua STDIN hoặc đối số chức năng. Đầu vào sẽ bao gồm một chuỗi và một số nguyên dương, n . Số nguyên sẽ xác định độ dài của mỗi đường xoắn.

Chuỗi được xoắn qua lại. Một đầu vào HELLO, WORLD!và 5 sẽ trông như sau:

CHÀO THẾ GIỚI!

Đầu ra

Đầu ra sẽ là văn bản xoắn. Nó có thể không có bất kỳ khoảng trắng dấu. Nếu độ dài chuỗi đầu vào không chia hết cho độ dài dòng, hãy thêm khoảng trắng cho đến khi dòng được điền:

Một ví dụ về điều này:

Đầu vào

Hello, World!
5

Đầu ra (Lưu ý khoảng trắng ở cuối)

Hello
roW ,
ld!  


Nó có thể không có bất kỳ khoảng trắng dấu. Đánh gôn đi một động từ?
Adám

Chúng tôi có thể trả lại một danh sách các dòng?
Adám

Câu trả lời:


10

Bình thường, 19 15

VPc+z*dQQ_W~!ZN

Pre-pad chuỗi, sau đó đảo ngược dòng khác khi nó in nó. Phần đệm bằng với kích thước của hộp, nhưng dòng cuối cùng sau khi cắt đầu vào bị loại bỏ.

Hãy thử nó ở đây


6

CJam, 19 byte

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

Ví dụ đầu vào:

5 "Hello, World!"

Giải thích

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

5

Người tuyết 1.0.1 , 91 byte

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

Hoặc tất cả trên một dòng (cho tính thẩm mỹ, hoặc cụ thể hơn là chống thẩm mỹ), với chi phí là 2 byte:

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

Đây là cách quá ngắn, đối với Người tuyết. (Tuy nhiên, đây có thể là thời gian ngắn nhất có thể nhận được; Tôi đã làm việc này trong một thời gian khá dài.)

Điều này có một cảnh báo: nó sẽ thoát với một lỗi (nhưng vẫn tạo ra đầu ra chính xác) 50% thời gian, khi dòng cuối cùng là không bị đảo ngược. (Điều này là do tôi sử dụng agđể nhóm các phần tử mảng thành nhóm hai để tôi có thể đảo ngược mọi phần tử khác, nhưng tôi không kiểm tra xem phần tử cuối cùng có cả hai phần tử dự kiến ​​hay không, vì vậy nó sẽ cố gắng truy cập phần tử không tồn tại nếu có một số dòng lẻ.)

Ungolfed / giải thích:

{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

5

Con trăn 2, 60

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

Lấy các nký tự tại một thời điểm từ từ s, in chúng theo hướng dxen kẽ giữa 1-1. Đối với khoảng cách trên dòng cuối cùng, sđược đệm bằngn khoảng trắng ở cuối trước khi nó được cắt nhỏ, điều này chỉ ảnh hưởng đến nó khi nó còn ít hơn các nký tự.

Một giải pháp đệ quy sẽ tiết kiệm một char (59) ngoại trừ việc nó để lại một dòng mới, không được phép.

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

4

Haskell , 83 75 byte

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

chunksOfThực hiện đơn giản với lấy và thả, áp dụng số lần đảo ngược hoặc lẻ cho đầu ra khi chúng ta đi.

Cảm ơn @BMO cho năm byte và @ rjanJohansen cho ba byte!

Hãy thử trực tuyến!


2
Sử dụng cycletiết kiệm 5 byte, hãy thử trực tuyến!
ბიმო

Lưu thêm ba byte bằng cách loại bỏ gvà hoán đổi nl: Hãy thử trực tuyến!
Ørjan Johansen

3

Bị mắc kẹt , 42 41 40 38 byte

Đây là một chút quá dài, có lẽ sẽ cố gắng để chơi golf nhiều hơn!

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

Đầu vào nên như thế nào "string"|n.

Giải trình:

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

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

Đó là loại dài, jeez. Đây là hành động:

*Main> putStrLn $ "Programming Puzzles & Code Golf" % 4
Prog
mmar
ing
zzuP
les
oC &
de G
 flo

Làm thế nào để ràng buộc các letbiểu thức làm việc?
xnor

Đó là một lettuyên bố hai trong một được phân tách bằng dấu chấm phẩy - thông thường bạn sẽ sử dụng các dòng mới và thụt lề, nhưng Haskell cũng cho phép bạn viết let a=b; c=d in expr.
Lynn

Tôi không biết điều này đã được cho phép, đưa putStrLn ra khỏi chương trình!
Leif Willerts

1
@LeifWillerts, gần đây, các thử thách ở đây có xu hướng cho phép bạn thực hiện I / O thông qua các đối số / kết quả của hàm hoặc stdin / stdout - ở đây, giải pháp của tôi là một hàm (%) :: String -> String -> Stringthay vì IO ().
Lynn

2

Python 2, 109 byte

Phải thêm phần đệm với khoảng trắng cho dòng cuối cùng là chính xác.

Hãy thử nó ở đây

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)

2

Lua, 91 88 88 84 83 82 byte

Phiên bản cũ:

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

Phiên bản mới:

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


2

Perl, 87 byte

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

Phiên bản cũ (in một dòng mới):

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

Chuỗi được truyền dưới dạng đối số hàm không có dòng mới. Gọi như thế này:

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

2

Quai bị, 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)),!

Mặc dù nó có thể ngắn hơn 2 byte nếu bạn loại bỏ ',!' Đầu tiên các ký tự trong câu lệnh R (đọc từ STDIN); có thêm lợi nhuận vận chuyển giữa đầu vào và đầu ra. Nếu không có ở đó, đầu ra đúng về mặt kỹ thuật, nhưng dòng đầu tiên sẽ xuất hiện gắn vào chuỗi đầu vào. [[Thiết bị đầu cuối quai chuẩn mà tôi sử dụng không có tiếng vang cục bộ. ]]   Khi nó ngồi, đây là bài kiểm tra:

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 

Cũng lưu ý, thực sự có một sự trở lại vận chuyển / Nhập phím nhấn giữa '123' và '6' ở cuối đầu vào. [[Tiếng vang địa phương một lần nữa. ]]

Nếu bất cứ ai quan tâm tôi có thể mô tả những gì đang xảy ra với mã; nhưng tôi nhận ra rằng không có nhiều người đam mê Quai bị ngoài kia ... :-)


2

PowerShell, 102 byte

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

Được gọi như sau (nếu được lưu vào tệp CodeGolf55051.ps1)

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

Những nỗ lực trước đây

(dài hơn hoặc không hợp lệ)

PowerShell, 110 byte

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

PowerShell, 111 byte

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

Giải trình

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 byte

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 byte

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})"|?{$_}

Giải trình

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

( {...}trong các ý kiến ​​trên là thực sự {0}|{1}|{2}; tôi đặt {...}để cải thiện khả năng đọc.

Powershell, 120 Byte (không hợp lệ)

param($s,$i)$s + ' ' * ($i-$s.Length%$i) -replace '(.{4})?(.)(.)(.)(.)',"`$1`n`$5`$4`$3`$2`n" -split "`n" | ?{$_ -ne ""}

1
Thật tuyệt vời khi thấy một người chơi PowerShell khác! Một khởi đầu dễ dàng là thoát khỏi dang gần mọi không gian param($s,$i)$s+' '*($i-$s.Length%$i)-replace'(.{4})?(.)(.)(.)(.)',"`$1`n`$5`$4`$3`$2`n"-split"`n"|?{$_-ne""}sẽ đưa bạn xuống 108.
admBorkBork

Cảm ơn @TimmyD; chỉ phát hiện ra một vài lỗi cơ bản với tập lệnh của tôi (nó không đáp ứng các yêu cầu / được mã hóa cứng để chỉ hoạt động trong 4 ... sửa ngay bây giờ)
JohnLBevan

Trong khi thử nghiệm, để có được dòng chảy qua lại để bắt đầu theo đúng hướng, tôi cần trao đổi [$r]chỉ số cuối cùng với [-not$r]... khác dòng đầu tiên đọc ngược lại (nghĩa là từ phải sang trái) so với các ví dụ được cung cấp. Nếu không, thực sự khéo léo!
admBorkBork

1
Ngoài ra, vì chúng tôi cho rằng số đầu vào nlà dương và chúng tôi đảm bảo rằng độ dài của chuỗi là không âm (theo định nghĩa), điều đó có nghĩa (($i-$l%$i)%i)là tương đương với ($i-$l%$i), lưu bốn ký tự.
admBorkBork

1
Rất tiếc, tôi bằng cách nào đó đánh máy điều đó, ban đầu tôi có nghĩa là (-$l)%$i. Không biết nó đến từ đâu. Tuy nhiên, điều thú vị là nó không tương đương, mặc dù vậy. Đây rõ ràng là một cách giải thích về cách PowerShell (trong số các ngôn ngữ khác) thực hiện chức năng modulo, khác với cả tôi (là một chuyên gia toán học) hoặc Wolfram-Alpha mong đợi. Rõ ràng, bạn sẽ cần phải gắn bó với phiên bản dài hơn. Bằng chứng tham khảo ->((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))))

Một vài chỉnh sửa sau khi bình luận bên dưới, cảm ơn bạn Ørjan .

Hãy thử trực tuyến!

Clojure dường như thường xuyên vắng mặt trong các câu trả lời golf. Nó chắc chắn không thể cạnh tranh về độ dài byte với các ngôn ngữ chơi gôn, nhưng tôi nghĩ rằng sự vắng mặt hoàn toàn là không có cơ sở.

Giải trình:

  • trong dữ liệu, hai đối số một số và một chuỗi
  • bắt đầu bằng cách chạy phân vùng hàm tích hợp clojure trên chuỗi phân đoạns nó thành một chuỗi các danh sách các ký tự trong đó các danh sách có độ dài n. Đoạn cuối cùng sẽ được đệm với các khoảng trắng theo chiều dài nbằng cách sử dụng "bộ sưu tập pad" được trả về từ (repeat " ")đó trả về một chuỗi các khoảng trắng lười biếng vô hạn
  • sau đó chúng tôi gọi bản đồ với ba đối số:
    • một hàm ẩn danh (the #(..))
    • một chuỗi các hàm lười biếng xen kẽ vô hạn #(or %)có chức năng như hàm nhận dạng đảo ngược (tức là [#(or %) reverse #(or %) reverse ...]) được trả về theo chu kỳ .
    • chuỗi lười biếng của danh sách được trả về bởi phân vùng.
  • cuối cùng hàm ẩn danh #(apply ...) :
    • gọi identityhoặc reversexen kẽ trên một đoạn. Điều này được thực hiện thông qua(% %2) biểu thức gọi hàm được gửi dưới dạng đối số thứ nhất đến hàm ẩn danh [tức là identityhoặc reverse] bằng cách sử dụng đối số thứ hai [tức là chunk] cho hàm ẩn danh làm đối số cho cuộc gọi.
    • cuộc gọi (apply str ...) để chuyển đổi danh sách các ký tự thành một chuỗi
  • hàm ngoài trả về một chuỗi lười biếng

Một mẹo chúng ta sử dụng ở đây là rất nhiều hàm clojure như maplấy số lượng tập hợp tùy ý làm đối số, tức là (map f coll1 coll2 coll3 ...)hàm f chỉ cần chấp nhận nhiều đối số như có các tập hợp. Trong trường hợp này, chúng tôi gửi trong hai bộ sưu tập, một bộ sưu tập các tham chiếu hàm xen kẽ và chuỗi chunked up.


1
Điều này là tốt nhưng dường như không có khoảng trắng cần thiết ở cuối ld! .
Ørjan Johansen

Bạn đúng nhất. Đã thêm bộ sưu tập pad cần khắc phục sự cố ... và tiêu tốn của tôi 8 byte ...
Matias Bjarland

Tôi có một câu hỏi về quy tắc chơi gôn: nếu bạn đang sử dụng hàm dựng sẵn sẽ yêu cầu nhập hoặc câu lệnh tương tự (yêu cầu trong clojure, nhập trong java, v.v.), thì việc nhập khẩu tích hợp đó có phải là một phần của số byte giải pháp chơi golf? Tôi giả sử là có, nhưng nó cảm thấy một chút như một khu vực màu xám.
Matias Bjarland

Có, nhập khẩu được tính.
Ørjan Johansen

Ồ nhưng có một quy tắc khác mà bạn vi phạm: Bạn không thể lấy đầu vào trong các biến được xác định trước, bạn cần thực hiện giải pháp cho cả chương trình hoặc hàm. (Sử dụng một trong hai fnhoặc defnlà tốt.) Mặt trái, chức năng của bạn được phép trả về kết quả thay vì in nó.
Ørjan Johansen

2

APL (Dyalog Unicode) , 19 byte

{↑⊢∘⌽\↓↑⍵⊆⍨⌈⍺÷⍨⍳≢⍵}

Hãy thử trực tuyến!

Lấy ⊢∘⌽\mẹo từ câu trả lời xuất sắc của ngn cho thử thách boustrophedonise .

Sau khi nhận ra rằng việc gửi của tôi phá vỡ các dòng có dòng mới hàng đầu, tôi đã thêm hai byte nữa. Dưới đây là đệ trình cũ hơn.

APL (Dyalog Unicode) , 17 byte

{↑⊢∘⌽\⍵⊆⍨⌈⍺÷⍨⍳≢⍵}

Hãy thử trực tuyến!


2

Con trăn 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)]))

(nhìn vào các câu trả lời khác), với 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)]))

Dòng cuối cùng của đầu ra của bạn là sai. Chạy nó ở đây. Đây là một bài đăng đầu tiên tuyệt vời và một khi bạn khắc phục tôi sẽ đề xuất một số cách để loại bỏ một số byte, điều đầu tiên là bạn có thể xóa tất cả các khoảng trắng / tab khỏi câu trả lời của mình.
mbomb007

haha, bạn rất đúng Sửa nó sẽ tốn rất nhiều tiền nhưng tôi đang dùng nó. cảm ơn
bobrobbob


Ngoài ra, bạn đã đánh bại câu trả lời của tôi từ khá lâu trước đây: codegolf.stackexchange.com/a/55082/34718
mbomb007

đọc các mẹo. cảm ơn một lần nữa
bobrobbob

1

PHP, 135 byte

Có hai đối số dòng lệnh như được hiển thị với $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);

1

CoffeeScript, 131 byte

Điều này dường như quá dài.

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

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)

Ung dung:

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


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

Điều này không chính xác khi dòng cuối cùng ngắn hơn và không bị xoắn, tôi muốn đăng bản sửa lỗi trong câu trả lời của mình nhưng tôi nghĩ sẽ tốt hơn nếu bạn có thể cập nhật thay thế: {-1@[l;(&)(til(#)l:y cut x)mod 2;'[neg[y]$;|:]];}(49 byte). Cảm ơn đã truyền cảm hứng! :)
hjk

1

Q, 64 56 byte

{c::neg y;-1(til(#)l){$[x mod 2;c$(|:)y;y]}'l:y cut x;}
  • {}là một chức năng nên được gọi là {}[x;y].
    • x sẽ là chuỗi.
    • y sẽ là chiều dài của các dòng kết quả.

Kiểm tra:

{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

chỉnh sửa : Được sử dụng các chức năng ngắn hơn như được lấy cảm hứng từ câu trả lời q khác của @tmartin


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

Tôi không thể nhận xét về @willem nhưng tôi đã làm cho mã của anh ấy nhỏ hơn.

Thử tại đây Thử tại đây


Xin chào AlexN, một trong những tốt đẹp. Tôi nghĩ rằng dòng cuối cùng của bạn trong ví dụ 'Thử ở đây' là không chính xác. Nó nên được biện minh ngay. Ngoài ra tôi đếm 86 ký tự? Xem mục của tôi để cập nhật.
Willem

Xin chào, bạn đã đúng, tôi đã sửa mã và thấy rằng bạn có lỗi trong mã của bạn: ideone.com/GOmMrE Nên có ở bên phải.
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, cộng với 2 byte cho -p0 .

Bản giới thiệu:

$ 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!  $

Lưu ý rằng đầu vào đọc từ STDIN không thể kết thúc bằng một dòng mới (sẽ tốn thêm 2 byte).

Giải trình:

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

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}

Gọi với t(input_string, twist_length), trả về chuỗi đầu ra.


1
Xin lỗi, đăng một chút quá nhanh. Nó đã được sửa.
DankMeme



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

Quá nhiều = (


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

Điều này xen kẽ giữa catrev cho các chuỗi con của đối số thứ nhất với độ dài của đối số thứ hai.

Các biến đặc biệt được sử dụng bao gồm

  • ${#1}(độ dài của chuỗi $1)
  • ((i/$2%2))(một biểu thức số học chia số gia tăng $icho $2rồi lấy modulo của nó để xác định số lẻ so với số chẵn, điều này cho biết có nên sử dụng hay không rev)
  • ${1:i:$2}(chuỗi con $1bắt đầu tại vị trí $icó độ dài $2).

Hừm, tôi đã làm điều này độc lập với bashcâu trả lời khác , điều mà tôi chỉ thấy bây giờ. Chúng tôi có logic tương tự. ... Thật ra, câu trả lời của viktorahlström chỉ để tôi cạo đi 9 ký tự khác.
Adam Katz

0

JavaScript ES6, 113 byte

Chỉ là vết nứt của riêng tôi tại câu hỏi của riêng tôi. Nó sẽ thêm các khoảng trắng để nó chia hết cho n, theo cách đó, nó chỉ đơn giản là phân tách và đảo ngược.

(s,n)=>(s+' '.repeat(n-s.length%n)).match(eval(`/.{1,${n}}/g`)).map((l,i)=>i%2?[...l].reverse().join``:l).join`
`
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.