คำบิด!


34

คำบิด!

รับสตริงและจำนวนเต็มบวก คุณต้องบิดสายไปมา

ตัวอย่างอินพุต / เอาท์พุต

อินพุต

Programming Puzzles & Code Golf
4

เอาท์พุต

Prog
mmar
ing 
zzuP
les 
oC &
de G
 flo

อินพุต

อินพุตสามารถใช้ผ่าน STDIN หรืออาร์กิวเมนต์ของฟังก์ชัน การป้อนข้อมูลจะประกอบด้วยสตริงและจำนวนเต็มบวก n จำนวนเต็มจะกำหนดความยาวของแต่ละเส้นบิด

สตริงถูกบิดไปมา อินพุตHELLO, WORLD!และ 5 มีลักษณะดังนี้:

สวัสดีชาวโลก!

เอาท์พุต

ผลลัพธ์จะเป็นข้อความที่บิดเบี้ยว มันอาจจะไม่ช่องว่างต่อท้าย หากความยาวของสตริงที่ป้อนเข้าไม่หารด้วยความยาวของบรรทัดให้เพิ่มช่องว่างจนกว่าจะเติมบรรทัด:

ตัวอย่างของสิ่งนี้:

อินพุต

Hello, World!
5

เอาท์พุท (หมายเหตุช่องว่างที่ปลายสุด)

Hello
roW ,
ld!  


มันอาจจะไม่ช่องว่างต่อท้าย กริยาคำกริยา?
อดัม

เราขอคืนรายการได้ไหม?
อดัม

คำตอบ:


10

Pyth, 19 15

VPc+z*dQQ_W~!ZN

พาดแผ่นสตริงล่วงหน้าจากนั้นสลับสายแต่ละเส้นในขณะที่พิมพ์ ช่องว่างภายในเท่ากับขนาดของกล่อง แต่บรรทัดสุดท้ายหลังจากการตัดอินพุตจะถูกยกเลิก

ลองที่นี่


6

CJam, 19 ไบต์

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

ตัวอย่างอินพุต:

5 "Hello, World!"

คำอธิบาย

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

Snowman 1.0.1 , 91 bytes

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

หรือทั้งหมดในบรรทัดเดียว (เพื่อความสวยงามหรือโดยเฉพาะอย่างยิ่งการต่อต้านความสวยงาม) ด้วยราคา 2 ไบต์:

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

นี่เป็นวิธีที่สั้นเกินไปสำหรับ Snowman (อาจเป็นระยะทางสั้นที่สุดที่ฉันจะได้รับ; ฉันทำงานตีกอล์ฟเป็นเวลานานทีเดียว)

นี่เป็นข้อแม้หนึ่งข้อ: มันจะออกโดยมีข้อผิดพลาด (แต่ยังคงสร้างเอาต์พุตที่ถูกต้อง) 50% ของเวลาเมื่อบรรทัดสุดท้ายไม่ได้กลับด้าน (นี่เป็นเพราะฉันใช้agเพื่อจัดกลุ่มองค์ประกอบอาร์เรย์ในกลุ่มที่สองเพื่อให้ฉันสามารถย้อนกลับกัน แต่ฉันไม่ตรวจสอบว่าองค์ประกอบสุดท้ายมีองค์ประกอบที่คาดหวังทั้งสองดังนั้นมันจะพยายามเข้าถึงองค์ประกอบที่ไม่มีอยู่ถ้า มีจำนวนบรรทัดคี่)

Ungolfed / คำอธิบาย:

