Stwórz dzieło sztuki ASCII niezmieszalne!

11

Biorąc pod uwagę ciąg takich znaków ASCII (to nie jest grafika ASCII, ale wystarczy na przykład):

abc
d e
fgh

Zmieszaj go tak, jakby był wyświetlany na ekranie z jednym znakiem w wierszu, tak:

a
b
c
d

e
f
g
h

Wydrukuj wynik, odczekaj sekundę ± 0,5 sekundy przed wyczyszczeniem terminala i wydrukuj to samo, ale z 2 znakami wyświetlanymi w wierszu zamiast 1. Zasadniczo szerokość wyświetlacza zmienia się z 1 na 2.

ab
c
d 
e
fg
h

Zwróć uwagę na miejsce po d. Powtórz czekanie, a następnie drukuj z dodatkowym znakiem w wierszu, aż zostanie wyprowadzony wprowadzony tekst.

Jeśli uderzysz w koniec wiersza podczas próby drukowania znaków, wstawisz nowy wiersz i wydrukujesz resztę zgodnie z tą regułą. Na przykład dane wejściowe:

abcdefg
ab

Wydrukowałby następujące, gdy długość wyświetlania wynosi 4.

abcd
efg
ab

Efekt zmiany rozmiaru terminala można znaleźć tutaj: https://repl.it/GoeU/1 . Uruchom program, a następnie przeciągnij rzecz oddzielającą terminal od edytora tekstu tam iz powrotem.

Wyjaśnienie:

Gdy linia pojawi się dokładnie tak, jak została wprowadzona, możesz pozostawić tę linię w spokoju, aby w przyszłości liczba znaków była większa.

abc
ab

powinien wydrukować

ab
c
ab

gdy długość zdania = 2.


To jest , więc wygrywa najmniej bajtów!

Zasady:

  • Należy wydrukować do STDOUT jako jedynego wyjścia.
  • Musisz wyczyścić terminal lub stworzyć iluzję czyszczenia terminala, dodając około 150 pustych linii.
  • Potrafi przyjmować dane wejściowe standardowymi metodami.
  • Obowiązują domyślne luki.
  • Śledzenie tekstu z tekstem NIE JEST OK.

Ten pomysł przyszedł mi do głowy, gdy zmieniałem rozmiar terminala ze grafiką ASCII. Wyglądało to interesująco, więc postanowiłem podjąć wyzwanie.


Przypadki testowe:

Ponieważ pokazanie każdego kroku indywidualnie dla każdego przypadku testowego byłoby zbyt pracochłonne, przejrzę każdą odpowiedź, aby upewnić się, że jest poprawna. Upewnij się, że odpowiedź może obsłużyć przypadki testowe.

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

Ten pastebin .

                        __/\__
                        \    /
                  __/\__/    \__/\__
                  \                /
                  /_              _\
                    \            /
      __/\__      __/            \__      __/\__
      \    /      \                /      \    /
__/\__/    \__/\__/                \__/\__/    \__/\__
Towarzyszu SparklePony
źródło

Odpowiedzi:

2

Bash (z rdzeniami GNU), 69 bajtów

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

Zapisuje dane wejściowe w pliku tymczasowym x, a następnie zlicza najdłuższą linię (GNU coreutils wcma -Ldo tego flagę) i iteruje dla każdej szerokości konsoli od 1 do najdłuższej linii. fold, sleepI clearrobi resztę magii.

Frxstrem
źródło
3

Python 3.6, 124 bajty

Pętle na długości łańcucha wejściowego, jak rozwiązanie oficjalne

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 bajty, aby przejść tylko na szerokość najdłuższej linii w odpowiedzi 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)

Używa „re.split ((. {1, i + 1}))”, aby podzielić ciąg na grupy znaków. Bo '.' nie pasuje do „\ n”, grupy nie zawijają się z jednej linii do drugiej. Jeśli wyrażenie regularne używa grupy przechwytywania, funkcja re.split () zwraca listę z dopasowanymi grupami o nieparzystych indeksach. Są one pobierane za pomocą [1 :: 2].

Używa ciągu f Pythona 3.6, aby wzorzec zależał od szerokości grupy i.

* Przed re.split () używa rozpakowania Pythona 3.6, aby zmienić listę w argumenty instrukcji print. Podobnie, * '\ n' * 75, zamienia się w argumenty 75 '\ n' w instrukcji print. Z argumentem print słowo kluczowe sep = '\ n', wynikiem jest wydrukowanie około 150 pustych linii w celu wyczyszczenia ekranu, a następnie każdej grupy znaków w osobnej linii.

RootTwo
źródło
Te są o wiele lepsze i krótsze niż moje. Dobra robota! (y)
officialaimm
2

Pyton 3,5 ( 238 233 229 225 223 222 bajtów)

- Działa dobrze w terminalu Windows; nie jestem pewien co do innych platform, z powodu specyficznej dla systemu komendy os.system („cls”).

- Przekazany ciąg powinien być oznaczony \ n dla nowych linii, np .: „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)
  • Zapisano 5 bajtów: usunięto niechciane białe znaki
  • Zapisane 4 bajty: skrót dla len (s)
  • Zapisane 4 bajty: Dzięki sparklepony (stenografia do druku)
  • zapisane 2 bajty: Dzięki sparklepony (skrót dla zakresu jako r i r (0, i) jako zakres (i))
  • zapisany 1 bajt: Dzięki Steve (0,5 tylko .5)
Officialaimm
źródło
1
Fajne! Myślę, że możesz zmniejszyć niektóre bajty, używając kodu z=printu góry, a następnie zmieniając wszystkie inne wystąpienia print()na z().
Towarzysz SparklePony,
1
Myślę zimny zrobić to samo zrobiłeś z printz rangei zamiast range(0,3)użycia range(3).
Towarzysz SparklePony,
1
sleep(0.5)można przepisać jako zwykłysleep(.5)
Steve