Создайте непревзойденное искусство 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. Это выглядело интересно, поэтому я решил сделать из этого вызов.


Тестовые случаи:

Поскольку было бы слишком много работы, чтобы показать каждый шаг для каждого тестового примера в отдельности, я рассмотрю каждый ответ, чтобы убедиться в его правильности. Убедитесь, что ответ может справиться с контрольными случаями.

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

Это пастин .

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

Ответы:


2

Bash (с ядром 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 байта

Зацикливается на длину входной строки, как решение officialaimm

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 байта, чтобы идти только на ширину самой длинной строки в ответе Frxstrem's Bash

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, чтобы шаблон re зависел от ширины группы i.

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


Это намного лучше и короче, чем у меня. Отличная работа! (y)
officialaimm

2

Python 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 байта: благодаря sparklepony (сокращение для печати)
  • сохранено 2 байта: благодаря sparklepony (сокращение для диапазона как r и r (0, i) как range (i))
  • сохранено 1 байт: благодаря Стиву (0.5 как раз .5)

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

1
Я думаю, что вы делаете то же самое, что и с printпомощью range, и вместо того, чтобы range(0,3)использовать range(3).
Товарищ SparklePony

1
sleep(0.5)можно переписать простоsleep(.5)
Стив
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.