Bir ASCII sanatını yaratan yaratın!


11

Böyle bir ASCII sanatı dizisi verildi (Bu ASCII sanatı değil, örnek için yapılacaktır):

abc
d e
fgh

Satır başına bir karakter içeren bir ekranda görüntüleniyormuş gibi karıştırın, şöyle:

a
b
c
d

e
f
g
h

Sonucu yazdırın, terminali ve baskıyı aynı şeyi temizlemeden önce bir saniye, ± 0,5 saniye bekleyin, ancak 1 yerine satır başına 2 karakter görüntülenir. Temelde, ekranın genişliği 1'den 2'ye döner.

ab
c
d 
e
fg
h

Sonra boşluk dikkat edin d. Beklemeyi tekrarlayın, ardından girilen metin çıkana kadar satır başına ek bir karakterle yazdırın.

Karakterleri yazdırmaya çalışırken bir satırın sonuna gelirseniz, yeni bir satır ekler ve bu kuralı izleyerek geri kalanlarını yazdırırsınız. Örneğin giriş:

abcdefg
ab

Ekran uzunluğu 4 olduğunda aşağıdakileri basarsınız.

abcd
efg
ab

Terminal yeniden boyutlandırmasının etkisini burada bulabilirsiniz: https://repl.it/GoeU/1 . Programı çalıştırın, sonra terminali ayıran şeyi metin düzenleyiciden ileri geri sürükleyin.

Açıklama:

Bir satır tam olarak nasıl girildiği göründüğünde, satır başına gelecekteki daha büyük karakter sayıları için bu satırı tek başına bırakabilirsiniz.

abc
ab

yazdırmalı

ab
c
ab

cümle uzunluğu = 2.


Bu , yani en az bayt miktarı kazanır!

Kurallar:

  • Tek çıktı STDOUT'a yazdırılmalıdır.
  • Terminali temizlemeli veya 150 veya daha fazla boş satır ekleyerek terminali temizleme yanılsaması yaratmalıdır.
  • Standart yöntemlerle girdi alabilir.
  • Varsayılan boşluklar uygulanır.
  • Metin ile sondaki şeyler TAMAM DEĞİLDİR.

Bu fikir, üzerinde ASCII sanatı olan bir terminali yeniden boyutlandırırken bana geldi. İlginç görünüyordu, bu yüzden ondan bir meydan okumaya karar verdim.


Test senaryoları:

Her test durumu için her adımı ayrı ayrı göstermek çok fazla iş olacağından, geçerli olduğundan emin olmak için her cevabı gözden geçireceğim. Cevabın test senaryolarını ele alabildiğinden emin olun.

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

Bu hamur işi .

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

Yanıtlar:


2

Bash (GNU coreutils ile), 69 bayt

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

Girişi geçici dosyaya kaydeder x, ardından en uzun satırı sayar (GNU coreutils ' wcbunun -Lbayrağı vardır ) ve her konsol genişliği için 1'den en uzun satır uzunluğuna kadar tekrarlar. fold, sleepVe clearbüyü geri kalanı yok.


3

Python 3.6, 124 bayt

Officialaimm'in çözümü gibi giriş dizesinin uzunluğu boyunca döngüler

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 bayt sadece en uzun satır genişliğine gitmek için bir Frxstrem'in Bash cevabı

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)

Dizeyi karakter gruplarına ayırmak için "re.split ((. {1, i + 1}))" kullanır. Çünkü '.' '\ n' ile eşleşmezse, gruplar bir satırdan diğerine sarılmaz. Normal ifade bir yakalama grubu kullanıyorsa, re.split () yöntemi, eşleşen grupların tek dizinlerde olduğu bir liste döndürür. Bunlar [1 :: 2] ile alınır.

Yeniden desenini grup genişliğine i bağlı kılmak için python 3.6 f-string kullanır.

Re.split () öğesinin önündeki *, listeyi print deyimine yönelik bağımsız değişkenlere dönüştürmek için python 3.6 paketini açma işlevini kullanır. Benzer şekilde * '\ n' * 75, print deyiminde 75 '\ n' bağımsız değişkenine dönüşür. Sep = '\ n' anahtar kelimesini yazdır argümanı ile sonuç, ekranı temizlemek için yaklaşık 150 boş satır ve ardından her bir karakter grubunu ayrı bir satırda yazdırmaktır.


Bunlar benimkinden çok daha iyi ve daha kısa. İyi iş! (y)
officialaimm

2

Python 3.5 ( 238 233 229 225 223 222 bayt)

- Windows terminalinde iyi çalışıyor; sisteme özgü os.system ("cls") komutu nedeniyle diğer platformlardan emin değilim.

- Geçirilen dize, yeni satırlar için \ n ile işaretlenmelidir; örneğin: '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 bayt kaydedildi: istenmeyen boşlukları kaldırdı
  • 4 bayt kaydedildi: len (ler) için kestirme
  • 4 bayt kaydedildi: Sparklepony sayesinde (baskı için kısayol)
  • 2 bayt kaydedildi: Sparklepony sayesinde (aralık olarak r ve r (0, i) olarak aralık (i))
  • 1 bayt kaydedildi: steve sayesinde (sadece 0,5 olarak 0,5)

1
Güzel! Sana kodu kullanarak bazı bayt traş düşünüyorum z=printüstünde ve daha sonra diğer tüm örneklerini değişen print()için z().
SparklePony Yoldaş

1
Farklı görüşe sahip yaptığının aynısını yapmak soğuk düşünüyorum printile rangeve yerine range(0,3)kullanılması range(3).
SparklePony Yoldaş

1
sleep(0.5)sadece olarak yeniden yazılabilirsleep(.5)
steve
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.