Почти шесть лет назад коллега-член PPCG steenslag опубликовал следующую задачу:
В стандартном кубике (кубике) числа расположены так, что противоположные грани добавляют к семи. Напишите самую короткую из возможных программ на предпочитаемом вами языке, которая выдает случайный бросок, за которым следуют 9 случайных подсказок. Опрокидывание - это четверть оборота костей, например, если кость обращена к 5, все возможные опрокидывания равны 1,3,4 и 6.
Пример желаемого результата:
1532131356
Итак, теперь, когда все совершенно забыли об этом и победный ответ давно принят, мы напишем программу для проверки последовательностей опрокидывания, генерируемых представленными решениями. (Это имеет смысл. Просто притворись, что это так.)
Вызов
Ваша программа или функция имеет такую последовательность, как 1532131356
. Убедитесь, что каждая последующая цифра:
- Не равно предыдущему разряду
- Не равно 7 минус предыдущая цифра
(Вам не нужно проверять первую цифру.)
правила
- Ваша программа должна вернуть истинное значение, если введенные данные верны, и значение Falsey противном случае.
- Можно предположить, что ввод состоит только из цифр 1-6 и имеет длину не менее 1 символа. Последовательности не будут иметь фиксированной длины, как в вызове Стинслага.
- Вы можете принять входные данные в виде строки (
"324324"
), массива или массива, подобной структуре данных ([1,3,5]
) или в качестве нескольких аргументов (yourFunction(1,2,4)
).
Применяются стандартные правила ввода / вывода и лазейки .
Контрольные примеры
Truthy
1353531414
3132124215
4142124136
46
4264626313135414154
6
2642156451212623232354621262412315654626212421451351563264123656353126413154124151545145146535351323
5414142
Falsey
Повторная цифра
11 3132124225 6423126354214136312144245354241324231415135454535141512135141323542451231236354513265426114231536245 553141454631 14265411
Противоположная сторона плашки
16 42123523545426464236231321 61362462636351 62362462636361
источник
3132124225
возвращается5
.n and p*(7-p!=n!=p)
.Python, 44 байта
Побитовая магия! Это анонимная функция, которая принимает список целых чисел и проверяет, что XOR каждых двух последовательных элементов составляет от 1 до 6 включительно.
Почему это работает
Во-первых, XOR всегда между 0 и 7 включительно, так как 7
111
в базе 2, и наши числа имеют не более 3 двоичных цифр. Для равенства,a^b == 0
если и только еслиa == b
. Кроме того, мы имеем,7-a == 7^a
когда0 ≤ a ≤ 7
, и, следовательно,a^b == 7
тогда и только тогда, когдаa == 7^b == 7-b
.источник
05AB1E ,
119 байтов-2 байта за умную идею Osable об использовании продукта.
Попробуйте онлайн!
Третий подход с использованием 05AB1E, который не использует парную команду:
0
если это нарушает пьяные свойства.Not 0
если не было ничего, что мешало бы ему быть навеселе.источник
Á
. Ницца!¥¹D7-Á+«P
. Он возвращает 0, когда в массиве есть 0 или любое другое значение в противном случае.R,
39373231 байтПопробуйте онлайн!
Принимает ввод от стандартного ввода. Используется,
diff
чтобы увидеть, являются ли любые две последовательные цифры одинаковыми; затем сравнивает каждую цифру с 7 минус предыдущая цифра. ВозвращаетTRUE
илиFALSE
.Сохранено 5 байтов благодаря Jarko Dubbeldam и еще одно благодаря JayCe.
источник
q
и последующее тестирование2*x+q-7
вместоc(0,x)!=c(7-x,0)
сохранения нескольких байтов. Еслиx1 + x2 = 7
тогда2*x1 + diff(x1,x2) = 7
. Проверяю2*x+q - 7
потом явно тесты!=0
.05AB1E , 10 байтов
Использует кодировку CP-1252 . Попробуйте онлайн!
источник
Ê
: P Хорошо !1*[] = []
ноproduct(1, []) = 1
. Это хорошо знать.[]
должно быть 1.)1*
,)1s*
И)1P
все в[]
то время как)1sP
это 1.[]
дает ошибку и отбрасывается. Вот почему он дает 1. Я постараюсь это исправить, когда вернусь домой.R,
4944 байтаЧитает входные данные из стандартного ввода (разделенные пробелом) и выводит
TRUE/FALSE
. Выдаст предупреждение, если ввод имеет длину один, но все еще работает.Изменить: сэкономил пару байтов благодаря @rturnbull
источник
all(x)&all(y)
в,all(x,y)
чтобы сохранить несколько байтов. Вы также можете переключитьсяrle(x)$l==1
наrle(x)$l-1
, который затем вернет набор всех,FALSE
еслиx
он действителен; затем переключите позже!=
на==
и иall
к!any
. Это приводит к!any(rle(x<-scan())$l-1,ts(x)==7-lag(ts(x)))
экономии 5 байт. (PS, я написал альтернативное решение , которое может вас заинтересовать.)05AB1E , 15 байтов
Попробуйте онлайн! или как тестовый набор
источник
JavaScript (ES6),
4340 байтВозвращает
0
/true
.Контрольные примеры
Показать фрагмент кода
источник
test()
Perl 6 , 22 байта
Используя регулярное выражение:
Принимает ввод в виде строки. Вдохновленный ответом Ruby от GB .
Как это работает:
/ /
: Регулярное выражение(.)
: Сопоставить любой символ и захватить его как$0
.<{ }>
: Динамически генерировать под-регулярное выражение для сопоставления в этой позиции."$0|" ~ (7 - $0)
: Сгенерированный нами подрегекс - это тот, который соответствует только предыдущей цифре, или 7 минус предыдущая цифра (например5|2
).Таким образом, общее регулярное выражение будет соответствовать, если он найдет недопустимую пару последовательных цифр в любом месте.
{! }
: Привести к логическому значению (с которым сравнивается регулярное выражение$_
), отрицать его и превратить все это в лямбду (с неявным параметром$_
).Perl 6 , 38 байт
Использование обработки списка:
Принимает входные данные как массив целых чисел.
Как это работает:
.[1..*] Z $_
: Заархивируйте входной список версией смещения на одну, чтобы сгенерировать список из 2-х последовательных цифр.[!=] 7 - .[1], |$_
: Для каждого из них проверьте, если(7 - b) != a != b
.all ( )
Возвращает истинное или ложное значение в зависимости от того, вернули ли все итерации цикла значение True.источник
Python, 38 байт
Рекурсивная функция, которая принимает аргументы вроде
f(1,2,3)
.Это использует распаковку аргументов для извлечения первого числа в
h
кортеж, а остальных - в кортежt
. Еслиt
пусто, выведите True. В противном случае, используйте хитрость Згарба, чтобы убедиться, что первые два броска кубика не являются несовместимыми. Затем проверьте, что результат также сохраняется на рекурсивном вызове на хвосте.источник
Рубин, 34 байта
источник
#[]
вместо этого вы можете сбрить два байта, используя строковый метод:->s{!s[/[16]{2}|[25]{2}|[34]{2}/]}
JavaScript
6143 байтаВ комментариях упоминалось, что я не могу использовать функции C # linq без включения оператора using, так что вот то же самое в меньшем количестве байтов при использовании стандартного JS ...
C #,
996765 байтПринимает ввод как массив int
a
Объяснение:
источник
0
или1
вместоfalse
илиtrue
> <> (Рыба) 47 байт
Довольно просто;
Строка 1: проверить, введено ли число, если нет номера (EOF), то у нас есть правдивый вывод на печать других проверок.
Строка 2: результат печати.
Строка 3: превратить вход в число (ASCII 0 - от входа), а затем проверить, равен ли он предыдущему входу.
Строка 4: проверьте, находится ли вход на противоположной стороне матрицы.
источник
Brain-Flak 128 Bytes
Выходы 0 для фальси или -7 для правды.
Попробуйте онлайн! (Правда)
Попробуйте онлайн! (Flasey)
Пояснение (t обозначает вершину, а s обозначает секунду сверху):
источник
MATLAB, 30 байтов
источник
PHP, 63 байта
принимает ввод как список аргументов команды; выходит с
1
(ошибка), если ввод неверен,0
(ок), если действителен.Бежать с
-nr
.введите как строковый аргумент, 65 байт
источник
PowerShell ,
574441 байт( Вычеркнуто 44 все еще регулярно 44 )
Попробуйте онлайн!
(OP пояснил, что принимать входные данные в качестве отдельных аргументов - это нормально - сохранено 13 байтов ... сохранено еще 3 байта путем исключения
$b
)Мы зацикливаемся на вводе
$args
цифр за раз. Каждая цифра, мы убедились , что$l
асты цифра-n
ВЗe
качи к текущей цифре$_
, и что7-$_-$l
некоторое число , отличное от нуля (что truthy). Эти булевы результаты инкапсулируются в паренах и передаются в правый операнд-notin
оператора, сверяясь с0
. Другими словами, если естьFalse
в цикле значение, оно-notin
также будетFalse
. Это логическое значение остается в конвейере, а вывод неявным.Длинный из-за
$
требования к именам переменных и того, что логические команды-ne
-and
в PowerShell многословны. Ну что ж.источник
Обработка,
939290 байтИзменено
||
в|
: 1 байт сохранен благодаря @ClaytonRamseyНачал обратный отсчет: 2 байта сохранены благодаря @IsmaelMiguel
Принимает ввод в виде массива целых чисел, вывод
1
для true или0
для false.Ungolfed
источник
return 0
Внутри оператора if покаreturn 1
нет. Я не понимаю, как это возможно, если у вас нет другой идеиGolfed it! Yipee! (nobody's going to read these summaries so why not have fun :)
<- Я прочитал это, сравнивая то, что у тебя есть с тем, что у тебя было.С
4744 байтапринимает строку цифр (или массив байтов с нулевым символом в конце)
объяснение
F(char*s){
согласно стандартному
int
типу возврата подразумевается. (сохранение 4 байта)return
безусловный возврат, потому что это рекурсивная функцияиспользуя ярлык оценки:
!s[1]||
если второй символ nul, верните true((*s^s[1])%7&&
если первые два символа не являются законными ложнымиF(s+1))
проверьте остальную часть строки таким же образомэто запутанное выражение
*s
первый персонажs[1]
второй*s^s[1]
исключая или объединяя их, если они одинаковы, результат равен 0, если они прибавляются к 7, результат равен 7 (если они различаются и не добавляют к 7, результат составляет от 1 до 6 включительно)так
(*s^s[1])%7
что ноль для плохого ввода и ненулевое в противном случае, таким образом, ложь, если эти 2 символа плохие, и истина в противном случаекомментарий: так как этот вызов функции использует только конечную рекурсию (только последнее утверждение является рекурсивным вызовом), оптимизатор может преобразовать рекурсию в цикл, это счастливое совпадение и, очевидно, не стоит никакого результата в гольфе, но на самом деле позволяет обрабатывать строки любой длины, не выходя из стека.
источник
!((*s^s[1])%7)
Я думаю , что вы не хотите!
. Нулевые значения для неверного ввода будут ложными, поэтому вы хотите вернуть ложь, когда это плохо.Python, 71 байт
Использует рекурсивный подход.
Объяснение:
источник
Сетчатка , 28 байт
Попробуйте онлайн!
В качестве альтернативы:
Попробуйте онлайн!
источник
MATL , 9 байт
Ввод представляет собой массив чисел, представляющих цифры.
Выходными данными является непустой массив, который является правдивым, если все его записи ненулевые, и ложным в противном случае (подробнее о критерии MATL для правдивости и ложности). здесь ).
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
movsum
, уже естьconv2
(что включает в себяconv
); увидетьY+
иZ+
C # (с Linq)
908173716968 байтОбъяснение:
источник
C, 81 байт, был 85 байтов
Входные данные - это массив целых чисел A длиной L. Возвращает 1 для true и 0 для false. Входные данные проверяются от конца до начала, используя входную длину L в качестве индекса массива.
источник
int
необязательно в начале, вы можете сохранить 4 байта.int s=1;
может быть объявлено вне функции какs=1;
для другого 4.Haskell, 37 байт
Пример использования:
f [1,5,2]
->False
.Простая рекурсия. Базовый случай: один элемент списка, который возвращается
True
. Рекурсивный регистр: пустьa
иb
будут первые два элемента списка ввода иc
остальные. Все следующие условия должны выполняться:a+b/=7
,a/=b
и рекурсивный вызов сa
отброшено.источник
JavaScript, 40 байт
Использует функцию JavaScript, которая
&&
будет возвращать последнее проанализированное значение (либо ложное условие, либо последнее условие).0
передается, если оно не удовлетворяет условиям, и предыдущий термин передается в противном случае. 9 гарантирует, что оно начинается с истинного значения.источник
Groovy, 61 байт
источник
Python 2, 58 байт
источник
> <> , 39 байт
Попробуйте онлайн!
источник
Пакетная, 102 байта
Ungolfed:
источник