{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

Python 2, 60

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

นำnตัวอักษรในเวลาจากจากการsพิมพ์พวกเขาด้วยทิศทางdที่สลับกันไปมาระหว่างและ1 -1สำหรับการเว้นวรรคในบรรทัดสุดท้ายนั้นsจะถูกเพิ่มด้วยnช่องว่างที่ส่วนท้ายก่อนที่จะถูกสับซึ่งจะมีผลกับมันเมื่อมีจำนวนnอักขระเหลืออยู่น้อยกว่าเท่านั้น

โซลูชันแบบเรียกซ้ำจะช่วยประหยัดถ่าน (59) ยกเว้นว่าจะปล่อยบรรทัดใหม่ต่อท้ายซึ่งไม่ได้รับอนุญาต

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

4

Haskell , 83 75 ไบต์

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

chunksOfการติดตั้งอย่างง่ายดายด้วยการรับและวางใช้จำนวนคู่หรือคี่ย้อนกลับไปยังเอาต์พุตเมื่อเราดำเนินการ

ขอบคุณ @BMO สำหรับห้าไบต์และ @ ØrjanJohansenสำหรับสามไบต์!

ลองออนไลน์!


2
ใช้การcycleบันทึก 5 ไบต์ลองออนไลน์!
ბიმო

บันทึกอีกสามไบต์ด้วยการลบgและสลับnและl: ลองออนไลน์!
Ørjan Johansen

3

ติดอยู่ , 42 41 40 38 ไบต์

นี่มันยาวไปหน่อยน่าจะลองตีกอล์ฟให้มากขึ้น!

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

"string"|nการป้อนข้อมูลควรเป็นเช่น

คำอธิบาย:

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 ไบต์

(#)=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

นั่นมันยาวมากเลย jeez นี่คือการกระทำ:

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

การเชื่อมโยงletนิพจน์ทำงานอย่างไร
xnor

มันเป็นสองในหนึ่งletคำสั่งคั่น - ปกติที่คุณต้องการใช้การขึ้นบรรทัดใหม่และเยื้อง แต่ Haskell let a=b; c=d in exprยังช่วยให้คุณเขียน
ลินน์

ฉันไม่ทราบว่าสิ่งนี้ได้รับอนุญาตนำ putStrLn ออกจากโปรแกรม!
Leif Willerts

1
@LeifWillerts เมื่อเร็ว ๆ นี้ความท้าทายที่นี่มีแนวโน้มที่จะช่วยให้คุณสามารถดำเนินการอย่างใดอย่างหนึ่งของ I / O ผ่านฟังก์ชั่นการขัดแย้งผล / หรือ stdin / stdout - ที่นี่วิธีการแก้ปัญหาของฉันคือฟังก์ชั่นแทน(%) :: String -> String -> String IO ()
ลินน์

2

Python 2, 109 ไบต์

ต้องเพิ่มการเติมด้วยช่องว่างเพื่อให้บรรทัดสุดท้ายถูกต้อง

ลองที่นี่

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 ไบต์

เวอร์ชั่นเก่า:

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

เวอร์ชั่นใหม่:

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


2

Perl, 87 ไบต์

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

เวอร์ชันเก่า (พิมพ์บรรทัดใหม่ต่อท้าย):

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

สตริงถูกส่งผ่านเป็นอาร์กิวเมนต์ฟังก์ชั่นที่ไม่มีการขึ้นบรรทัดใหม่ โทรแบบนี้:

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

2

คางทูม 86 ไบต์

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)),!

แม้ว่ามันอาจจะสั้นกว่า 2 ไบต์ถ้าคุณลบ ',!' ตัวแรก อักขระในคำสั่ง R (อ่านจาก STDIN); ที่เพิ่มการขึ้นบรรทัดใหม่ระหว่างอินพุตและเอาต์พุต หากไม่ได้อยู่ที่นั่นผลลัพธ์จะถูกต้องทางเทคนิค แต่บรรทัดแรกจะปรากฏต่อท้ายสตริงอินพุต [[ขั้วต่อคางทูมมาตรฐานที่ฉันใช้ไม่มีเสียงสะท้อนในเครื่อง ]]   ขณะที่มันนั่งอยู่นี่คือการทดสอบ:

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 

โปรดทราบว่าจริง ๆ แล้วมี carriage return / Enter keypress ระหว่าง '123' และ '6' ที่ส่วนท้ายของอินพุต [[สิ่งที่สะท้อนอยู่ในท้องถิ่นอีกครั้ง ]]

หากใครสนใจฉันสามารถอธิบายสิ่งที่เกิดขึ้นกับรหัส; แต่ฉันรู้ว่าไม่มีผู้ที่ชื่นชอบคางทูมอยู่ที่นั่น ... :-)


2

PowerShell, 102 ไบต์

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

เรียกใช้ดังนี้ (หากบันทึกไว้ในไฟล์CodeGolf55051.ps1)

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

ความพยายามก่อนหน้า

(อีกต่อไปหรือไม่ถูกต้อง)

PowerShell ขนาด 110 ไบต์

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

PowerShell, 111 ไบต์

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

คำอธิบาย

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 ไบต์

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 ไบต์

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

คำอธิบาย

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

