Ребята с резким взором ASCII любят сдвигать ASCII Ii
:
>_> <_< >_< <_>
При заданной цепочке смещенных парней, разнесенных или разделенных линиями, переместите Ii
сторону в сторону, влево от стены и справа от неба:
Ii
Самый короткий оборотень выигрывает приз.
Чего-чего?
Напишите программу или функцию, которая принимает строку произвольного списка этих четырех смайликов ASCII, разделенных пробелом или переводом новой строки (с дополнительным завершающим переводом строки):
>_>
<_<
>_<
<_>
Например, вход может быть
>_> >_> <_>
или же
>_> >_> <_>
(Метод, который вы поддерживаете, зависит от вас.)
Каждый смайлик выполняет различные действия на I
и i
символах, которые всегда начинаются так:
Ii
>_>
сдвигI
вправо на единицу, если это возможно, а затем сдвигi
вправо на единицу.<_<
сдвигI
влево на единицу, если это возможно, и затем сдвигi
влево на единицу, если это возможно.>_<
сдвигI
вправо на единицу, если это возможно, а затем сдвигi
влево на единицу, если это возможно.<_>
сдвигI
влево на единицу, если это возможно, а затем сдвигi
вправо на единицу.
I
не может быть смещено влево, если оно находится на левом краю линии (как это изначально), и не может быть смещено вправо, если оно i
находится прямо вправо (как это изначально).
i
не может быть смещено влево, если I
находится прямо слева от него (как это изначально), но всегда может быть смещено вправо.
Обратите внимание, что с этими правилами I
всегда будет слева от i
, и I
попытка быть сдвинуты раньше i
для всех смайликов.
Ваша программа или функция должна напечатать или вернуть строку последней Ii
строки после применения всех сдвигов в указанном порядке с использованием пробелов (
) или периодов ( .
) для пустого пространства. Завершающие пробелы или периоды и одиночный завершающий перевод строки необязательно разрешены в выходных данных. Не смешивайте пробелы и точки.
Например, вход
>_> >_> <_>
имеет выход
I...i
потому что сдвиги применяются как
start |Ii >_> |I.i >_> |.I.i <_> |I...i
Самый короткий код в байтах побеждает. Ответ Tiebreaker выше.
Тестовые случаи
#[id number]
[space separated input]
[output]
Используем .
для наглядности.
#0
[empty string]
Ii
#1
>_>
I.i
#2
<_<
Ii
#3
>_<
Ii
#4
<_>
I.i
#5
>_> >_>
.I.i
#6
>_> <_<
Ii
#7
>_> >_<
.Ii
#8
>_> <_>
I..i
#9
<_< >_>
I.i
#10
<_< <_<
Ii
#11
<_< >_<
Ii
#12
<_< <_>
I.i
#13
>_< >_>
I.i
#14
>_< <_<
Ii
#15
>_< >_<
Ii
#16
>_< <_>
I.i
#17
<_> >_>
.I.i
#18
<_> <_<
Ii
#19
<_> >_<
.Ii
#20
<_> <_>
I..i
#21
>_> >_> <_>
I...i
#22
<_> >_> >_> >_> <_> <_<
.I...i
#23
<_> >_> >_> >_> <_> <_< >_< <_< >_<
..Ii
#24
>_> >_< >_> >_> >_> >_> >_> >_> <_> <_> <_<
...I.....i
Ответы:
CJam, 33 байта
Использует тот же алгоритм, что и мой ответ на Python , за исключением 0-индексации. По существу:
<
в -1 и>
в 1I
и применениемi
, мы чередуем, какую позицию мы обновляем после каждой стрелкиСпасибо @ MartinBüttner за выходной шаг в гольфе на 5 байтов.
Попробуй это онлайн | Тестирование
источник
Perl,
595654 байтаВключает +1 для
-p
Запустите с вводом на STDIN, например,
perl -p shifty.pl <<< ">_> <_< >_< <_>"
shifty.pl
:объяснение
Строка управления чередует инструкции для
i
и,I
и правило одинаково для них обоих, если вы сформулируете их следующим образом:<
Двигайтесь влево, если слева есть пробел>
Двигаться вправо, если есть пробел или конец строки справаПоэтому я собираюсь поменять местами
i
иI
в целевой строке на каждом шаге, поэтому мне нужно применять правило только к одной букве. Этоy/iI/Ii/
Я пройдусь по управляющей строке, ища
<
и>
используя подстановку, которая обычно является самым коротким способом в perl для обработки чего-либо символ за символом. Чтобы избежать необходимости писать,$var =~
мне нужна управляющая строка в переменной perl по умолчанию$_
. И я также хочу простой способ отличить<
от>
. Все это может быть достигнуто с помощьюЦелевая строка, которой я также хочу манипулировать, используя подстановки, и по той же причине, по которой я хочу это
$_
тоже.$_
Быть двумя вещами одновременно кажется невозможным.Однако я могу взять свой пирог и съесть его тоже, потому что
$_
внутренняя часть заменителя не должна оставаться такой же, как$_
заменяемая. После того, как perl начал заменять строку, эта строка не изменится, даже если вы измените переменную, из которой изначально была получена строка. Таким образом, вы можете сделать что-то вроде:Я хочу заменить оригинал
$_
на исходный"Ii"
только в самый первый раз, когда выполняется тело замещения (в противном случае я продолжаю сбрасывать целевую строку). Эта замена, однако, также должна произойти для пустой строки управления, поэтому даже для пустой строки управления тело должно быть выполнено хотя бы один раз. Чтобы убедиться, что подстановка выполняется в дополнительное время в начале управляющей строки (даже для пустых управляющих строк), я изменяю подстановку на:y/iI/Ii/
Первым делом я буду запускать код замещения. Хотя$_
все еще является управляющей строкой, она еще не будет содержать ничегоIi
, поэтому, если транслитерация показывает, что ничего не было изменено, это мой триггер initialize$_
:Теперь я могу реализовать фактическое перемещение букв. Так как я начинаю со свопа, все ходы должны быть сделаны
i
, а неI
. Если$1
задано движениеi
вправо:Если
$1
не установлено, двигайтесьi
влевоОбратите внимание, что в начале управляющей строки при совпадении
^
$1
не будет установлено, поэтому он пытается переместитьсяi
влево по исходной строкеIi
. Это не будет работать , потому что нет места там, поэтому intial строка остается нетронутой (вот почему я поставил()
вокруг>
вместо<
)Остается только одна проблема: в конце внешнего замещения
$_
устанавливается результат внешнего замещения независимо от того, что вы сделали$_
внутри тела замещения. Таким образом, целевая строка с правильным размещениемi
иI
теряется. В старых версиях это было бы фатальным недостатком. Более поздние perls, однако, имеютr
модификатор, который означает «сделать копию исходной строки, выполнить подстановку и вернуть полученную строку (вместо количества совпадений)». Когда я использую это здесь, результатом является то, что измененная командная строка отбрасывается, в то время как оригинал$_
не нарушается perl и остается после замены. Однако беспокойство, которое я делаю,$_
все еще сделано после того, как perl остался$_
один. Итак, в конце$_
будет правильной целевой строкой.-p
Вариант гарантирует , что исходная строка находится в ,$_
а также печатает окончательные$_
.источник
Ii
нетiI
.^
совпадение означает, что я должен поменять их местами. Так что обратная инициализация верна.LittleLua - 178 байт
Прямая реализация.
Ungolfed:
Что такое LittleLua?
LittleLua находится в стадии разработки, чтобы попытаться выровнять игровые поля между моим языком выбора для этих задач и эзотерическими языками, которые часто имеют чрезвычайно мощные встроенные функции.
LittleLua - это интерпретатор Lua 5.3.6 с дополнительным модулем (LittleLua.Lua), а также сокращенными именами функций и модулей. Эти изменения будут расширяться в течение следующего дня или двух, пока я не буду счастлив, но в настоящее время некоторые из самых больших изменений между LittleLua и стандартным интерпретатором Lua:
Функции и модули сокращены:
Встроенные переменные
LittleLua имеет несколько встроенных переменных для сокращения некоторых задач:
Встроенные функции
В настоящее время удручающе небольшой список, но вот он:
источник
$
, и используйте это вместоend
илиe
- не-A-Za-z
словесные символы не нуждаются в пробелах вокруг них, верно? Это побрило бы байт заend
/e
if
кi
, сохраняя один байт на использование, иend
кe
, сохраняя два, но вы оставили вelse
покое? Даже в этой простой программе (5if
с и 2else
с) вы тратите больше байтов,else
чем экономитеif
. (Я предполагаю, что это запланированное улучшение?)Сетчатка ,
10186Попробуйте онлайн
Сэкономили 15 байт благодаря Даавко!
Принимает ввод, разделенный символами новой строки и вывод, с глазами, разделенными пробелами.
Объяснение:
Я объясню поэтапно, как обычно. Все эти этапы находятся в режиме замены Retina. Это означает, что первая строка является регулярным выражением, а вторая строка является строкой замены.
Добавьте инициал
Ii
в конец ввода.Обратная черта отделяет сцену от опций. Символ опции
(
указывает, что этот этап является началом цикла этапов, которые должны выполняться многократно до тех пор, пока полный цикл не будет завершен без изменения ввода. Поскольку эта открытая скобка никогда не закрывается, все остальные этапы являются частью этого цикла.Фактическая стадия очень проста, если первый символ строки является новой строкой, то удалите ее. Это просто для того, чтобы упростить обработку пустого ввода, иначе было бы лучше добавить его к двум последним этапам.
Здесь эта опция
s
заставляет метасимвол Regex.
соответствовать символам новой строки. На этом этапе ведущий>
совпадает сI
последующим дополнительным пробелом. Затем он заменяет это совпадение на вещи после символа>
, за которым следует необязательный пробел (так что пустая строка, если пробел не может быть сопоставлен), а затем -I
.Эта стадия очень похожа на предыдущую, только дополнительный пробел находится перед
I
, и порядок и глаз поменялись местами.Обработка на
i
самом деле часто проще, потому что нам не нужно беспокоиться о необязательном добавлении или удалении, посколькуi
всегда можно двигаться вправо. Дляi
случаев мы подбираем подчеркивание, а также знак «больше / меньше», но в остальном делаем аналогичную логику. Этот добавляет пробел передi
.Снова аналогично приведенному выше, но он удаляет символ перед тем,
i
если этот символ является пробелом, в противном случае он удаляет только смайлик.источник
s`^_>(.*)i( |$)?
=>s`^_>(.*)i
и его замены$1$#2$* i
=>$1 i
, иs`^_<(.*?)( )?i
=>s`^_<(.*?) ?i
и его замены$1i$2
=>$1i
.Python,
142141134122121 байтСохранено 19 байтов благодаря xnor.
Пример:
Объяснение:
источник
i
всегда будет больше, чемI
?I
, точекi
, без необходимости в списках и объединениях.GNU sed, 81 байт
(включая +1 за
-r
флаг)Это создает новую программу sed из входных данных (которую вы можете увидеть, удалив последнюю строку), и применяет ее к начальному состоянию
Ii
.объяснение
<
и>
заменяют команды, которые сдвигаютсяI
влево и вправо соответственно._
чтобы работать,i
а неI
i
не ограничен никаким правым краем, поэтому не добавляйте и не занимайте пространство после негоIi
.s///e
всегда использует в/bin/sh
качестве оболочки, поэтому я не смог сократить это доsed '&'<<<Ii
нужного значения (это синтаксис перенаправления Bash).Результаты теста
источник
Javascript (ES6)
176 171 168 155 148 147 142141 байтиспользование
Дегольфед (v6, v7 мало чем отличаются)
источник
=>{ ... }
вы можете сделать это выражение и сохранить немало байтовMATL ,
5655504947 байтПопробуйте онлайн!
источник
Retina,
9186 байтЯ, вероятно, не выбрал лучший подход, поэтому он может быть больше в гольфе. И нет, я не копировал FryAmTheEggman (я знаю, что они действительно похожи в наших подходах). Я даже не видел его ответ, пока не опубликовал свой.
Попробуйте онлайн
источник
( |)
указывать в конце последней строки совпадения, так как после этого никогда не будет пробелаi
. Кроме того, снова в последней строке соответствия, вам не нужна закрывающая скобка для цикла. Незакрытый цикл автоматически закрывается в конце файла в Retina.i
и что-то после этого заменялось. Забыл поменять те.Javascript (ES6) 166 байт
Используя ответ Чарли Уинна, мне удалось сохранить 10 байтов, определив Math.max как M и вызывая M каждый раз, когда его скрипт использует
(Я не писал этот гольф, Чарли Уинн сделал здесь . Я просто изменил его, чтобы сделать его короче)
источник
SyntaxError: missing : in conditional expression
на Firefox. Вы можете исправить это с помощью_=>{I=0,i=1,M=Math.max;_.split` `.map(m=>(I=(m=m.split`_`)[0]=='<'?M(0,I-1):M(i-1,I+1))+(i=m[1]=='<'?M(I+1,i-1):i+1));(a=Array(i).fill`.`)[I]='I';return a.join``+'i'}
того же точного размера.JavaScript (ES6), 115
118Редактировать: 3 байта сохранены, спасибо Чарли Винн
p
количество пробелов передI
;q
количество пробелов междуI
иi
. Ни один не может быть отрицательным.Меньше гольфа
Контрольная работа
источник
Retina,
6158 байт3 байта сохранены благодаря @FryAmTheEggman.
Объяснение приходит немного позже.
Попробуйте онлайн!
Модифицированный код с пакетным тестированием.
источник
Python 2,
9692 байтаДовольно нестабильное решение для нестабильной задачи. Ввод как
f('>_> <_>')
, выход как'I i'
.Программа верификации (предполагается, что
tests
это строка многострочного теста):Программа читает каждую стрелку по одному, начиная с
I=1, i=2
индексов, основанных на 1. Имена переменных немного вводит в заблуждение , так как они меняются ролями - после каждого полукокса,I
становитсяi
иi
становитсяI
обновляется. Символ обновляется только в том случае, если он не будет перемещен ни в позицию другого символа, ни в позицию 0.Например, для
>_> <_> >_<
мы делаем:Это дает
' Ii'
по желанию.источник
Lua, 104 байта
Использование:
источник
Javascript (ES5),
153125 байтпринимает входные данные, устанавливая переменную
a
перед запускомНемного негольфя
источник
Mathematica, 125 байт
Чистая функция с первым аргументом
#
. Идея заключается в том , что каждый<_
,>_
,<
, и>
во входных соответствует правилу замены строки."<_"|">_"|">"|"<"
является строковым шаблоном, который соответствует любому из этих четырех выражений.StringCases[#,"<_"|">_"|">"|"<"]
найдете все такие совпадения. Затем мы заменяем (/.
) каждое"<_"
на правило замены строки".I"->"I."
, каждое">_"
на правило"I."->".I"
и так далее. Затем я хочу последовательно применить каждое правило замены к строке"Ii"
, ноStringReplace
буду искать только совпадения в тех частях строки, которые не были заменены, поэтому мы оставилиFold
функциюStringReplace
в списке правил замены с начальным значением"Ii"
.Возможно, это было бы более понятно с примером (здесь
%
относится к выводу предыдущей ячейки):источник