Цель: написать программу или функцию, которая печатает входную строку в форме синусоиды.
Синусоида ASCII
Вот один период синусоиды:
.......
... ...
.. ..
. .
. .
. .
. . .
. .
. .
. .
.. ..
... ...
.......
Обратите внимание, что в каждом столбце есть ровно одна точка.
- Каждый символ во входной строке заменит точку в форме выше, слева направо.
- Пробелы во входных данных должны выводиться как обычные символы вместо точки.
- Начальный символ соответствует крайней левой точке на рисунке выше.
- Это только один период, входные данные могут быть длиннее, чем количество точек выше.
вход
- Входные данные - это строки ASCII, которые содержат только символы между десятичным ASCII 32 (пробел) и десятичным ASCII 126 (тильда ~).
- Входные данные всегда будут только одной строкой (без разрывов строки).
- Входные данные могут быть получены через STDIN, параметры функции, аргументы командной строки или что-либо подобное.
Выход
- Вывод должен быть напечатан точно так же, как в тестовых случаях.
- Конечные пробелы в строках допускаются, если длина строки с этими конечными пробелами не превышает длину самой длинной строки (той, в которой указан последний символ).
- Не допускается ведущая / ведомая линия.
Контрольные примеры
- Входные данные:
.................................................
Выход:
.......
... ...
.. ..
. .
. .
. .
. . .
. .
. .
. .
.. ..
... ...
.......
- Входные данные:
Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.
Выход:
ng Puzz ion and siasts stratio
mmi les est an thu and egi n r
ra & qu sw en c r eq
g e o o u
o C a r e d n i
r o l e r
P d s s z , e
e i i z g e d
t u o e .
G e e p l r
ol ng f g fe f
f S cha or min rs. 00%
tack Ex program It's 1
- Входные данные:
Short text.
Выход:
t.
tex
t
r
o
h
S
- Входные данные:
The quick brown fox jumps over the lazy dog
Выход:
brown
ick fox
qu j
u
e m
h p
T s
o
v
er
th dog
e lazy
счет
Это код-гольф , поэтому выигрывает самая короткая программа или функция в байтах.
sin
функцию, чтобы воспроизвести ее, но позиции немного отклонились.)Ответы:
Pyth, 59 байтов (57 символов)
Демонстрация.
Внутри закодирована двоичная таблица поиска
, которая имеет значение 3912. Она преобразуется в двоичную, давая[1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0]
. Это рассматривается как разница между последовательными высотами. Путем добавления 6, формирования всех префиксов и сопоставления каждого с его суммой генерируется первая четверть волны.sM._+6jC\2
оценивается[6, 7, 8, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12]
как описано выше. Затем код объединяется на обратной стороне этой строки, образуя первую половину волны, а затем вычитает ее из 12, чтобы получить всю волну.Затем мы формируем строки каждого входного символа, за которым следуют 12 пробелов. Эта линия поворачивается вправо с помощью параметра высоты волны, соответствующего этому местоположению, а затем линии транспонируются и соединяются на новых строках.
Затем мы убираем начальные и конечные пустые строки. Однако мы не можем убрать начальные или конечные пустые строки, в которых есть пробелы от ввода. Это реализуется путем замены пробелов во входных данных на tabs (
C9
), которые не могут быть во входных данных, удаления пустых строк и превращения вкладок обратно в пробелы.источник
Python 2, 156 байт
объяснение
Весь код просто создает блок пробелов (
o
) и заменяет нужные пробелы буквами вводаt
.Переменная
l
хранит список смещений сверху. Так чтоn
символt
должен быть на линииl[n]
.Bytearray
o
служит изменяемой строкой, так как строки являются неизменяемыми в python.-~h
то же самое,h+1
но экономит место, потому что мне не нужны скобки.источник
Ява,
219209199 байтЯ все еще новичок здесь, и надеюсь, что это соответствует правилам для введения подфункции (когда подсчитываются байты этой функции, конечно). Если нет, я постараюсь преобразовать
sin
функцию в какой-нибудь умный поиск в массиве ...источник
char[]
. Здесь было бы избавиться от()
наlength
и ликвидации ,charAt()
а также. Если я правильно читаю, вы также можете использоватьprint()
вместо того,println()
чтобы сохранить еще пару....a<24?s(24-a):-s(a-24);
и назовите егоs(c%48)
.Perl, 222 байта
Требуется
-E
дляsay
, сохраняет позиции как целые числа, приведенные к двоичным числам, и переворачивание массива, вероятно, не очень эффективно в байтовом выражении. Кроме того, я уверен, что есть много способов сэкономить, поэтому я буду продолжать тыкать и подталкивать.Пример вывода:
источник
JavaScript,
251243224220217Реально простая реализация: он использует строку символов для представления y-позиции каждого символа в волне (смещение
a
, которое является кодом ASCII 97). Затем он перебирает все возможные строки; если значение y текущей строки совпадает с положением y на волне, он записывает символ из строки. В конце также есть очистка для удаления строки, если она оказалась совершенно пустой.Обратите внимание, что вывод будет отображаться некорректно в
alert()
окне, если он не использует моноширинный шрифт, вы можете изменить его,console.log()
чтобы убедиться, что вывод верен.EDIT1:
++
и--
существует.EDIT2: удаление пустых строк теперь выполняется в том же цикле, что и остальные, сохраняя 17 символов. Эти скобки тоже не нужны, для дополнительных 2 символов.
EDIT3: не нужно объявлять форму сигнала как переменную, сохраняя 4 символа.
РЕДАКТИРОВАТЬ 4: Как отметил Dom Hastings в комментариях, количество байтов включало возврат каретки, а также символ новой строки, обновлял количество байтов для всех ревизий, чтобы исключить возврат каретки.
РЕДАКТИРОВАТЬ5: Сохранено 3 байта любезно предоставлено Dom Hastings. Я не реализовал это
o.splice
исправление, так как при этом не удаляются пустые строки (по крайней мере, с моей стороны).источник
if(o[i++].trim().length<1)o.splice(--i,1)
наo.splice(i-(t=!o[i++].match(/\s/)),t)
, для -4,s=prompt() o=[]
на:,s=prompt(o=[])
-1 иfor(y=0,i=0;y<13;++y){o[i]=""
наfor(y=i=0;y<13;++y){o[i]=""
, -2. Вероятно, возможно объединить ваши циклы for, чтобы сэкономить больше ... И последнее. Стоит также отметить, что у меня есть только 220 для вашего текущего количества байтов, так что ваши 225 могут быть окнами,\r\n
а не только тем,\n
который я могу игнорировать. (пожалуйста, поправьте меня, если я ошибаюсь) ...for(s=prompt(),y=0;y<13;y++,v.trim()&&console.log(v))for(v="",x=0;x<s.length;x++)v+=y=="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97?s[x]:" "
for(s=prompt(y=0);y<13;y++,v.trim()&&console.log(v))for(v="",x=0;x<s.length;x++)v+="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97-y?" ":s[x]
Matlab,
133, 130 байтОдин лайнер:
И расширенная версия:
Один вкладыш принимает данные из консоли (
stdin
) и составляет 130 байтов. Расширенная версия заменяет ввод консоли определением функции (+1 байт), но ее гораздо удобнее использовать для теста в цикле:Описание:
Индекс строки каждого символа рассчитывается на половину периода, затем отражается и объединяется для получения полного периода.
Мы создаем пустой фон символа пробела (той же длины, что и входная строка. Мы помещаем каждый символ в соответствии с его положением в соответствующей строке. Если длина входной строки превышает один период,
mod
оператор (по модулю) переносит это, поэтому мы не t выйти за границы при запросе номера строки.Прецедент:
Сохраните версию функции под
textsine.m
вашим путем, затем запустите:будет выводить:
если вы хотите , чтобы проверить версию один лайнер с участием
stdin
, ваш вход должен быть введен как один синглstring
, так что вы должны были бы вложить свой вклад между'
символами. Пример:Спасибо,
Luis Mendo
что побрили 3 байта ;-)источник
s=input('');
все равно работал.Scala 377 символов
первый срез вероятно, можно получить лучшую формулу для перевода
x
наy
источник
Common Lisp, 205 байт
тесты
Смотрите http://pastebin.com/raw.php?i=zZ520FTU
замечания
Выведите вывод построчно, вычисляя индексы в строках, которые должны быть напечатаны, используя функцию обратного синуса
asin
. Выходные данные не полностью соответствуют ожидаемым входным данным в вопросе, но, поскольку OP признает, что выходные данные примера не являются истинными синусами, я думаю, это нормально. По крайней мере, для каждого столбца всегда записывается только один символ.источник
Python 2, 172 байта
Это не так хорошо, как ответ Алекса Л. , но это довольно близко. Принимает данные из стандартного ввода и лучше всего работает в
.py
файле.Я решил построить результат транспонирования (каждый столбец является строкой), а затем транспонировать результат, так как в Python транспонирование матрицы
map(*m)
.l
: Бинарное представление9960000
(после отключения"0b"
отbin
) -100101111111101001000000
. Это «шаг» синусоидальной волны каждого столбца, начиная с самого последнего символа самой нижней точки. Я копирую этот список, отменяю каждое число и прикрепляю его к концу, чтобы сформировать то, что фактически является производной функции.s
: Это переменная, которая отслеживает, в какую строку (столбец в транспонировании) вставляется следующий символ.o
: Конечный вывод, транспонированныйi
: Отслеживает период синусоиды. Начинается с 9, такl
как немного сдвинут.В
for
цикле я создаю список из 13 пробелов (я использовал байт-массивы, но в списках символов оказывается более короткое выражение для печати), а затем заменяю этотs
символ входным символом. Добавитьb
в конецo
, добавить соответствующий шагs
и увеличитьi
.Я надеялся, что это
print
заявление будет таким же простым\n'.join(*zip(o))
, но не повезло.zip(*o+['\n'*13])[::-1]
добавляет столбец новых строк, а затем переворачивает и транспонирует все это (без реверса, синусоида переворачивается вверх ногами),sum(...,())
объединяет кортежи в один кортеж символов, а затем''.join(...)
объединяет символы и печатает его.Другими вещами, которые я пробовал, было создание массива из 12 символов и вставка нового символа в соответствующее место, а также замена
l+=[-c for c in l];
какой-то математикой с неким умножением1
и-1
результатом индексацииl
, но я ничего не мог придумать в конечном итоге был короче.источник
Mathematica, 131 байт
Это 131 символов, включая три для
i=foo;
. Это казалось разумным способом принять участие; Я мог бы положить это прямо в определениеc
и сохранить несколько штрихов, но это кажется несправедливым.Это довольно просто - почти даже читабельно. Он разбивает строку на список символов, а затем помещает эти символы в разреженный массив в позициях, определенных из
Table
(любая точка в массиве, для которой не задан символ, по умолчанию является пробелом). Строки собираются отдельно, а между ними появляются новые строки. Последний StringJoin сшивает все это.NB: Как и некоторые другие решения, это может на самом деле не быть действительным, потому что это дает настоящую синусоиду, а не (красивый) пример ручной работы.
тесты:
источник