( {...}ในความคิดเห็นข้างต้นเป็นจริง{0}|{1}|{2}ฉันใส่{...}เพื่อให้อ่านง่ายขึ้น

Powershell, 120 ไบต์ (ไม่ถูกต้อง)

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

1
ยอดเยี่ยมมากที่ได้เห็น PowerShell Slinger! การเริ่มต้นง่ายๆคือการกำจัดแดงใกล้ทุกพื้นที่param($s,$i)$s+' '*($i-$s.Length%$i)-replace'(.{4})?(.)(.)(.)(.)',"`$1`n`$5`$4`$3`$2`n"-split"`n"|?{$_-ne""}ซึ่งจะทำให้คุณลดลงถึง 108
AdmBorkBork

ขอบคุณ @TimmyD; เพิ่งพบข้อผิดพลาดพื้นฐานบางอย่างกับสคริปต์ของฉัน แต่ (มันไม่เป็นไปตามข้อกำหนด / เป็น hardcoded เพียงทำงานได้ 4 ... การแก้ไขในขณะนี้)
JohnLBevan

ในขณะที่การทดสอบเพื่อให้การไหลกลับไปกลับมาเพื่อเริ่มต้นในทิศทางที่ถูกต้องฉันต้องสลับ[$r]ดัชนีสุดท้ายด้วย[-not$r]... มิฉะนั้นบรรทัดแรกจะอ่านตรงกันข้าม (เช่นจากขวาไปซ้าย) กว่าในตัวอย่างที่มีให้ มิฉะนั้นการดำเนินการเนียนจริงๆ!
AdmBorkBork

1
นอกจากนี้เนื่องจากเราได้รับหมายเลขอินพุตnเป็นค่าบวกและเรารับประกันว่าความยาวของสตริงไม่เป็นลบ (ตามคำจำกัดความ) นั่นหมายความว่า(($i-$l%$i)%i)เทียบเท่ากับ($i-$l%$i)การบันทึกอักขระสี่ตัว
AdmBorkBork

1
อ๊ะฉันอย่างใด typo'd นั้นผม (-$l)%$iแต่เดิมหมายถึง ไม่รู้ว่ามาจากไหน อย่างไรก็ตามสิ่งที่น่าสนใจนั้นไม่เทียบเท่าแม้ว่าควรจะเป็น เห็นได้ชัดว่ามันเป็นเรื่องแปลกที่ PowerShell (ในภาษาอื่น ๆ ) ใช้ฟังก์ชั่นแบบโมดูโลซึ่งแตกต่างจากฉัน (เป็นวิชาคณิตศาสตร์) หรือ Wolfram-Alpha เห็นได้ชัดว่าคุณจะต้องติดกับรุ่นที่ยาวขึ้น หลักฐานอ้างอิง ->((y-x%y)%y) ==> ((y%y)-(x%y%y))%y ==> ((0)-(x%y))%y ==> (-x%y)%y ==> (-x)%y
AdmBorkBork

2

Clojure, 83 ไบต์, 87 ไบต์ , 79 ไบต์

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

มีการแก้ไขหลังจากที่ความคิดเห็นด้านล่างขอบคุณOrjan

ลองออนไลน์!

Clojure ดูเหมือนมักจะเศร้าจากคำตอบรหัสกอล์ฟ แน่นอนว่ามันไม่สามารถแข่งขันกับความยาวไบต์ด้วยภาษากอล์ฟได้ แต่ฉันคิดว่าการขาดทั้งหมดนั้นค่อนข้างไม่สมเหตุสมผล

คำอธิบาย:

  • ในข้อมูลสองข้อโต้แย้งตัวเลขและสตริง
  • เริ่มต้นด้วยการทำงาน Clojure ในตัวฟังก์ชั่นพาร์ทิชันในสตริงschunking nมันเป็นลำดับของรายการของตัวละครที่รายการมีความยาว อันสุดท้ายจะถูกเติมด้วยช่องว่างให้ยาวnโดยใช้ "pad collection" ที่คืนมา(repeat " ")ซึ่งจะคืนค่าลำดับช่องว่างที่ไม่มีที่สิ้นสุด
  • จากนั้นเราเรียกใช้mapโดยมีอาร์กิวเมนต์สามตัว:
    • ฟังก์ชั่นที่ไม่ระบุชื่อ ( #(..))
    • อนันต์สลับลำดับขี้เกียจฟังก์ชั่น#(or %)ซึ่งทำหน้าที่เหมือนตัวตนของฟังก์ชั่นและย้อนกลับ (คือ[#(or %) reverse #(or %) reverse ...]) ที่ส่งกลับโดยรอบ
    • ลำดับที่ขี้เกียจของรายการที่ส่งคืนโดยพาร์ติชัน
  • ในที่สุดฟังก์ชั่นที่ไม่ระบุชื่อ #(apply ...) :
    • เรียกอย่างใดอย่างหนึ่งidentityหรือreverseสลับกันบนก้อน สิ่งนี้ทำผ่าน(% %2)นิพจน์ที่เรียกใช้ฟังก์ชันที่ส่งเป็นอาร์กิวเมนต์แรกไปยังฟังก์ชันที่ไม่ระบุชื่อ [เช่นidentityหรือreverse] โดยใช้อาร์กิวเมนต์ที่สอง [เช่น chunk] ไปยังฟังก์ชันที่ไม่ระบุชื่อเป็นอาร์กิวเมนต์ของการเรียก
    • การเรียกใช้(apply str ...)เพื่อแปลงรายการอักขระเป็นสตริง
  • ฟังก์ชั่นด้านนอกส่งกลับลำดับที่ขี้เกียจของสตริง

เคล็ดลับอย่างหนึ่งที่เราใช้ที่นี่คือฟังก์ชั่น clojure จำนวนมากเช่นmapรับจำนวนคอลเลกชันตามอำเภอใจเช่น(map f coll1 coll2 coll3 ...)ที่ฟังก์ชัน f เพียงต้องการยอมรับอาร์กิวเมนต์มากเท่าที่มีคอลเลกชัน ในกรณีนี้เราส่งสองคอลเลกชันคอลเลกชันของการอ้างอิงฟังก์ชั่นสลับและสตริงขึ้นมา


1
นี้เป็นสิ่งที่ดี ld! แต่ก็ไม่ได้ดูเหมือนจะมีช่องว่างที่จำเป็นในตอนท้ายของ
Ørjan Johansen

คุณถูกต้องที่สุด เพิ่มคอลเล็กชันแพดซึ่งควรแก้ไขปัญหา ... และเสียค่าใช้จ่ายฉัน 8 ไบต์ ...
Matias Bjarland

ฉันมีคำถามเกี่ยวกับกฎการเล่นกอล์ฟ: หากคุณใช้ฟังก์ชั่นในตัวซึ่งจะต้องมีการนำเข้าหรือคำสั่งที่คล้ายกัน (ต้องการใน clojure, import in java, ฯลฯ ) การอิมพอร์ตของบิวด์อินนั้นต้องเป็นส่วนหนึ่งของ วิธีแก้ปัญหากอล์ฟนับไบต์? ฉันคิดว่าใช่ แต่มันให้ความรู้สึกเหมือนเป็นสีเทา
Matias Bjarland

ใช่การนำเข้าจะถูกนับ
Ørjan Johansen

โอ้ แต่มีกฎอีกข้อหนึ่งที่ทำให้คุณแตก: คุณไม่สามารถรับอินพุตในตัวแปรที่กำหนดไว้ล่วงหน้าได้คุณต้องแก้ไขทั้งโปรแกรมหรือฟังก์ชั่น (ใช้อย่างใดอย่างหนึ่งfnหรือdefnใช้ได้) ที่ด้านพลิกฟังก์ชั่นของคุณได้รับอนุญาตให้เพียงแค่คืนผลลัพธ์แทนที่จะพิมพ์
Ørjan Johansen

2

APL (Dyalog Unicode)ขนาด 19 ไบต์

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

ลองออนไลน์!

เอา⊢∘⌽\เคล็ดลับจากคำตอบที่ยอดเยี่ยมของ NGN กับความท้าทาย

หลังจากทราบว่าการส่งของฉันแบ่งสำหรับบรรทัดที่มีการขึ้นบรรทัดใหม่ฉันได้เพิ่มอีกสองไบต์ ด้านล่างคือการส่งที่เก่ากว่า

APL (Dyalog Unicode)ขนาด 17 ไบต์

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

ลองออนไลน์!


2

Python 3 110 108 107 103 ไบต์

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)]))

