การทับบล็อคสตริง


22

ท้าทาย:

รับรายการสตริงหลายบรรทัดซ้อนทับกัน (ในมุมบนซ้าย) และแสดงผลลัพธ์

ตัวอย่าง:

อินพุต: ["aaaa\naaaa\naaaa\naaaa","bb\nbb\nbb","c"]
เอาต์พุต:

cbaa
bbaa
bbaa
aaaa

กฏท้าทาย:

  • รูปแบบอินพุตมีความยืดหยุ่น คุณได้รับอนุญาตให้รับอินพุตเป็นรายการบรรทัด 2 มิติ (เช่น[["aaaa","aaaa","aaaa","aaaa"],["bb","bb","bb"],["c"]]) หรือรายการอักขระ 3 มิติ (เช่น[[["a","a","a","a"],["a","a","a","a"],["a","a","a","a"],["a","a","a","a"]],[["b","b"],["b","b"],["b","b"]],[["c"]]]) คุณได้รับอนุญาตให้รับอินพุตทั้งหมดทีละตัวผ่าน STDIN เป็นต้น
  • รูปแบบผลลัพธ์เข้มงวด คุณสามารถเลือกที่จะพิมพ์หรือส่งคืนสตริงหลายบรรทัด (หากภาษาของคุณไม่มีสตริงใด ๆ การอนุญาตให้แสดงผลเป็นรายการตัวอักษร 2D เป็นทางเลือก แต่หากภาษาของคุณไม่มีสตริงเลย)
  • ลำดับของรายการอินพุตมีความสำคัญแน่นอน (แต่คุณได้รับอนุญาตให้ป้อนข้อมูลย้อนกลับหากคุณเลือก)
  • อินพุตจะมีเฉพาะ ASCII ที่พิมพ์ได้ในช่วง Unicode ( )[33,126]!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
  • อินพุตจะเป็นรูปสี่เหลี่ยมผืนผ้าเท่านั้น (ดังนั้นจึงไม่มีรูปทรงแปลก ๆ ) ถึงแม้ว่าเอาต์พุตไม่จำเป็นต้องใช้รูปสี่เหลี่ยมผืนผ้า
  • ช่องว่างต่อท้ายและขึ้นบรรทัดใหม่ต่อท้ายได้รับอนุญาต ช่องว่างนำหน้าและ / หรือบรรทัดใหม่ไม่

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ
    อย่าปล่อยให้ภาษาโค้ดกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานใช้สำหรับคำตอบของคุณด้วยกฎ I / O เริ่มต้นดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชั่น / วิธีการที่มีพารามิเตอร์ที่เหมาะสมและประเภทผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงก์พร้อมทดสอบรหัสของคุณ (เช่นTIO )
  • นอกจากนี้ขอแนะนำให้เพิ่มคำอธิบายสำหรับคำตอบของคุณ

กรณีทดสอบ:

อินพุต: ["aaaa\naaaa\naaaa\naaaa","bb\nbb\nbb","c"]
เอาต์พุต:

cbaa
bbaa
bbaa
aaaa

อินพุต: ["12345\n54321","00\n00\n00\n00","001\n011\n012"]
เอาต์พุต:

00145
01121
012
00

อินพุต: ["sm\noo\nmr\nee\nt!\nh_\ni_\nn_\ng_","!@#$%^\n&*()_+\nqwerty\nuiopas","this\nis_a\ntest"]
เอาต์พุต:

this%^
is_a_+
testty
uiopas
t!
h_
i_
n_
g_

บรรทัดใหม่ต่อท้ายได้รับอนุญาตหรือไม่ หรือมากกว่านั้นโดยเฉพาะคือการขึ้นบรรทัดใหม่ตามจำนวนที่อนุญาตหรือไม่
JAD

@ JAD ใช่แน่นอนทำไมไม่ ตราบใดที่เหลือจะถูกส่งออกโดยไม่มีช่องว่างนำหน้า / ขึ้นบรรทัดใหม่ การขึ้นบรรทัดใหม่ / การเว้นวรรคไม่สำคัญจริงๆดังนั้นสามารถเลือกเพิ่มได้
Kevin Cruijssen

