Введение
«Ярр! У нас был парень, который называл себя« программистом », делающим карту для нашего скрытого сокровища! Но это написано со странными числами и буквами!» E5, N2, E3 «... что это вообще делает? значит? Безумие! Не могу даже написать правильную карту сокровищ, т 'бесполезный кретин. Исправь это нас! Мы подарим тебе долю сокровищ! "
Описание задачи
Группа пиратов с трудом читает карту сокровищ. Можете ли вы написать программу для преобразования ее в более ... пиратскую форму?
В качестве входных данных вы получите оригинальную карту сокровищ. Это список строк, разделенных запятыми, каждая строка состоит из буквенной части (которая сообщает пиратам, в каком направлении им нужно идти) и числовой части (которая сообщает пиратам, сколько шагов нужно предпринять в этом направлении). Например, следующая карта сокровищ:
E2,N4,E5,S2,W1,S3
означало бы: «пройти два шага на восток, пройти четыре шага на север, пять шагов на восток, два шага на юг, один шаг на запад, а затем три шага на юг».
Как выход, вы будете выводить карту в графическом виде, используя символы >
, ^
, v
, и в <
качестве указателей. Вот вывод для вышеуказанного ввода:
>>>>>v
^ v
^ v<
^ v
>>^ X
Обратите внимание, что мы заменили последний шаг на юг X
вместо этого. Это потому, что последний шаг - это то, где находится сокровище, и, как мы все знаем, пираты должны иметь X на своих картах сокровищ, иначе они не будут знать, как их прочитать.
Кстати, карта никогда не пересечет сама себя, поэтому вам не нужно беспокоиться о перекрытиях. Кроме того, вам разрешено иметь завершающую новую строку в конце вывода.
Образцы входов и выходов
S5,W2
v
v
v
v
v
X<
N1,E1,S1,E1,N1,E1,S2
>v>v
^>^X
N1
X
N6,E6,S6,W5,N5,E4,S4,W3,N3,E2,S2,W1,N2
>>>>>>v
^>>>>vv
^^>>vvv
^^^Xvvv
^^^^<vv
^^^<<<v
^^<<<<<
E21,S2
>>>>>>>>>>>>>>>>>>>>>v
X
N12,E11,S12,W2,N4
>>>>>>>>>>>v
^ v
^ v
^ v
^ v
^ v
^ v
^ v
^ v
^ X v
^ ^ v
^ ^ v
^ ^<<
X
следует отметить шаг после последнего хода, как и все другие ходы. Представьте, что последний шаг - это N3: вы идете три шага на север и копаете, но здесь ничего нет, вместо этого вам пришлось пройти 2 шага. Я не против, если вы сохраните существующее правило, потому что оно добавляет небольшой угловой случай для обработки. Но помни, что случилось с этим парнем.Ответы:
Рубин,
213 209 198 186178Пройдите ввод через стандартный ввод.
При этом используется
y -> x -> char
словарь для построения карты, где обаx
иy
могут быть отрицательными. После анализа входных данных извлекается глобальный минимум координаты x. Затем для каждой строки выполняется итерация по диапазону от глобального минимума до максимального индекса для текущей строки и выводится правильный символ для этого индекса.Для того, чтобы остаться с темой, выражения для включения
NESW
в соответствующие индексы бесстыдно пиратский из Sp3000 «s ответа .Оригинальная версия, которая использовала
[x,y] -> char
словарь:источник
Python 2,
249248244239237 байтВвод как
"E2,N4,E5,S2,W1,S3"
.NSEW
сопоставлен[1, 3, 2, 0]
сd=ord(c)%10%7
. Изменятьy
илиx
затем решатьd%2
, а увеличивать или уменьшать -d-2|1
. Первое и третье выражения были найдены методом грубой силы.Помимо этого, это простое использование вложенного словаря в форме
{y: {x: char}}
.(Спасибо @joriki за помощь с отображением)
источник
(d + 1 & 2) - 1
1|d%-3
(что является отрицанием, но я только что понял, что это тоже хорошо)!Javascript (ES6), 260
Это было интересно ...
Спасибо @ETHproductions, @ edc65 и @vihan за помощь!
Это определяет анонимную функцию, поэтому для ее вызова добавьте
f=
в начало, чтобы дать ей имя.Тестировать:
console.log(f("E2,N4,E5,S2,W1,S3"))
Объяснение:
источник
i++
изfor
петли на последнее место он используется, в этом случаеc=i++>r-2?"X":c
.v[0].repeat(+v.slice(1))
вместоArray(v.slice(1)- -1).join(v[0])
и" ".repeat(j-p-1)
вместоArray(j-p).join(" ")
экономии всего 11 байт. Я думаю, что вы также можете поместитьF='forEach'
в начало функции, а затем поменять каждую.forEach
из них на[F]
другую, сохранив еще 4.if
s, это может помочь, если вы уменьшаете переменные одновременноq=x=y=2e3
значит ли это, что вывод был бы неправильным, если бы я сказал, скажемW9999
,?PHP,
431417 байтПоместите его в файл (
treasure.php
), удалите отступы, соедините строки (здесь они обернуты для удобства чтения), поместите<?php
маркер в начало файла (здесь не отображается, поскольку технически он не является частью программы).Пример исполнения:
Опция
-d error_reporting=0
необходима для подавления уведомлений о значениях, не найденных по указанным индексам в$z
.Обновить:
Пока я готовил версию кода для публикации, я обнаружил, что он содержит два ненужных назначения (12 байт) и пробел, который можно удалить (
as$i
); Кроме того , путем заменыwhile
сfor
петлей и сжимая назначение в него (не возможно с помощьюwhile
петли) Я сохранил другие байты.источник
$count --;
.$argn
сохранить 3 байтаchop
сохранить 1 байт"X"
->X
использовать константы сохранить больше байтов$argn
намек. Я знаю об этом"X"->X
трюке, но я, вероятно, забыл об этом, когда писал это решение. Я пишу код PHP с 2002 года, но до сегодняшнего дня я не заметил, что PHP предоставляет этуchop()
функцию. Спасибо за этот совет.Perl
702613546474439338260 байтСпасибо Dom Hastings за его помощь и его супергольфированную версию.
Код использует 2D-массив.
Версия от Дома Гастингса:
Моя маленькая играющая в гольф версия 338 байт (для справки):
Контрольная работа
источник
use strict;
, вам не нужны всеmy
s, которые сэкономят вам хотя бы несколько байтов. Также==
короче, чемeq
последний требует пробелов.$m
один раз, так что вместо того , чтобы хранить аргумент командной строки в качестве переменной, вы можете вызвать его непосредственно вsplit
, то есть@m=split(',',$ARGV[0])
.$d
и$s
переменные могут быть получены с помощью регулярных выражений, чтобы сэкономить вам несколько байтов($d,$s)=/^(.)(.+)$/
, и всеforeach
s могут бытьfor
(так как они одинаковые. Вы также можете сохранить некоторые символы, заменив некоторые из них наmap{
...,}@x
так как вы можете игнорировать парены вокруг повторяющегося элемента (это хорошо работает, если вам нужно содержать другие циклы). Если вы используете,$ARGV[0]
вы можете заменить его на pop, но если вы используете сценарий, как в,perl script.pl <<< "text"
вы можете использовать<>
вместо этогоpop
чтобы сохранить пару. Вместо того , чтобыuse Swtich
иswitch
/case
заявления, вы могли бы сделать отдельные проверки , которые могут спасти вас байтов. Нечто подобное также$y-="N"eq$d
будет работать (так как true1
и false есть''
). Часто вы можете иметь слова как голые слова, так что$y-=N eq$d
будет работать! Есть некоторые магические переменные, которые вы можете использовать для сохранения байтов,$/
есть'\n'
и$"
есть' '
, но иногда буквальный символ новой строки может также помочь сохранить символ. Еще один (грязный!) Трюк - это несколько назначений, чтобы сохранить еще несколько, как это$a=0;$b=0;
может быть$a=$b=0
.substr($_,0,1)
может бытьsubstr$_,0,1
. Постфикс для циклов, и если проверки также могут быть полезны, как вfor(@c){...}
сравнении,...for@c
но вы не можете использовать их;
в коде, вам придется вместо этого использовать запятую (что не всегда работает при вызове функций). На codegolf.stackexchange.com/questions/5105/… есть много отличных советов . Удачи!Python 2, 394 байта
Запустите программу и вставьте в стандартный ввод, например:
"E2,N4,E5,S2,W1,S3"
Это не очень оптимизировано. Сначала он проходит через вход для записи пути. Затем он делает некоторые математические вычисления, чтобы определить правильную начальную позицию и размер
o
. Затем он запускается снова и устанавливает соответствующие записи вo
качестве одного из>v<^X
. Основной ум заключается в повторном использовании одной и той же функции для обоих этих обходов.источник
XQuery 3.0, 498
XQuery не часто даже немного конкурентоспособен, так что это было весело.
Ungolfed
источник
PHP, 496
514528Я попытал счастья в PHP, результат довольно длинный, я все еще хочу опубликовать его, просто для удовольствия.
Ungolfed
источник
for(;$i++<$f;)
, попробовать удалить ненужные скобки, использовать неопределенные константы (N
) вместо strings ('N'
),…if
s попробуйте использовать trenary-операторы или логические ands. Кроме того, это поможет, если вы используете PHP4.1 и используете массив GET с точками.JavaScript (ES6), 244
249 274Лидирующие пробелы и символы новой строки добавлены для ясности и не учитываются, кроме новой строки ближе к концу в вызове соединения, который является значимым и учитывается.
Тестовый запуск фрагмента (только ECMAScript 6, Firefox и Safari 9)
источник
С 557
Безголовая версия:
Динамическое распределение памяти не намного сложнее, но malloc слишком длинный идентификатор, чтобы использовать его в коде гольф. Я чувствую, что должен быть какой-то заголовок PCG.h, юридически включенный автоматически для игры в гольф в c, просто чтобы замкнуть некоторые идентификаторы.
источник
Groovy, 359
источник
Common Lisp - 603
Реализация без массивов: печатает сверху вниз, слева направо.
Разобрать и расширить направления в след
(x y char)
элементов:Простой "N3" ввод производит
((0 0 #\^) (0 -1 #\^) (0 -2 #\X))
x
иy
y
сначала, а затем поx
Перебирать отсортированный список при перемещении курсора
x - minx
,y - miny
распечатайте нужный символПримеры
Результат:
источник
CoffeeScript,
303285 байтПоказать фрагмент кода
источник