สร้าง ASCII art unjumble!


11

รับสตริงของ ASCII art เช่นนี้ (นี่ไม่ใช่ ASCII art แต่มันจะทำเพื่อเป็นตัวอย่าง):

abc
d e
fgh

สับสนราวกับว่ามันถูกแสดงบนหน้าจอที่มีหนึ่งตัวอักษรต่อบรรทัดเช่น:

a
b
c
d

e
f
g
h

พิมพ์ผลลัพธ์รอหนึ่งวินาที± 0.5 วินาทีก่อนทำการเทอร์มินัลและพิมพ์สิ่งเดียวกัน แต่มี 2 อักขระแสดงต่อบรรทัดแทน 1 โดยทั่วไปความกว้างของหน้าจอจะเปลี่ยนจาก 1 เป็น 2

ab
c
d 
e
fg
h

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

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

abcdefg
ab

จะพิมพ์ต่อไปนี้เมื่อความยาวหน้าจอเท่ากับ 4

abcd
efg
ab

คุณสามารถค้นหาผลกระทบของการปรับขนาดขั้วที่นี่: https://repl.it/GoeU/1 เรียกใช้โปรแกรมจากนั้นลากสิ่งที่แยกเทอร์มินัลออกจากเท็กซ์เอดิเตอร์ไปมา

ชี้แจง:

เมื่อบรรทัดปรากฏขึ้นอย่างชัดเจนว่ามีการป้อนข้อมูลอย่างไรคุณสามารถปล่อยให้บรรทัดนั้นอยู่ตามลำพังเพื่อนับจำนวนอักขระที่ใหญ่ขึ้นในอนาคตต่อบรรทัด

abc
ab

ควรพิมพ์

ab
c
ab

เมื่อความยาวของประโยค = 2


นี่คือจำนวนไบต์น้อยที่สุดจึงจะชนะ!

กฎ:

  • ต้องพิมพ์ไปที่ STDOUT เป็นเอาต์พุตเท่านั้น
  • ต้องล้างเครื่องหรือสร้างภาพลวงตาของการล้างเครื่องโดยเพิ่ม 150 หรือมากกว่านั้น
  • สามารถรับอินพุตด้วยวิธีมาตรฐาน
  • ใช้ช่องโหว่เริ่มต้น
  • ต่อท้ายสิ่งที่มีข้อความไม่เป็นไร

ความคิดนี้มาถึงฉันเมื่อฉันปรับขนาดเทอร์มินัลด้วยศิลปะ ASCII บนมัน มันดูน่าสนใจดังนั้นฉันตัดสินใจที่จะทำสิ่งที่ท้าทาย


กรณีทดสอบ:

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

 ______   ______     __     __   __     ______      __    __     ______    
/\  == \ /\  == \   /\ \   /\ "-.\ \   /\__  _\    /\ "-./  \   /\  ___\   
\ \  _-/ \ \  __<   \ \ \  \ \ \-.  \  \/_/\ \/    \ \ \-./\ \  \ \  __\   
 \ \_\    \ \_\ \_\  \ \_\  \ \_\\"\_\    \ \_\     \ \_\ \ \_\  \ \_____\ 
  \/_/     \/_/ /_/   \/_/   \/_/ \/_/     \/_/      \/_/  \/_/   \/_____/ 

Pastebinนี้

                        __/\__
                        \    /
                  __/\__/    \__/\__
                  \                /
                  /_              _\
                    \            /
      __/\__      __/            \__      __/\__
      \    /      \                /      \    /
__/\__/    \__/\__/                \__/\__/    \__/\__

คำตอบ:


2

Bash (ที่มี coreutils ของ GNU), 69 ไบต์

n=`tee x|wc -L`;for i in `seq 1 $n`;do fold -w$i x;sleep 1;clear;done

