Эта задача довольно проста и использует три разных символа оператора. Ваша задача, учитывая простую последовательность букв, выполните следующую задачу , чтобы закодировать его с помощью <
, >
, *
. Вы можете использовать заглавные или строчные буквы, вам не нужно обрабатывать оба.
Шифр Объяснение
Шифр прост, вы используете операции увеличения и уменьшения, чтобы перейти от буквы 1 к конечной букве, с *
вашей функцией «отправки». Оператор для «увеличения» будет >
и «уменьшения» будет <
.
Пример использования слова adbc
:
- Начните с первой буквы слова, выведите эту букву.
a
- Затем используйте
>
и<
(например, brainfuck), чтобы «перейти» от текущей буквы к следующей.a>
приведет к «поднятию»a
на 1 к буквеb
.a<
может привести к тому,z
что вы уменьшаете букву (она переносится, вы всегда должны выбирать направление, в результате которого происходит НАИМЕНЕЕ число операций). - После вывода правильной минимизированной комбинации
<
и>
выведите a,*
чтобы обозначить, что мы достигли следующей буквы.
Шаги для кодирования adbc
будут:
a # a
a>>>* # ad
a>>>*<<* # adb
a>>>*<<*>* # adbc
Примеры
Шаги для кодирования aza
будут:
a # a
a<* # az
a<*>* # aza
Больше примеров:
"abcdef" = "a>*>*>*>*>*"
"zyaf" = "z<*>>*>>>>>*"
"zzzzzz" = "z*****"
"z" = "z"
"zm" = "z<<<<<<<<<<<<<*" or "z>>>>>>>>>>>>>*" (equidistant)
"zl" = "z>>>>>>>>>>>>*"
"alphabet" = "a>>>>>>>>>>>*>>>>*<<<<<<<<*<<<<<<<*>*>>>*<<<<<<<<<<<*"
"banana" = "b<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*" OR "b<*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*"
"abcdefghijklmnopqrstuvwxyz" = "a>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*"
"abcdefz" = "a>*>*>*>*>*<<<<<<*"
правила
- Мы кодируем, а не декодируем, так что не путайте это.
- Вы можете предположить, что сообщение будет содержать буквы
[A-Z]
или[a-z]
, по вашему выбору. - Вы можете использовать любой не буквенный / цифровой / зарезервированный символ для обозначения
*
(EG$
). - У вас должно быть окончание
*
, оно не подразумевается в повторах. - Вы можете предполагать, что пустых строк нет, но возможен один символ.
- Если он находится на одинаковом расстоянии до следующей буквы, вы можете выбрать направление.
- Это код-гольф , выигрывает наименьшее количество байт.
Пожалуйста, объясните свой ответ, это помогает другим учиться таким образом.
abcdefghijklmnopqrstuvwxyz
а не его собственный ввод?zl
следует использовать>
.alphabet
на мой взгляд ,a>>>>>>>>>>>*>>>>*<<<<<<<<*<<<<<<<*>*>>>*<<<<<<<<<<<*
иzl
должно бытьz>>>>>>>>>>>>*
иbanana
должно второе решение существуетb<*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*
zm
. @jorg хорошие уловы, исправил все это, было ручным трудом.Ответы:
Желе , 17 байт
Вместо символа используется пробел
*
(пробел⁶
или символ новой строки⁷
сохраняет один байт”*
).Работает с любым прописными только или строчным только входом.
Попробуйте онлайн! или посмотрите набор тестов (где эти пробелы пост-заменены на
*
для удобства чтения).Как?
источник
8086 машинный код,
70 6867 байтКак это устроено:
источник
Python 3 , 87 байт
Попробуйте онлайн!
Работает как в нижнем, так и в верхнем регистре.
Программа создает выходную строку,
r
поскольку она перебирает символы во входной строке. Он сохраняет предыдущий символ какp
и вычисляет инкрементную операцию для переходаp
к новому символуc
.Интервал между символами равен
ord(c)-ord(p)
, и(ord(c)-ord(p)-13)%26-13
принимает его по модулю 26 к интервалу[-13..12]
. Отрицательный результат означает, что уйти короче, а положительный результат означает уйти. Это должно быть преобразовано в строку>
или в<
зависимости от знака. Вместо использованияabs
или условного выражения мы используем преимущество умножения строк в Python, котороеs*n
дает пустую строку, когдаn
она отрицательна. В выражении'<'*-d+'>'*d
неправильно подписанная часть не вносит свой вклад.Начальное состояние обрабатывается путем разбиения ввода на его первый символ, а остальные с распаковкой Python 3
r,*s=input()
. Начальный символ используется для начала построения строки, а также начальный «предыдущий» символ.Спасибо ovs за предложение перейти на Python 3 для распаковки.
источник
Python 3 ,
11093 байтаПопробуйте онлайн!
источник
JavaScript (ES6),
118109107 байтВходная строка не чувствительна к регистру.
Как это устроено
В отличие от Python, оператор JS по модулю возвращает число, имеющее тот же знак, что и дивиденд, а не делитель. Кроме того,
repeat()
метод JS выдает ошибку при задании отрицательного числа, а не возвращает пустую строку (и она в*
любом случае значительно длиннее простой ).Это довольно неблагоприятное поведение для этой проблемы. Итак, нам лучше определить, в каком именно случае мы, а не полагаться на математические уловки. (Что не означает, что таких уловок не существует, скорее, я не смог их найти.)
Ниже приведена таблица, описывающая 4 возможных случая, где
d
расстояние между текущим и предыдущим символами со знаком:Контрольные примеры
Показать фрагмент кода
источник
PHP, 127 байт
Testcases
PHP, 137 байт
Testcases
источник
JavaScript (ES6),
111103 байтПервоначально версия, которая занимала 111 байт, прежде чем я адаптировал трюк @ Arnauld по настройке
n
во время вычисленийp
, я думаю, чтоs
вместо этого есть другой трюк,n
но уже поздно, поэтому я не буду беспокоиться.источник
Haskell (lambdabot),
161153 байтаПопробуйте онлайн!
Объяснение:
источник
EXCEL VBA 130 байт
Запустите его из окна Excel VBA Immediate.
Объяснение:
Простой цикл for с функцией String для повторения «>» или «<» n раз, где n - разница ascii между символьной строкой i и i + 1.
источник
Java 7-, 232 байта
Довольно тривиальное решение. Развернулся и прокомментировал:
источник
C 170 байт
Подробный Live
источник
#define x q<14?q:q+26 e(c){putchar(c);}i,q;m(a,b){q=b-a;i=q?(a>b?x:-x):0;while(i>0)e('>'),i--;while(i<0)e('<'),i++;}f(char*l){e(*l);while(*(l+1))m(*l,*(l+1)),e('*'),l++;}
JavaScript (ES6),
140128129111113 байтовЯ пошел другим путем к другим решениям JS, но это не сработало - вот что у меня получилось:
Оригинал, 131 байт
Показать фрагмент кода
источник
([x,...s])=>x+s.map(...)
сохраняет 12 байтов. Обратите внимание, что вы должны добавить символ печати в конце. Я предлагаю использовать число, которое будет стоить только 2 байта`1`+1
вместо`*`
.join
привело бы к неправильному выводу для однобуквенных вводов. Однако перемещение символа печати вmap
методе стоит всего 1 байт.([x,...s])=>x+s.map(y=>'<><>'[r=(d=y[c='charCodeAt']()-x[c](x=y))/13+2|0].repeat([d+26,-d,d,26-d][r])+0).join``
для 111 байтовreduce
решение для игры в гольф , но оказалось, что это 115 байт.C ++,
210190 байтовМоя первая попытка игры в гольф!
k сохраняет, какой из <,> или * печатать. Сначала он просто печатает первый элемент массива, затем запускает цикл от первого до последнего элемента массива. j сохраняет предыдущий элемент, а затем сравнивает, если j ближе к * a, с помощью <или> установите k на <,> соответственно, а затем выведите k, затем запустите этот цикл, пока j не станет равным p. Затем после каждого окончания второго цикла выведите *.
источник
*p!=0
можно заменить на*p
. Я почти уверен, что место в немchar *a
тоже не нужно. Вам также нужно будет#include <iostream>
иusing namespace std;
(хотя я думаю, что это может быть дешевле просто добавитьstd::
), чтобы сделать это полный ответ.std::
илиusing namespace std;
вам, вероятно, также потребуется#include <iostream>
подсчет байтов.05AB1E , 17 байт
Попробуйте онлайн!
объяснение
Использует
>
,<
и<space>
для обозначения прироста , убывания , отправкиисточник
Haskell ,
167168126 байтТеперь используем арифметическое решение xnor. Вызов с
e str
гдеstr :: String
строка для кодирования.источник
Haskell , 109 байт
Попробуйте онлайн! Использует подход Xnor . Позвони с
f "somestring"
.источник