(ดูคำตอบอื่น ๆ ) ด้วยrjust:95 93 92 90 ไบต์

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)]))

บรรทัดสุดท้ายของเอาต์พุตของคุณผิด เรียกใช้ที่นี่ มันเป็นโพสต์แรกที่ยอดเยี่ยมและเมื่อคุณแก้ไขว่าฉันจะแนะนำวิธีบางอย่างในการปิดไบต์บางส่วนสิ่งแรกคือคุณสามารถลบช่องว่าง / แท็บทั้งหมดออกจากคำตอบของคุณ
mbomb007

ฮ่าฮ่าคุณพูดถูก การแก้ไขนี้จะมีค่าใช้จ่ายมาก แต่ฉันกำลังใช้งานอยู่ ขอบคุณ
bobrobbob


อีกทั้งคุณยังเอาชนะคำตอบของฉันเมื่อไม่นานมานี้: codegolf.stackexchange.com/a/55082/34718
mbomb007

อ่านเคล็ดลับ ขอบคุณอีกครั้ง
bobrobbob

1

PHP, 135 ไบต์

$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 ไบต์

ดูเหมือนว่านานเกินไป

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 ไบต์

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)

Ungolfed:

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

นี่ไม่ถูกต้องเมื่อบรรทัดสุดท้ายสั้นและไม่บิดฉันต้องการโพสต์แก้ไขข้อบกพร่องในคำตอบของฉัน แต่ฉันคิดว่ามันจะดีกว่าถ้าคุณสามารถอัปเดตแทนของคุณ: {-1@[l;(&)(til(#)l:y cut x)mod 2;'[neg[y]$;|:]];}(49 bytes) ขอบคุณสำหรับแรงบันดาลใจ! :)
hjk

1

Q, 64 56 ไบต์

{c::neg y;-1(til(#)l){$[x mod 2;c$(|:)y;y]}'l:y cut x;}
  • {}{}[x;y]เป็นฟังก์ชันที่ควรจะเรียกว่าเป็น
    • x จะเป็นสตริง
    • y จะเป็นความยาวของเส้นผลลัพธ์

ทดสอบ:

{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

แก้ไข : ใช้ฟังก์ชันที่สั้นกว่าซึ่งได้แรงบันดาลใจจากคำตอบ qอื่น ๆโดย @tmartin


1

Python 2, 82 75 ไบต์

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

ฉันไม่สามารถแสดงความคิดเห็นใน @willem แต่ฉันทำให้รหัสของเขาเล็กลง

ลองที่นี่ ลองที่นี่


สวัสดี AlexN คนดี ฉันคิดว่าบรรทัดสุดท้ายของคุณในตัวอย่าง 'ลองที่นี่' ไม่ถูกต้อง มันควรถูกต้อง นอกจากนี้ฉันนับตัวอักษร 86 ตัว? ดูรายการของฉันสำหรับการปรับปรุง
วิลเล็ม

สวัสดีวิลเล็มคุณถูกต้องฉันแก้ไขรหัสและพบว่าคุณมีข้อผิดพลาดในตัวคุณ: ideone.com/GOmMrE ควรอยู่ทางด้านขวา
Alexander Nigl

1

Perl, 72 ไบต์

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

70 ไบต์บวก 2 -p0ไบต์

การสาธิต:

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

โปรดทราบว่าอินพุตที่อ่านจาก STDIN ไม่สามารถจบด้วยการขึ้นบรรทัดใหม่ (ซึ่งจะมีราคาเพิ่ม 2 ไบต์)

คำอธิบาย:

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 ไบต์

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}

โทรด้วยt(input_string, twist_length)ซึ่งส่งคืนสตริงเอาต์พุต


1
ขออภัยโพสต์เร็วไปหน่อย มันคงที่
DankMemes




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

สิ่งนี้สลับระหว่างcatและrevสำหรับสตริงย่อยของอาร์กิวเมนต์แรกที่มีความยาวของอาร์กิวเมนต์ที่สอง

ตัวแปรพิเศษที่ใช้ ได้แก่

  • ${#1}(ความยาวของสตริง$1)
  • ((i/$2%2))(นิพจน์ทางคณิตศาสตร์หารส่วนเพิ่ม$iด้วย$2แล้วนำโมดูโลไปหาค่าคี่เทียบกับคู่ซึ่งกำหนดว่าจะใช้หรือไม่rev)
  • ${1:i:$2}(สตริงย่อยของการ$1เริ่มต้นที่ตำแหน่งที่$iมีความยาว$2)

หืมฉันทำอย่างนี้โดยอิสระจากbashคำตอบอื่นซึ่งฉันเพิ่งเห็นตอนนี้ เรามีเหตุผลเดียวกันอย่างมีประสิทธิภาพ ... อันที่จริงคำตอบของviktorahlströmเพียงแค่ให้ฉันตัดออกไปอีก 9 ตัวอักษร
Adam Katz

0

JavaScript ES6, 113 ไบต์

แค่รอยแตกของตัวเองตามคำถามของตัวเอง มันจะเพิ่มช่องว่างเพื่อให้หารด้วยnวิธีที่มันเป็นเพียงการแยกและย้อนกลับ

(s,n)=>(s+' '.repeat(n-s.length%n)).match(eval(`/.{1,${n}}/g`)).map((l,i)=>i%2?[...l].reverse().join``:l).join`
`
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.