บันทึกอินพุตในไฟล์ชั่วคราวxจากนั้นนับบรรทัดที่ยาวที่สุด (GNU coreutils ' wcมี-Lแฟล็กสำหรับสิ่งนี้) และวนซ้ำสำหรับแต่ละความกว้างคอนโซลตั้งแต่ 1 ถึงความยาวบรรทัดที่ยาวที่สุด fold, sleepและclearส่วนที่เหลือของมายากล


3

Python 3.6, 124 ไบต์

วนรอบความยาวของสตริงอินพุตเหมือนกับโซลูชันของaimaimm

import re,time
def d(s):
 for i in range(len(s)):print(*'\n'*75,*re.split(f'(.{{1,{i+1}}})',s)[1::2],sep='\n');time.sleep(1)

143 ไบต์ไปที่ความกว้างของบรรทัดที่ยาวที่สุดเท่านั้นคำตอบ Bash ของ al Frxstrem

import re,time
def d(s):
 for i in range(max(map(len,s.split()))):print(*'\n'*75,*re.split(f'(.{{1,{i+1}}})', s)[1::2],sep='\n');time.sleep(.5)

ใช้ "re.split ((. {1, i + 1}))" เพื่อแบ่งสตริงออกเป็นกลุ่มของอักขระ เพราะ '.' ไม่ตรงกับ '\ n' กลุ่มไม่ล้อมรอบจากบรรทัดหนึ่งไปอีกบรรทัด หาก regex ใช้กลุ่มการจับภาพแล้ว re.split () จะส่งคืนรายการที่มีกลุ่มที่จับคู่ที่ดัชนีคี่ สิ่งเหล่านี้ถูกเรียกคืนด้วย [1 :: 2]

ใช้ p-3.6 f-string เพื่อทำให้รูปแบบใหม่ขึ้นอยู่กับความกว้างกลุ่ม i

The * in ด้านหน้าของ re.split () ใช้ python 3.6 ในการเปิดกล่องเพื่อเปลี่ยนรายการให้เป็นอาร์กิวเมนต์ไปยังคำสั่ง print ในทำนองเดียวกัน * '\ n' * 75 จะเปลี่ยนเป็นอาร์กิวเมนต์ 75 '\ n' ต่อคำสั่งการพิมพ์ ด้วยอาร์กิวเมนต์คำหลักที่พิมพ์ sep = '\ n' ผลลัพธ์จะพิมพ์ประมาณ 150 บรรทัดว่างเพื่อล้างหน้าจอตามด้วยกลุ่มอักขระแต่ละกลุ่มในบรรทัดแยกต่างหาก


อันนี้ดีกว่าและสั้นกว่าของฉัน เยี่ยมมาก! (y)
ทางราชการ

2

Python 3.5 ( 238 233 229 225 223 222 ไบต์)

- ทำงานได้ดีในหน้าต่าง terminal; ไม่แน่ใจเกี่ยวกับแพลตฟอร์มอื่น ๆ เนื่องจากคำสั่ง os.system ("cls") เฉพาะระบบ

- สตริงที่ส่งผ่านควรทำเครื่องหมาย \ n สำหรับบรรทัดใหม่เช่น: 'abc \ nd efgh \ n'

import os,time 
def b(s):
 p=len(s);z=print;r=range
 for i in r(1,p):
  os.system("cls");l=0
  for j in r(p):
   z(s[j],end="");l+=1
   if(s[j]=='\n'):l=0
   if(j+1<p and l==i and s[j+1]!='\n'):z();l=0
  z();time.sleep(.5)
  • บันทึก 5 ไบต์: ลบช่องว่างที่ไม่ต้องการออก
  • บันทึก 4 ไบต์: shorthand สำหรับ len (s)
  • บันทึกแล้ว 4 ไบต์: ขอบคุณsparklepony (ชวเลขสำหรับการพิมพ์)
  • บันทึก 2 ไบต์: ขอบคุณsparklepony (ชวเลขสำหรับช่วงเป็น r และ r (0, i) เป็นช่วง (i))
  • บันทึกแล้ว 1 ไบต์: ขอบคุณสตีฟ (0.5 เพียง 0.5)

1
เย็น! ฉันคิดว่าคุณสามารถโกนไบต์บางอย่างโดยใช้รหัสz=printที่ด้านบนแล้วเปลี่ยนกรณีอื่น ๆ ทั้งหมดของการprint() z()
สหาย SparklePony

1
ฉันคิดว่าคุณเย็นทำสิ่งเดียวกันกับที่คุณทำprintกับrangeและแทนที่จะใช้range(0,3) range(3)
สหาย SparklePony

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