Резюме
Задача состоит в том, чтобы перемещаться по марсоходу и сообщать его окончательные координаты и направление.
Входные данные:
Первый вход:
Сначала ваша программа должна принять входные данные в следующем формате:
[X-Coordinate],[Y-Coordinate],[Direction]
Направление должно быть: N
или S
или E
илиW
(начальные буквы севера, юга, запада, востока)
Пример: 10,20,N
(x = 10, y = 20, направление = N (север))
Второй вход:
Второй вход состоит из серии из R
, L
, M
для вправо, влево и двигаться соответственно.
Для R
и L
(вправо и влево) направление ровера должно измениться соответственно.
Для M
ровера необходимо двигаться на 1 единицу вперед в том направлении, в котором он находился до движения.
Правила расчета координат:
N = Y + 1
E = X + 1
S = Y - 1
W = X - 1
Выход:
Окончательные координаты и текущее направление движения ровера.
Пример:
Enter initial data: 1,2,N
Enter the instructions: MRMLM
Output: 2,4,N
Координаты могут быть любым целым числом и могут быть отрицательными .
Все стандартные лазейки не допускаются. Если возможно размещение демонстрации на таких сайтах, как http://ideone.com и т. Д., Сделайте это, чтобы я мог проверить :)
Это конкурс популярности, так что будьте креативны!
Следуя советам других, я решил сделать этот код-гольф .
Ответы:
Ruby ≥ 2.0, 101
Это решение можно проверить здесь: https://ideone.com/C4PLdE
Обратите внимание, что решение, связанное с ideone, на один символ длиннее (
1.i
вместо1i
строки 3). Причиной этого является то, что ideone поддерживает только Ruby 1.9, который не допускает краткий синтаксис для сложных литералов.источник
x,y,i=eval"[#{gets}]"
на,eval"x,y,i="+gets
чтобы сохранить некоторые символы.eval
ограниченных правил:ruby -e 'eval"x=1";p x'
бросаетNameError
дляx
вp x
. Это работает при использовании constants (eval"X,Y,I="+gets
), но, поскольку я изменяюi
, это потребует дополнительногоi=I
для предотвращения предупреждений о переопределении константы. Но, может быть, мы говорим о разных версиях Ruby?x,y,i=eval"*a="+gets
. Благодарность!Javascript ( ES6 )
145141127Изменить: Устранена необходимость в массиве перевода с использованием метода из решения C edc65
Ungolfed / Комментарий:
источник
Ява - 327
С пробелами:
Как и в случае с Java, примерно половина из этого просто анализирует ввод и формирует вывод. Логика довольно проста.
источник
Javascript (E6) 175
редактировать Исправлена ошибка, возможно выходящая за пределы диапазона возвращаемого значения для d
139 Logic, 36 I / O
Основной негольфированный
Тест Тест в консоли javascript в Firefox. Проще протестировать функцию F, избегая всплывающих окон.
Выход
источник
С 164
180 186Edit Исправлен формат ввода и удален strchr.
Edit Удален массив смещений, рассчитан с использованием битов.
Ungolfed
источник
С 148
150151Доработка решения @ edc65 для использования моего подхода к злоупотреблению ценностями ASCII.
В частности:
d%8%5
сопоставляет персонажейENWS
с0,1,2,3
соответственноc%23
превращаетсяL
в7
,M
в8
иR
в 13. Посколькуd
(переменная направления) всегда используется мод 4, это эффективноL
добавляет -1 мод 4,M
0 мод 4 иR
1 мод 4.d&1
1 дляNS
и 0 дляEW
направлений.d&2
2 дляWS
и 0 дляNE
направлений.~-(d&2)
1 дляWS
и -1 дляNE
направлений.c%2
1 дляM
и 0 дляLR
.источник
c%(2*(1-(d&2)))
Python 3 (с графикой черепахи),
251199 байтМудрые питонисты, пожалуйста, будьте вежливы, потому что это моя первая попытка программы, написанной на вашем хорошем языке.
Черепахи на Марсе!
Эта задача вполне естественно сопоставляется с графикой черепах в стиле логотипа, для которой, конечно, имеет значение python.
Читает ввод из двух строк из STDIN.
Выход:
Что мне особенно нравится в этой программе, так это то, что она графически отображает путь ровера. Добавьте
exitonclick()
в конец программы, чтобы графический вывод сохранялся до нажатия пользователем:Я уверен, что это может быть значительно больше - любые предложения приветствуются! Я делаю это CW, потому что я надеюсь, что сообщество может еще немного поиграть в гольф.
Изменения:
источник
GolfScript,
116 98 88 8471Это должно получить координаты и инструкции в качестве аргументов следующим образом:
1 2 'N' 'MRMLM'
. Аргументы превращаются в строку и помещаются в стек.Если вы хотите проверить это в Интернете, перейдите к веб-сценарию гольфа и вставьте точку с запятой, за которой следует строка с аргументами (например
;"1 2 'N' 'MRMLM'"
) перед кодом ( здесь приведена ссылка с примером).Примеры вывода:
Мои предыдущие попытки
84 символа:
88 символов:
98 символов:
116 символов:
источник
Дельфы (819)
Когда я начинал, это был еще не код-гольф . Буду редактировать позже.
Не могу найти компилятор онлайн, хотя.
Ungolfed
источник
=
? Зачем они нужны? Кроме того, имена переменных кажутся мне слишком длиннымиJavascript (353)
Это моя первая настоящая попытка кода в гольф, кажется, работает по крайней мере!
источник
var
.Питон (263)
Должен быть более элегантный способ сделать это, ему не нужна ветвь после остального.
http://ideone.com/eD0FwD
Вход ужасный, я хотел сделать это с
split(',')
но столкнулся с проблемами приведения между строками и строками. В идеале я также хотел добавить старую позицию с движущейся позицией ... о, теперь это код-гольф. Ну да ладно, я оставлю это здесь, это может дать вдохновение. Другие идеи, которые у меня были, заключались в использовании по модулю 4 направления после сопоставления исходного ориентира с индексом. Также объединяйте повороты и перемещайте массивы в один, поскольку ни одна из клавиш не сталкивается.несмотря на это, сокращение имен переменных и удаление пробелов это 263:
источник
Python 2.7 -
197192 байтаЯ на самом деле очень горжусь этим.
объяснение
Во-первых, давайте исправим этот беспорядок. Я использовал точки с запятой вместо разрывов строк во многих местах, потому что я думаю, что это делает меня крутым. Здесь это обычно (это - все еще 197 байтов, это не было ungolfed вообще). Да, еще есть точка с запятой, но она на самом деле сохраняет байт.
Давайте начнем!
Сначала мы определяем
q
как строку'NESW'
. Мы используем это дважды позже, иlen("q='NESW';qq") < len("'NESW''NESW'")
.Здесь мы разделяем первую строку inpupt на каждую запятую. Наша координата x хранится в
x
, y вy
, и первая буква нашего направления вd
.Тогда мы просто делаем координаты. (Я был шокирован, что не мог придумать лучшего способа преобразования двух строк в целые. Я пытался,
x,y=map(int,(x,y))
но это оказалось дольше.)Это преобразует наше направление в целое число. 0 север, 1 восток, 2 юг и 3 запад.
Здесь начинается самое интересное.
Когда мы идем на север, Y увеличивается на 1. Таким образом, этот словарь берет 0 и дает строку
'y+'
для «увеличения y». Он дает аналогичные результаты для других направлений: y или x, за которыми следует + или -.Мы вернемся к этому.
Я позволил себе немного развеять это.
Для каждого символа во второй строке ввода мы делаем две вещи. Во-первых, мы устанавливаем переменную равной
m
тому, что наш словарь дает нам для нашего текущего направления. Нет причин, по которым нам нужно, чтобы это происходило каждый раз, но это проще, чем просто делать это, когда нам это нужно.Далее мы создаем список из трех элементов:
'd+'
,'d-'
, иm
. ПРИМЕЧАНИЕ РЕДАКТОРА: Я думаю, что могу обойтись без использования переменнойm
вообще. Я думаю, что я могу просто внестиv[d]
в список напрямую. Это сэкономит мне пару байтов, если это сработает, но я не испытываю желание испытать это, пока я не закончу это объяснение, чтобы вы могли справиться. (Да, это сработало.)Мы ищем текущий символ ввода в строке 'RL'.
str.find
возвращает -1, если не находит символ, поэтому он преобразует R в 0, L в 1 и все остальное в -1. Конечно, единственный другой вход, который мы можем иметь, это M, но меньше символов, чтобы он работал для всего.Мы используем это число в качестве индекса для списка, который мы создали. Индексы списка Python начинаются в конце, если они отрицательные, поэтому мы получаем первый элемент, если входное значение R, второй, если это L, и последний, если это M. Для удобства, я собираюсь предположить, что мы стоим на севере, но аналогичный принцип применим и для других направлений.
Возможные значения, с которыми мы работаем,
'd+'
для R,'d-'
для L и'y+'
для M. Затем мы присоединяем'=1;d=d%4'
к концу каждого из них. Это означает, что наши возможные ценности ...Это действительный код Python! Это правильный код Python, который делает именно то, что мы хотим сделать для каждого из этих входных символов! (Эта
d=d%4
часть просто держит наши указания в здравом уме. Опять же, не нужно делать это каждый раз, но это меньше символов.)Все, что нам нужно сделать, это выполнить код, который мы получаем для каждого символа, распечатать его (преобразовав наше направление обратно в строку), и все готово!
источник
С - 350
Сохранить как
rover.c
:Обобщение:
Образец прогона:
Ideone
Ungolfed:
источник
Haskell - 412 байт
Протестировано с:
источник
f=many digit
MUCH LOL - ТАКОЙ ВАУread
нескольких раз заняло больше символов, чем использованиеBash + coreutils, 159 байт
Ввод читается из 2 строк STDIN.
Выход:
источник
PowerShell,
170167166Казалось бы, дальше не удаётся играть в гольф, что немного смущает. Но все очевидные хаки здесь не работают.
Я не могу
iex
вход , потому что а)N
,S
,E
иW
должны быть функции для того , чтобы работать (или я должен был бы префикс, с$
и б)1,2,N
придется разбораN
в режиме выражения, не будучи в состоянии выполнить команду ,switch
, Кажется, самый короткий способ сделать движение. Хеш-таблица с блоками или строками скрипта тоже не короче и для всех остальных способов, кромеswitch
меня есть издержки явного цикла.Я не могу избавиться от
IndexOf
потому что трубопровод с?
более длинным, все же.Я также не могу избавиться от явных типов в первоначальном объявлении, потому что у меня там смешанные типы, поэтому просто
|%{+$_}
не помогает, а все остальные варианты длиннее.Иногда я ненавижу обработку ввода в PowerShell.
источник
Питон, 135
137138Злоупотребления значения ASCII из
L
,M
иR
избегать использования любых условных операторов.Попробуйте это в Ideone .
источник
Python 2.7,
170149Вещи, которые я изменил с оригинала:
Aliased raw_input, изменил словарь v [d], который в любом случае должен был быть списком, на какой-то выбор строки, используемый
%=
.Редактировать: используется распаковка кортежей и eval (raw_input ()) == input () для сохранения 21 символа.
Сильно позаимствовано у @undergroundmonorail, но с большим количеством улучшений.
источник
Bash / SHELF ,
243235« SHE ll go LF » - это библиотека для игры в гольф для Bash, которая предоставляет несколько полезных псевдонимов. Это верный ответ, поскольку библиотека существовала и была на GitHub до публикации заявки.
Извините, я не могу заставить это работать на ideone.
Как бегать
Он принимает начальную позицию (разделенную запятыми, как указано; это добавляет много символов в код) в качестве первого аргумента и инструкции по стандартному вводу.
Образец вывода
Код
объяснение
d
для сравнения; он возвращает 0, если два его аргумента равны, и 1, в противном случае он может затем связать другие команды с помощью&&
и||
.y
это какtr
(но сделано черезsed
).Y
это какsed 's/.../.../g'
для двух своих аргументов.P
естьecho -e -n
;p
это простоecho -e
.Следующий бит глубоко уродлив, с около 145 символов на одной строке. Если текущей командой является M, поверните запятые в $ o в пробелы, преобразуйте в массив и сохраните в $ z. Затем выполните блок switch ... case для последнего элемента $ z (направление, на которое указывает ровер. Соответственно измените координаты, затем преобразуйте $ z в строку через запятую и сохраните в $ o.
источник
shelf.sh
быть частью решения вместо этого? Как если бы вам понадобилисьrequire
определенные пакеты в Ruby илиimport
их в Python.import
пишут PYG, когда пишут с ним программу на Python, или Rebmu (AFAIK), когда пишут с ней программу для RebolХаскелл, 291
Я не был уверен, насколько гибким был формат строки ввода и вывода, поэтому я позаботился о том, чтобы он выглядел точно так же, как в примере (за исключением подсказок, конечно), но это добавило много дополнительных символов. Идеальная ссылка
источник
PHP - 224
Ну, я попробовал.
Ввод в STDIN, например:
источник
Python3 (288)
Реализация с использованием интенсивного использования троичных ifs.
Пропуск очевидного ввода ворчит, придание внутренним значениям строк направления могло бы помочь размеру скрипта. Тем не менее, подход здесь совершенно функциональный (так что я считаю)
источник
Питон 3 (143)
http://ideone.com/wYvt7J
Мы используем встроенный в Python комплексный тип чисел для хранения пары координат. Направление вычисляется путем взятия мнимой единицы
1j
в степеньd
, в которой хранится направление mod 4. Вращение осуществляется путем увеличения или уменьшенияd
. Выражение'ML'.find(c)
дает сумму, которую мы хотим изменитьd
:1
дляL
,0
дляM
и-1
(по умолчанию для не найден) дляR
.В Python нет короткого способа преобразования комплексного числа в кортеж, поэтому мы должны делать дорогостоящие вызовы
.real
и.imag
.источник