สร้างสี่เหลี่ยมผืนผ้าข้อความใหม่จากแถบเส้นทแยงมุม


10

ความท้าทายนี้ได้รับแรงบันดาลใจจากคำถาม SOเกี่ยวกับการสำรวจเมทริกซ์โดยการแจกแจงแถบเส้นทแยงมุมทั้งหมด

แทนที่จะเป็นเมทริกซ์ให้พิจารณาบล็อกข้อความ:

ABCD
EFGH
IJKL

การข้ามเส้นทแยงมุม SW-NE ของบล็อกนี้จากซ้ายไปขวาเริ่มจากมุมบนซ้ายและสิ้นสุดที่มุมล่างขวาผลลัพธ์ในเอาต์พุตต่อไปนี้:

A
EB
IFC
JGD
KH
L

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ดำเนินการย้อนกลับของกระบวนการที่อธิบายไว้ข้างต้น นั่นคือชุดแถบเส้นทแยงมุม SW-NE ชุดเอาท์พุทบล็อกของข้อความที่ผลิตมัน

อินพุตและเอาต์พุต

ทั้งอินพุตและเอาต์พุตสามารถแสดงเป็นสตริงด้วยบรรทัดใหม่หรืออาร์เรย์ / รายการของสตริง

ขึ้นบรรทัดใหม่ต่อท้ายเป็นตัวเลือก

ข้อมูลที่ป้อนจะประกอบด้วยอักขระที่พิมพ์ได้อย่างน้อยหนึ่งตัวและสามารถสันนิษฐานได้ว่าถูกต้อง (จะไม่มีความยาวแถวที่ไม่สอดคล้องกัน)

บล็อกผลลัพธ์จะมีจำนวนคอลัมน์มากกว่าหรือเท่ากับจำนวนแถวเสมอ

กรณีทดสอบ

การป้อนข้อมูล:

A

เอาท์พุท:

A

การป้อนข้อมูล:

.
LI
PO.
PV.
CE
G

เอาท์พุท:

.I..
LOVE
PPCG

การป้อนข้อมูล:

M
DA
AIT
LAR
SGI
/OX
/N
/

เอาท์พุท:

MATRIX
DIAGON
ALS///

สตริงอินพุตจะมีช่องว่างหรือไม่?
kirbyfan64sos

นอกจากนี้ช่องว่างต่อท้ายได้รับอนุญาตหรือไม่
kirbyfan64sos

@ kirbyfan64sos ใช่อินพุตอาจมีช่องว่าง อนุญาตให้มีช่องว่างต่อท้ายได้
Cristian Lupascu

คำตอบ:


5

CJam, 23 20 ไบต์

{_z,,Nf*W%\.+zW%sN%}

ลองได้ที่นี่


การใช้ประโยชน์จากรูปแบบการป้อนข้อมูล (และไม่ทำลายช่องว่าง):{_z,,Nf*W%\.+zW%sN%}
เดนนิส

@Dennis ฉันจะนับวงเล็บปีกกาเพราะมันเป็น "ฟังก์ชั่น" หรือไม่? ฉันใหม่กับกอล์ฟ CJam
ลินน์

ใช่. บล็อก (ที่มีเครื่องหมายปีกกา) เป็นทางเลือกที่ใกล้เคียงที่สุดของ CJam สำหรับฟังก์ชัน / แลมบ์ดานิรนามดังนั้นจึงนับเป็น 20 ไบต์
Dennis

3

Python 2, 84

L=[]
for w in input():
 i=0;L+=[''][:len(w)-len(L)]
 for c in w:i-=1;L[i]+=c
print L

อินพุตและเอาต์พุตเป็นรายการของสตริง

input: ['A','EB','IFC','JGD','KH','L']
output: ['ABCD', 'EFGH', 'IJKL']

รายการบรรทัดLเพื่อเอาท์พุทถูกสร้างขึ้นในขณะที่เราอ่านอินพุต อักขระใหม่แต่ละตัวจะต่อท้ายบรรทัดโดยเริ่มจากบรรทัดสุดท้ายi=-1และเลื่อนไปทางด้านหน้า

L+=[''][:len(w)-len(L)]เมื่อใดก็ตามที่การขึ้นบรรทัดใหม่เพื่อเพิ่มยาวเกินไปสำหรับรายการบรรทัดใหม่ที่ว่างเปล่าถูกผนวก: ฉันหวังว่าจะสามารถทำให้ส่วนนี้สั้นลงได้


1

Python 2, 165 162 169 163 ไบต์

import sys
j=map(list,[e.strip() for e in sys.stdin.readlines()])
r=max(1,len(j)-2)
while j:
 s=''
 for b in range(r):s+=j[b].pop()
 j=[e for e in j if e]
 print s

อ่านทุกบรรทัดจากอินพุตจากนั้นเปลี่ยนเป็นรายการ วนซ้ำในขณะที่รายการนั้นมีองค์ประกอบ ในการวนซ้ำแต่ละครั้งจะปรากฏองค์ประกอบสุดท้ายจากจำนวนรายการภายในเท่ากับจำนวนคอลัมน์ในผลลัพธ์ รายการจะถูกล้างและบรรทัดที่พิมพ์

ตัวอย่าง:

$ python rectangle.py << EOF
> A
> EB
> IFC
> JGD
> KH
> L
> EOF
ABCD
EFGH
IJKL
$ python rectangle.py << EOF
> .
> LI
> PO.
> PV.
> CE
> G
> EOF
.I..
LOVE
PPCG
$ python rectangle.py << EOF
> M
> DA
> AIT
> LAR
> SGI
> /OX
> /N
> /
> EOF
MATRIX
DIAGON
ALS///

ขอบคุณw0lfสำหรับการบันทึก 6 ไบต์

PYG , 139 ไบต์

j=M(L,[e.strip() for e in sys.stdin.readlines()])
r=Mx(1,len(j)-2)
while j:
 s=''
 for b in R(r):s+=j[b].pop()
 j=[e for e in j if e]
 P(s)

สิ่งสุดท้ายคือs=''สิ่งที่จำเป็น?
Cristian Lupascu

อามันแอบเข้าไปที่นั่น ขอบคุณ!
เซเลโอ

0

งูหลาม 332 325 ไบต์

เพราะไพ ธ อน

n=[]
v=[]
x=y=-1
l=0
s=""
while 1:
 k=raw_input()
 if len(k)<1:break
 n.append(k)
while 1:
 if l>len(n):break
 y+=1
 try:
    x+=1;k=n[y][x]
    if[x,y]not in v:s+=k;v.append([x,y])
    else:raise
 except:
    try:
     x-=1;k=n[y][x]
     if[x,y]not in v:s+=k;v.append([x,y])
    except:s+="\n";x=-1;y=l;l+=1
print s[:s.rstrip("\n").rfind("\n")]

1
นี่เป็นคำถาม [code-golf] ซึ่งหมายความว่าคำตอบต้องพยายามให้สั้นที่สุด ลองลบพื้นที่ว่างออกและทำให้อัลกอริทึมของคุณง่ายขึ้นเพื่อประหยัดพื้นที่มากขึ้น ลองดูแหล่งข้อมูลดีๆเกี่ยวกับการเล่นกอล์ฟในไพ ธ อนหากคุณต้องการแนวคิด
DankMemes

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