คำตอบ:


6

เยลลี่ 3 ไบต์

a/Y

ลองออนไลน์!

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


ดีจัง! ฉันค่อนข้างแย่กับ Jelly tbh โซลูชันที่เตรียมไว้ของฉันอยู่ḷ""/Yในรายการป้อนกลับ ไม่รู้ด้วยซ้ำแม้แต่a..
เควินครุยส์เซน

11

JavaScript (Node.js)ขนาด 24 ไบต์

บันทึก 2 ไบต์ขอบคุณ @Grimy

สันนิษฐานว่าสตริงกลับจะพิมพ์อยู่บนสถานีที่สนับสนุนANSI รหัสหนี มีอักขระที่ไม่สามารถพิมพ์ได้ESCซึ่งจะหลบหนี (ไม่มีจุดประสงค์ในการเล่นสำนวน) \x1Bดังต่อไปนี้

a=>`\x1B[2J\x1B[H`+a.join`\x1B[H`

สิ่งนี้ใช้ไม่ได้กับ TIO แต่คุณสามารถลองออนไลน์ได้! เพื่อดูผลลัพธ์ดิบแทน

อย่างไร?

ลำดับ CSIที่ใช้เป็น:

  • ED (ลบในจอแสดงผล):

    ESC[2J

    เมื่อ2หมายถึง"ล้างหน้าจอทั้งหมด"

  • CUP (ตำแหน่งเคอร์เซอร์):

    ESC[H

    ซึ่งหมายความว่า"เลื่อนเคอร์เซอร์ไปที่แถวn , คอลัมน์m "โดยที่ทั้งnและmถูกละเว้นและตั้งค่าเป็น1 (มุมซ้ายบนของหน้าจอ)

ตัวอย่างผลลัพธ์

เอาท์พุต


สมมติว่า ECMA-48 ;ขั้วสอดคล้องคุณสามารถละเว้นทั้งสอง นอกจากนี้ฉันคิดว่านี่ควรเป็น "JavaScript + terminal" หรือสิ่งที่คล้ายกันซึ่งไม่ได้แข่งขันกับ JavaScript ที่แท้จริง
Grimmy

@Grimy ขอบคุณ! (สำหรับทุกคนที่สนใจนี่คือข้อกำหนดของ ECMA-48 - แต่ฉันไม่พบที่กล่าวถึงว่าสามารถใช้เครื่องหมายอัฒภาคได้ - หากพูดถึงเลย)
Arnauld

1
5.4.2.h ค่อนข้างคำพลุกพล่าน if the last parameter sub-string(s) is empty, the separator preceding it may be omittedแต่บิตที่น่าสนใจคือ: เนื่องจากมีสองสตริงย่อยเท่านั้นตัวคั่นที่อยู่ก่อนสตริงย่อยสุดท้ายจะเป็นสตริงเดียวเท่านั้นและสามารถละเว้นได้
Grimmy

ฉันไม่รู้จัก ANSI แต่\x1B[Hจำเป็นต้องมี + ตัวแรกหรือไม่ มันไม่ได้เริ่มต้นที่มุมบนซ้ายตามค่าเริ่มต้นและคุณจะต้องรีเซ็ตมันหลังจากแต่ละอินพุต (ซึ่งการเข้าร่วมแบบใดที่ทำ) หรือเริ่มต้นที่อื่นโดยค่าเริ่มต้นและคุณต้องให้มันเริ่มต้นที่ตำแหน่งเคอร์เซอร์อย่างชัดเจนเพื่อให้รีเซ็ตเป็นตำแหน่งนั้นในการเข้าร่วมสำเร็จหรือไม่
Kevin Cruijssen

1
@Arnauld เนื่องจากคุณอาจจะมีอย่างอื่นใน terminal เมื่อใช้งานฟังก์ชั่นนี้ฉันเดาว่าต้องเริ่มต้นใหม่หลังจากทั้งหมด สำหรับการพิมพ์ ommitting ฉันเดาf=a=>print(`\x1B[H`+a.join`\x1B[H`)ด้วยf(input_here)จะให้ผลลัพธ์เช่นเดียวกับprint(f(input_here))? ดังนั้นฉันไม่เห็นว่าทำไมคุณไม่ได้รับอนุญาตให้ละเว้นprintและเพียงแค่ส่งคืนสตริง
Kevin Cruijssen

7

R , 120 , 111 110 107 ไบต์

function(x,`!`=ncol,M=array('',Reduce(pmax,Map(dim,x)))){for(m in x)M[1:!t(m),1:!m]=m
write(t(M),1,!M,,'')}

ลองออนไลน์!

ฟังก์ชั่นที่รับรายการเมทริกซ์ของตัวละคร (ยอมรับ 3D ได้)

(เนื่องจากคุณสามารถสังเกตเห็นได้จากจำนวนไบต์นี่ไม่ใช่เรื่องง่ายที่จะทำใน R ... )

  • -9 ไบต์ขอบคุณ @Giuseppe
  • -4 ไบต์ขอบคุณ @RobinRyder

4
ฉันคาดหวังว่าจะได้โซลูชั่น 200 ไบต์! ฉันจะให้ความโปรดปรานนี้เมื่อใดก็ตามที่คำถามนี้กลายเป็นเงินรางวัล eligibile
จูเซปเป้

@Giuseppe: ยังคงนานกว่าภาษาอื่น ๆ ... :(
digEmAll

2
111 ไบต์ใช้arrayแทนmatrix!
จูเซปเป้

@Giuseppe: เรียบร้อย!
digEmAll

3
107พร้อมนามแฝงสำหรับncol(คุณสามารถย้ายเพื่อรับnrow)
Robin Ryder

5

Python 2 , 88 ไบต์

n,f=None,filter
for l in map(n,*input()):print''.join(f(n,x)[-1]for x in map(n,*f(n,l)))

ลองออนไลน์!


คำอธิบาย (พร้อมตัวอย่าง):

ใช้รายการ 2D เป็นอินพุต

Input: [["12345","54321"],["00","00","00","00"],["001","011","012"]]

ก่อนอื่นรายการอินพุตจะถูกซิปเพื่อให้ได้แถวของแต่ละสี่เหลี่ยมอินพุท ( map(None,l)เหมือนซิปที่ยาวที่สุด):

map(n,*input())   gives:

('12345', '00', '001')
('54321', '00', '011')
(None, '00', '012')
(None, '00', None)

แต่ละแถวเหล่านี้จะถูกกรองไปยังการลบออกNoneแล้วซิปอีกครั้ง:

map(None,*filter(None,l))

filter(None,l) for each l gives:

('12345', '00', '001')
('54321', '00', '011')
('00', '012')
('00',)

map*... gives:

[('1', '0', '0'), ('2', '0', '0'), ('3', None, '1'), ('4', None, None), ('5', None, None)]
[('5', '0', '0'), ('4', '0', '1'), ('3', None, '1'), ('2', None, None), ('1', None, None)]
[('0', '0'), ('0', '1'), (None, '2')]
['0', '0']

ซึ่งเป็นรายการอักขระสำหรับแต่ละตำแหน่งของผลลัพธ์ที่ต้องการ รายการเหล่านี้จะถูกกรองอีกครั้งและรายการสุดท้ายจะถูกนำไปใช้:

filter(None,x)   gives:

[('1', '0', '0'), ('2', '0', '0'), ('3', '1'), ('4',), ('5',)]
[('5', '0', '0'), ('4', '0', '1'), ('3', '1'), ('2',), ('1',)]
[('0', '0'), ('0', '1'), ('2',)]
['0', '0']

and with [-1]:

['0', '0', '1', '4', '5']
['0', '1', '1', '2', '1']
['0', '1', '2']
['0', '0']

ในที่สุดรายการผลลัพธ์จะเข้าร่วมและพิมพ์:

print''.join(..)

00145
01121
012
00

RE "ส่งคืนรายการสตริง" สถานะกฎ "รูปแบบเอาต์พุตมีความเข้มงวดคุณสามารถเลือกพิมพ์หรือส่งคืนสตริงหลายบรรทัดได้รายการ 2D หรือ 3D ไม่อนุญาตให้ใช้เอาต์พุต" โปรแกรมเต็ม 88 ไบต์ดูเหมือนว่าใช้ได้
Jonathan Allan

@JanathanAllan, welp, ฉันอ่านผิดอย่างเข้มงวด (หรือลืม?: p)
TFeld

5

R, 107 97 ไบต์

function(x)for(i in 1:max(lengths(x))){for(m in x)if(i<=length(m))cat(m[i],'\r',sep='');cat('
')}

ดูเหมือนจะไม่ทำงานกับ TIO ซึ่งอาจเกี่ยวข้องกับการใช้ \rอักขระส่งคืนสินค้า มันทำงานกับการติดตั้ง R ในพื้นที่ของฉัน

รับอินพุตเป็นรายการที่มีเวกเตอร์ของแถว:

x <- list(c("aaaa","aaaa","aaaa","aaaa"),c("bb","bb","bb"),c("c"))

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

หากเราขยายกฏเล็กน้อยเราสามารถทำได้โดยตรวจสอบความยาวของอินพุตและวนซ้ำไปเรื่อย ๆ โดยพิมพ์บรรทัดใหม่จำนวนมาก:

R, 85 ไบต์

function(x)for(i in 1:8e8){for(m in x)if(i<=length(m))cat(m[i],'\r',sep='');cat('
')}

106 ไบต์ดีใจที่ได้เห็นคุณเล่นกอล์ฟที่นี่และที่นั่น!
จูเซปเป้

อาจเป็นไปได้97 ไบต์ ; ไม่ชัดเจนว่าสิ่งนี้ใช้ได้ผลจริงหรือไม่เนื่องจากฉันทำการทดสอบใน TIO เท่านั้น
Giuseppe

@Giuseppe สวัสดี! ข้อเสนอแนะของคุณใช้ได้สำหรับฉัน หากเราได้รับอนุญาตให้พิมพ์บรรทัดใหม่ต่อท้ายอาจเป็นไปได้ที่จะใช้ขนาดใหญ่โดยพลการแทนลูปแทน แต่ฉันเดาว่ามันเป็นการผลักดันขีด จำกัด ของความท้าทาย
JAD

@ JAD: ใช้ความคิดที่ดี\rและยินดีต้อนรับกลับมา! เพียงแค่ทราบผมคิดว่านี่จะทำงานเฉพาะในการประชุม R โต้ตอบ (เมื่อinteractive()ผลตอบแทนจริง)
digEmAll

@digEmAll มันทำงานกับเครื่องของฉันโดยใช้rscriptจาก commandline ฉันสงสัยว่ามันเป็นสิ่งที่ใช้ Windows / Linux ตั้งแต่ Windows ใช้สำหรับการขึ้นบรรทัดใหม่และลินุกซ์\r\n \n
JAD

4

APL (Dyalog Unicode) , 22 ไบต์SBCS

ฟังก์ชั่นคำนำหน้าโดยปริยายโดยไม่ระบุชื่อรับรายการอาร์เรย์อักขระ 2D เป็นอาร์กิวเมนต์ พิมพ์

(⊃{⍺@(⍳⍴⍺)⊢⍵}/)⌽,∘⊂1⌷↑

ลองออนไลน์!

สิ่งนี้ทำงานได้โดยการสร้างผืนผ้าใบจากนั้นต่อท้ายไปยังรายการบล็อกและการลด (การพับ) ด้วยฟังก์ชันที่วางบล็อกไว้ที่มุม

 ผสมบล็อก 2 มิติเพื่อสร้างบล็อก 3 มิติแบบมุมฉากซ้อนทับด้วยช่องว่างตามต้องการ

1⌷ ใช้เลเยอร์แรก

 ให้ล้อมรอบ
 นั้น
⌽, รายการรายการบล็อกที่กลับด้าน

(... ) ใช้ฟังก์ชัน tacit ต่อไปนี้:

{... }/ ลดการใช้แลมบ์ดานิรนามดังต่อไปนี้:

  ⊢⍵ ด้วยข้อโต้แย้งที่ถูกต้องในฐานะผืนผ้าใบ ...

  ⍺@(... ) แก้ไขด้วยองค์ประกอบของอาร์กิวเมนต์ซ้ายวางไว้ที่ดัชนีต่อไปนี้:

   ⍴⍺ รูปร่างของอาร์กิวเมนต์ที่ด้านซ้าย

   ɩ ndices ของอาร์เรย์ของรูปร่างที่

 เปิดเผย (เพราะการลดอยู่ในเครื่องหมายลดระดับ)


4

Haskell, 66 ไบต์

unlines.foldl((const?)?)[]
(g?(a:b))(c:d)=g a c:(g?b)d;(_?a)b=a++b

[["c"],["bb","bb","bb"],["aaaa","aaaa","aaaa","aaaa"]]การป้อนข้อมูลจะมาเป็นรายชื่อของรายการของสตริงเพื่อย้อนกลับเช่นสำหรับกรณีการทดสอบครั้งแรก:

ลองออนไลน์!


3

05AB1E , 12 ไบต์

พอร์ตของโซลูชัน TFL ของไพ ธ อน
ขนาด 2 ไบต์บันทึกไว้ขอบคุณGrimy

ζεðKζðδK€θJ,

ลองออนไลน์!

คำอธิบาย

ζ             # transpose input with space as filler
 ε            # apply to each
  ðK          # remove spaces
    ζ         # transpose with space as filler
     ðδK      # deep remove spaces
        €θ    # get the tail of each
          J   # join each
           ,  # print

ทางเลือก 14 ไบต์รุ่น

õζεÅ»DŠg.$J}θ,

ลองออนไลน์!

คำอธิบาย

õζ              # zip with empty string as filler
  ε             # apply to each
   Å»      }    # cumulative reduce by
     D          # duplicate second input
      Š         # move down twice on stack
       g.$      # remove len(other_copy) elements from the other input
          J     # join with other copy
            θ,  # print the last element

1
โอ้ต้องจำไว้ว่า--no-lazyนี่คือการแก้ไขที่ยังคงใช้แผนที่ / ตัวกรองพร้อมพิมพ์สำหรับปริยายyเพื่อบันทึกไบต์เปรียบเทียบกับvy...,:) ฉันรู้ว่าการทำงานในรุ่นเก่า แต่ในรุ่นใหม่มันจะเอาท์พุท[...]. --no-lazyไม่ได้รู้ว่าเป็นผลมาจากการขาดของ ;) สำหรับคำตอบนั้นดีมาก! ฉันรู้ว่าการลดแบบสะสมเป็นสิ่งจำเป็น แต่ไม่สามารถทำได้จริง ๆ เมื่อฉันลองด้วยตัวเอง คุณทำให้มันดูง่าย ๆ ..
Kevin Cruijssen

ฉันได้กล่าวถึงในกฎ แต่ลืมที่จะนำไปใช้กับกรณีทดสอบ .. แต่ช่องว่างจะไม่อยู่ในการป้อนข้อมูล ดังนั้นคุณอาจจะสามารถบันทึกจำนวนไบต์ได้ตั้งแต่ zip-filler เป็นช่องว่างตามค่าเริ่มต้น (ไม่แน่ใจว่ามันจะบันทึกสิ่งใดในคำตอบแรกของคุณ แต่ในพอร์ตมันอาจเป็นไปได้)
Kevin Cruijssen

2
õζεõKสามารถζεðK, สามารถõζõδK ζðδK
Grimmy

@Grimy: โอ้ใช่ช่องว่างไม่สามารถอยู่ในอินพุตได้อีกต่อไป ขอบคุณ!
Emigna



2

PowerShell 6คอนโซลเท่านั้น 20 ไบต์

ขึ้นอยู่กับ Arnauld ของคำตอบ ทำงานกับคอนโซลเท่านั้นและไม่ทำงานบน TIO

cls
$args-join"`e[H"

ลองออนไลน์!


PowerShell , 103 ไบต์

$args|%{$l=$_-split'
';$r=&{$r+($l|%{''})|%{($x=$l[$j++])+($_-replace"^.{0,$("$x"|% Le*)}")}|?{$_}}}
$r

ลองออนไลน์!

คลี่:

$args|%{
    $l=$_-split"`n"
    $r=&{                           # run this scriptblock in a new scope
        $r+($l|%{''})|%{
            $x=$l[$j++]             # a new line or $null
            $w="$x"|% Length
            $y=$_-replace"^.{0,$w}" # remove first chars from the current line
            $x+$y                   # output the new line plus tail of the overlapped line
        }|?{$_}                     # filter out not empty lines only
    }                               # close the scope and remove all variables created in the scope
}
$r


1

ทับทิม , 67 ไบต์

อินพุตคือรายการของบรรทัด สร้างรายการของบรรทัดและทำการเขียนทับขณะที่ผ่านอินพุตจากนั้นเชื่อมต่อกับบรรทัดใหม่ (แทนค่าด้วยตัวแปร$/) ที่ส่วนท้ายเพื่อจับคู่เอาต์พุตที่เข้มงวด

->i,*r{i.map{|e|j=-1;e.map{|l|r[j+=1]||='';r[j][0,l.size]=l}};r*$/}

ลองออนไลน์!


1

C (GCC, MinGW) 138 ไบต์

สมมติว่า CR วางเคอร์เซอร์ที่จุดเริ่มต้นของบรรทัดปัจจุบัน

d,i,l;f(S,n,p,t)char**S,*p,*t;{for(d=i=0;i<n;d+=l)p=strchr(t=S[i],10),printf("\n%.*s\r"+!!i,l=p?p-t:strlen(t),t),S[i++]+=l+!!p;d&&f(S,n);}

ทดสอบกับ:

int main()
{
    char *test1[] = {"aaaa\naaaa\naaaa\naaaa","bb\nbb\nbb","c"};
    char *test2[] = {"12345\n54321","00\n00\n00\n00","001\n011\n012"};
    char *test3[] = {"sm\noo\nmr\nee\nt!\nh_\ni_\nn_\ng_","!@#$%^\n&*()_+\nqwerty\nuiopas","this\nis_a\ntest"};

    f(test1, 3);
    f(test2, 3);
    f(test3, 3);
}

1

อ็อกเทฟ , 71 67 ไบต์

function y=f(x)
for k=1:size(x)
y(1:(t=size(x{k})),1:t(2))=x{k};end

ฟังก์ชั่นที่ใช้อาร์เรย์เซลล์แนวตั้งของเมทริกซ์ถ่านและส่งกลับเมทริกซ์ถ่าน

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด


1

Javascript (เบราว์เซอร์) , 216 208 204 ไบต์

ความพยายามของฉันที่นี้ ฉันไม่มีความสุขกับขนาดและแน่นอนว่าต้องมีการปรับปรุงให้ดีขึ้นอย่างแน่นอน แต่ฉันไม่ได้มีประสบการณ์ในการเล่นกอล์ฟ

var n='\n',x=s=>s.split``.reverse().join``,i,j,f=a=>a.map(s=>s.split(n).map(y=>x(y))).reduce((a,b)=>{for(i=0;i<b.length;i++){j=a[i];if(!j)j=b[i];a[i]=b[i].padStart(j.length,j)}return a}).map(s=>x(s)).join(n)

อย่างไรก็ตามสิ่งที่ทำคือแยกสตริงทั้งหมดก่อนแล้วย้อนกลับสตริงทั้งหมดจากนั้นในขณะที่วนลูปในแผ่นการทำงานที่ลดลงเริ่มต้นสตริงทั้งหมดเข้าด้วยกัน จากนั้นย้อนกลับสตริงทั้งหมดอีกครั้งจากนั้นรวมสายกลับมาใหม่ด้วย

ขอขอบคุณเป็นพิเศษกับKevin Cruijssen ที่เตือนฉันว่าส่วนสุดท้ายของลูปเกิดขึ้นในตอนท้ายและการประหยัดไบต์ทั้งหมด 8 ไบต์

var n='\n',x=s=>s.split``.reverse().join``,i,j,f=a=>a.map(s=>s.split(n).map(y=>x(y))).reduce((a,b)=>{for(i=0;i<b.length;a[i]=b[i++].padStart(j.length,j))if(!(j=a[i]))j=b[i];return a}).map(s=>x(s)).join(n)

console.log(f(["aaaa\naaaa\naaaa\naaaa","bb\nbb\nbb","c"]));
console.log(f(["12345\n54321","00\n00\n00\n00","001\n011\n012"]));
console.log(f(["sm\noo\nmr\nee\nt!\nh_\ni_\nn_\ng_","!@#$%^\n&*()_+\nqwerty\nuiopas","this\nis_a\ntest"]));


1
ทั้งสอง('')สามารถสอง `เพื่อบันทึกสี่ไบต์ :)
เควิน Cruijssen

1
นอกจากนี้คุณยังสามารถแทนที่ด้วยfor(i=0;i<b.length;i++){j=a[i];if(!j)j=b[i];a[i]=b[i].padStart(j.length,j)} for(i=0;i<b.length;a[i]=b[i++].padStart(j.length,j))if(!(j=a[i]))j=b[i];
Kevin Cruijssen

1
คำสั่งjแรกถูกกำหนดด้วย(j=a[i])ดังนั้นคำสั่ง if จะถูกดำเนินการด้วยif(!...)j=b[i];(โดยที่...คือ(j=a[i])ดังนั้นค่าที่อัพเดตของj ) และจากนั้น;a[i]=b[i++].padStart(j.length,j))จะทำในตอนท้ายของการทำซ้ำสำหรับวง .. ไม่แน่ใจว่าเป็นปัญหาและ มันดูเหมือนว่าจะทำงานอย่างไร
Kevin Cruijssen

1
ooohhh .... * ตาโต * ที่ปลดล็อกบางอย่าง
Tschallacka

1
แต่ถ้าคุณยังไม่เห็นพวกเขาเคล็ดลับสำหรับการเล่นกอล์ฟใน <ทุกภาษา>และเคล็ดลับสำหรับการเล่นกอล์ฟใน JavaScriptอาจทั้งน่าสนใจในการอ่าน :)
Kevin Cruijssen

1

C (gcc) , 51 47 ไบต์

f(char**s){for(;*s;printf("\e[s%s\e[u",*s++));}

ลองออนไลน์!

-4 ไบต์ขอบคุณที่แมวเพดาน

ใช้ลำดับ CSI สำหรับการบันทึก / เรียกคืนตำแหน่งเคอร์เซอร์ เพียงทำซ้ำผ่านอาร์เรย์สตริงที่ส่งผ่าน (ในรูปแบบเดียวกับargv) และพิมพ์<save position>string<restore position>สำหรับแต่ละรายการ

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


1

Japtap -P , 7 ไบต์

รับอินพุตเป็นอาร์เรย์ของสตริงหลายบรรทัดส่งเอาต์พุตสตริงหลายบรรทัดเดี่ยว

ú y_¸¬Ì

ลองมัน

ú y_¸¬Ì     :Implicit input of array
ú           :Right pad each line of each element with spaces to the length of the longest
  y         :Transpose
   _        :Map
    ¸       :  Split on spaces
     ¬      :  Join
      Ì     :  Last character
            :Implicitly join and output

1

แบบสอบถาม T-SQL, 297 295 ไบต์

การใช้¶เป็นตัวคั่นและตัวแปรตารางเป็นอินพุต

DECLARE @ table(a varchar(max),k int identity(1,1))
INSERT @ values('aaaa¶aaaa¶aaaa¶aaaa'),('bb¶bv¶bb'),('c');

WITH c as(SELECT k,row_number()over(partition
by k order by k)s,value v FROM @ CROSS APPLY
string_split(a,'¶')s),m(i,l,e)as(SELECT*FROM c
WHERE k=1UNION ALL
SELECT k,s,STUFF(e,1,len(v),v)FROM m
JOIN c ON-~i=k and s=l)SELECT
top 1with ties e FROM m
ORDER BY rank()over(partition by l order by-i)

ลองออนไลน์


1

Javascript (เบราว์เซอร์), 129 124 ไบต์

ความพยายามครั้งแรกของฉันในการตีกอล์ฟ ฉันอ่านลิงก์ที่ให้ไว้ในกฎ (ช่องโหว่กฎมาตรฐาน ... ) ดังนั้นฉันหวังว่าฉันจะทำอะไรผิดพลาด!


ฉันเก็บอินพุตตามที่อยู่ในโพสต์แรก (รูปแบบอาร์เรย์แบน)

_=o=>{o=o.map(i=>i.split`\n`),r=o.shift();for(a of o)for(l in a)b=a[l],r[l]=r[l]?b+r[l].slice(b.length):b;return r.join`\n`}

ขอบคุณKevin Cruijssenสำหรับการบันทึก 5 ไบต์


แบบทดสอบ:


1
ยินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดี +1 จากฉัน สิ่งเล็ก ๆ น้อย ๆ ในการเล่นกอล์ฟfor(a of o){for(l in a){b=a[l],r[l]=(r[l])?b+r[l].slice(b.length):b}}สามารถเป็นได้for(a of o)for(l in a)b=a[l],r[l]=r[l]?b+r[l].slice(b.length):b;:)
Kevin Cruijssen

1
@KevinCruijssen - ขอบคุณฉันอัปเดตโพสต์แล้ว! ฉันอ่านคำแนะนำทั้งสองนี้ก่อนโพสต์ทั้งคู่มีประโยชน์ แต่ฉันอาจพลาดเทคนิคบางอย่างที่สามารถปรับปรุงความพยายามของฉันได้มากขึ้น!
Kévin Bibollet

1
อีกสิ่งหนึ่งจากความคิดเห็นแรกของคุณที่คุณพลาดคือวงเล็บ=(r[l])?ที่สามารถลบออกได้=r[l]?:)
Kevin Cruijssen

1
@ rKévinBibolletก็จำเป็นเพื่อที่จะกลับมาผลสุดท้ายของการ ก็ไม่มีผลลัพธ์ของการทำแผนที่จะถูกส่งกลับแทน
Shaggy

1
หากคุณต้องการรักษารูปแบบ I / O ที่ใช้ในกรณีทดสอบคุณสามารถลงได้ถึง85 ไบต์แต่คุณควรทราบว่า I / O นั้นมีความยืดหยุ่น
Shaggy

1

Pyth , 18 ไบต์

L.tb0VyQsme #dy #N

ลองออนไลน์! (หมายเหตุ: โค้ดจะประเมินเพียงหนึ่งบล็อกเท่านั้นโหมดทดสอบของล่ามจะรันโปรแกรมหนึ่งครั้งสำหรับแต่ละบรรทัดอินพุต)

ขึ้นอยู่กับTFeld ของงูหลาม 2 วิธีการแก้ปัญหา

คำอธิบาย:

L.tb0         # define a lambda function called y which does a transpose, padding with integer 0's
VyQ           # loop over transposed first input line (Q = eval(input()) ) (loop index = N)
   s          # concatenate array of strings (implicitly printed)
    m         # map over
         y #N # transpose of non-falsy values of N
     e        # for each item: last element of array
       #d     # relevant space at the start! filter with identity function, removes falsy values

สำหรับคำอธิบายว่าทำไมอัลกอริธึมทำงานให้ดูคำตอบของ TFeld


0

ถ่าน 4 ไบต์

FθPι

ลองมันออนไลน์ (verbose)หรือลองออนไลน์ (บริสุทธิ์)

คำอธิบาย:

วนซ้ำรายการอินพุตของสตริงหลายบรรทัด:

For(q)
Fθ

และพิมพ์สตริงหลายบรรทัดโดยไม่เลื่อนเคอร์เซอร์:

Multiprint(i);
Pι
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.