Створіть ASCII мистецтво незмінне!


11

З огляду на рядок подібного мистецтва ASCII (Це не мистецтво ASCII, але це буде зроблено для прикладу):

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 art на ньому. Це виглядало цікаво, тому я вирішив зробити з цього виклик.


Тестові приклади:

Оскільки було б надто багато роботи, щоб показати кожен крок для кожного тестового випадку окремо, я перегляну кожну відповідь, щоб переконатися, що вона достовірна. Переконайтеся, що у відповіді можна обробляти тестові випадки.

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

Це пастебін .

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

Відповіді:


2

Bash (з GNU coreutils), 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 байти

Петлі по довжині вхідного рядка, як рішення официаліму

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 байти, щоб перейти лише на ширину найдовшого рядка, відповідь Баша Аль Фрксстрема

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', групи не загортаються з одного рядка в інший. Якщо у регулярному вираженні використовується група захоплення, тоді re.split () повертає список із зібраними групами за непарними індексами. Вони знайдені за допомогою [1 :: 2].

Використовує python 3.6 f-string, щоб зробити шаблон повторного залежно від ширини групи i.

* Перед re.split () використовує розпакування python 3.6 для перетворення списку в аргументи для оператора print. Аналогічно, * '\ n' * 75 перетворюється на 75 '\ n' аргументів до оператора print. Із аргументом ключового слова для друку sep = '\ n' в результаті виводиться приблизно 150 порожніх рядків для очищення екрана, а потім кожна група символів в окремому рядку.


Цей спосіб кращий і коротший, ніж мій. Чудова робота! (У)
officialaimm

2

Пітон 3,5 ( 238 233 229 225 223 222 байт)

- прекрасно працює в терміналі Windows; не впевнений в інших платформах через специфічну для системи команду 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 байти: стенограма для len (s)
  • Збережені 4 байти: завдяки блискавці (скорочення для друку)
  • збережено 2 байти: завдяки sparklepony (скорочення для діапазону як r і r (0, i) як діапазон (i))
  • збережений 1 байт: завдяки steve (0,5 як раз .5)

1
Класно! Я думаю , ви могли б збрити кілька байт за допомогою коду z=printу верхній частині, а потім змінити всі інші екземпляри print()в z().
Товариш SparklePony

1
Я думаю , що ти холодний робити те ж саме, що і з printзrange , а не range(0,3)використовуєш range(3).
Товариш SparklePony

1
sleep(0.5)можна переписати як простоsleep(.5)
steve
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.