Вдохновлено одним из видео Vi Hart (которое является сокровищницей, полной потенциальных идей вызова)
Змея состоит из сегментов одинаковой длины, и соединение между каждым сегментом может быть прямым или поворачиваться на 90 °.
Мы можем закодировать такую змею (с точностью до поворота, которая зависит от начального направления), записав ползунок , направление поворота (прямое / левое / правое), которое требуется. Этот, начинающийся в верхнем левом углу и указывающий направо
-+ +--+ SR RSSR
| +-+ | S RSL S
+--+ --+ LSSL SSR
Будет представлен слайд SRSLSSLRLRSSRSRSS
И, конечно же, плоская змея не может пересекать себя (как в SSSSLLLSS
), что приведет к ужасной неровной игре.
Ваша задача состоит в том, чтобы определить, является ли скольжение действительным или нет (приводит по крайней мере к одному самопересечению)
Input
Строка, составленная из букв SLR
с параметром 2 < length < 10000
Output
Something Truthy, если это допустимое скольжение, и что-то Falsey, если это не так.
Контрольные примеры
__Valid__
SSLSLSRSRSSRSSSLLSSSRRLRSLRLLSSS
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR (A hilbert curve)
RLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRR
SRRSRSRSSRSSRSSSRSSSRSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS (Spiral)
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS (bigger, squigglier spiral)
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLL
__Invalid__
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRLSLLRRLLSLRRSRLLRSRRLLSRSSSRSSSSSSSRSRSSSSSSSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRSRSRSSRSSRSSSRSSSRSSSSSSSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLRLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLLSLRLSLRSLRSLRSLSLSLRSRLSLRSLRLSRSLLLRLRLRRRRSLSLSSLLSLSLSLSSLLSLSLLRLRSLLRSRLSLSSLLLLSSSSSSSSSSSSSSSSSSSSRLRLLRRLRLRLLRLRLRLRLRLSSSSLSLRLLRLSLSSLSLSLSLSLRLLRLSLLLSRSSSSSSSSSSSSSSSRLRLRLLRLRLSLSRSRSSSLSRLRLRLRSLSLSLSRLLSRLSLSLSLSLSSLSLSLLSLSRLLRLRLRLRLRLRLRLRLRLRLSLSRLRLSLLRRLSLLSLSLSLSLSLLSLSLSLRLRLRLRLRLRLRLRLRLRRLRSLSLSLSLSLSLSLSSLSSSSSLSLSSSLSLSLSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
Вы можете нарисовать ползунки здесь (R и L перевернуты, но это не влияет на достоверность)
источник
SRRR
на миллиметровой бумаге один квадрат на сегмент, то он будет перекрываться и, следовательно, будет недействительным, простоRRR
будет занимать ровно квадрат 2х2 без перекрытий (как в классической игре)Ответы:
Pyth,
2220 байтПопробуйте сами или запустите тестовый пакет .
Обратите внимание на значения ASCII SRL соответственно 83, 76, 82. Я злоупотребляю тем фактом, что:
Отсюда я просто сохраняю переменную для текущей позиции и текущего направления. Для каждого символа я умножаю текущее направление на вышеуказанное комплексное число, затем добавляю его к текущей позиции.
В конце я проверяю, все ли посещенные позиции уникальны.
источник
CJam, 30 байтов
Объяснение, чтобы следовать скоро.
Попробуйте онлайн здесь или запустите весь пакет .
источник
S
, если у нас есть один ход, значит ли это, что змея уже заняла (0,0) и (1,0)?JavaScript (ES6), 84
89Запустите сниппет в Firefox для проверки.
Некоторые заметки:
undefined
. При первом посещении оператор тильды меняет его на -1, что правда. В конце концов, при втором посещении значение изменяется на 0, что ложно, иevery
цикл прекращает возвращать false.источник
TI-BASIC,
49 56 5351 байтПодобно методу orlp, это создает список всех точек в комплексной плоскости, которые посетила змея, начиная с начала координат. Если в списке нет повторяющихся элементов, код возвращает некоторое положительное значение. Обратите внимание, что на строке из более чем 999 элементов калькулятор не сможет сгенерировать достаточно длинный список и выдаст ошибку.
РЕДАКТИРОВАТЬ: Сохранены два байта ценой уродства, поскольку никакие две точки решетки на комплексной плоскости не могут быть на одинаковом расстоянии от e ^ i.
источник
TI-BASIC,
6058 байтИзменить: игнорировать все ниже: рабочее решение ti-basic здесь , Томас Ква. Иди, проголосуй за это!
⁻
это[(-)]
ключ, а Анс есть[2ND]->[(-)]
. Запустите его, заключив инструкции змеи в кавычки ([ALPHA]->[+]
), затем двоеточие и имя программы. Например, если вы назовете программу «SNAKE», вы запустите контрольный пример в OP как"SRSLSSLRLRSSRSRSS":prgmSNAKE
.Изменить: не работает
SRRLSLLRRRS
. У меня есть пересмотренная версия на 61 байт, но она не проходит в первом неверном тестовом примере:Я постараюсь исправить завтра.
Обновление: проблема в том, что мой алгоритм имеет недостатки. Если бы я использовал For (цикл в отличие от seq ((для достижения того же самого)), его (на самом деле оба алгоритма выше) можно было бы описать так:
Тем не менее, это не удается на недопустимых скольжения, как
SRLRLRLRLRRRSS
. Сейчас я попытаюсь придумать лучший алгоритм ... или украсть другой ответ.Я на 90% уверен, что это можно заменить одной
seq(
командой, на самом деле, но пока это настолько мало, насколько я могу это понять. Если вы намереваетесь построить его на 8xp, используя Sourcecoder, а не печатать его, обратите внимание, что его≠
следует заменить на,!=
а⁻1+
бит - заменить~1+
.источник
Рубин 87
89Онлайн тест: http://ideone.com/pepeW2
Безголовая версия:
источник
Golfscript 48
49 50Ожидает, что строка существует в стеке и возвращает либо
0
или1
.Вы можете попробовать это онлайн с тестами на действительных и недействительных змей.
По сути, это та же идея, что и в моем ответе на Ruby . Просто с массивом направлений обрабатываются по-разному, потому что AFAIK Golfscript не имеет функции обычного поворота. В этом случае я создаю достаточно большой массив направлений, умножая его 10000 раз, а затем обрезая от его начальных 0, 1 или 3 элементов, в зависимости от текущей команды (S, R или L). Текущее «направление» для перемещения всегда является первым элементом в массиве.
Вот это с комментариями:
Редактировать:
Сохранено 1 символ путем изменения способа использования массива "directions".
Редактировать:
сохранил 1 символ, переместив шаг 10 вместо 1, чтобы использовать
?
синтаксис (power).источник