вступление
Ежегодно ООО «Дьялог» проводит студенческий конкурс. Задача состоит в том, чтобы написать хороший код APL. Это не зависящий от языка код-гольф издание восьмой проблемы этого года.
У меня есть явное разрешение опубликовать этот вызов здесь от первоначального автора конкурса. Не стесняйтесь проверить, перейдя по предоставленной ссылке и связавшись с автором.
проблема
Учитывая булевский список *, "выключите" все Истины после первой Истины.
Нет правды? Нет проблем! Просто верните список без изменений.
Примеры
[falsy,truthy,falsy,truthy,falsy,falsy,truthy]
→ [falsy,truthy,falsy,falsy,falsy,falsy,falsy]
[]
→ []
[falsy,falsy,falsy,falsy]
→ [falsy,falsy,falsy,falsy]
* Все ваши правды должны быть идентичны, и все ваши ложные сообщения должны быть идентичны. Это включает в себя вывод.
Ответы:
Python 2 , 35 байт
Попробуйте онлайн! Вход и выход - это линии True / False.
По решению Дениса . Переопределяет переменную,
True
которая будетFalse
послеTrue
ввода. Таким образом, любые последующие материалыTrue
будут оцениватьсяFalse
и печататься как таковые.Переопределение
True&=b<1
, то естьTrue = True & (b<1)
. Когда входной сигналb
являетсяTrue
, то(b<1)
это значение False (сTrue==1
), так чтоTrue
становитсяFalse
.источник
True, False = False, True
.APL , 2 байта
Оценивает функцию "сканирование с использованием менее чем". Попробуйте онлайн!
объяснение
В APL оператор
\
(сканирование) уменьшает каждый непустой префикс массива справа, используя предоставленную функцию. Например, для данного массива0 1 0
он вычисляет0
(префикс длины 1),0<1
(префикс длины 2) и0<(1<0)
(префикс длины 2) и помещает результаты в новый массив; круглые скобки связаны справа. Снижение<
справа1
показывает, когда последний элемент массива равен1
остальному0
, а остальные равны , поэтому префикс, соответствующий крайнему левому краю1
, уменьшается до1
остальных0
.источник
Aceto ,
1917 байт не конкурируетНовая версия (17 байт):
Эта новая версия принимает символы по одному и лучше всего выполняется с
-F
опцией. Он работает аналогично, но не идентично предыдущему решению:Старый ответ (19 байт):
(Не конкурирует, потому что мне пришлось исправить две ошибки в интерпретаторе)
Это первый ответ Aceto, который подчеркивает, на что он способен относительно хорошо, я бы сказал. «Списки» - это входные потоки, с одним вводом на строку, «1» для истины и «0» для «ложь», с пустой строкой, обозначающей конец списка.
Программы Aceto работают по кривой Гильберта, начиная слева внизу и заканчивая справа внизу. Во-первых, мы читаем
r
строку,d
уточняем и отрицаем ее (!
), превращая пустые строки в True, а все остальное в False. Затем есть условное горизонтальное зеркало (|
): если верхний элемент в стеке верен, зеркально отразите по горизонтали. Это происходит, когда строка была пустой. Если мы делаем зеркалирование, мы приземляемся на тогоX
, который убивает переводчика.В противном случае мы конвертируем оставшуюся копию в стеке в
i
nteger и делаем другое условное горизонтальное зеркало: на этот раз, потому что 1 истинно, а 0 ложно, мы зеркально отображаем, если видим (первое) истинное значение. Если мы не зеркальноp
отображаем (так что мы увидели 0), мы набираем то, что находится в стеке (поскольку стек пуст, ноль), и переходим кO
началу кривой, откуда мы начали, снова запуская весь процесс.В противном случае, когда мы увидели 1, мы отражаемся и приземляемся на
u
, что меняет направление, в котором мы движемся по кривой Гильберта.1p
печатает 1, и теперь мы продолжаем то же самое,O
что и если бы мы видели 0, но, поскольку мы находимся в «обратном режиме», наш источник находится внизу справа , поэтому мы прыгаем туда.Теперь мы читаем
r
еще одну строку и отрицаем ее. Если строка была пустой, и, следовательно, верхний элемент стека является правдивым, не`
произойдет следующая команда ( ), что заставит нас выйти.X
В противном случае (если строка не была пустой), мы действительно спасаясь от
X
и игнорировать его. В этом случае мы идем влево (<
),p
rint 0 (потому что стек пуст) и возвращаемся кO
rigin.источник
Java8,
2419 байтНадеюсь, это законно; У меня сложилось впечатление, что ввод / вывод не должен оцениваться как истинный / ложный в языке. Принимает long в качестве входного значения и дает один в качестве выходного, причем единицы имеют значение true, а нули - false в двоичном представлении. Например, двоичный код 00101 равен 5 и возвращает двоичный код 00100, который равен 4.
Пять байтов благодаря @puhlen
источник
Long::highestOneBit
дает идентичный результат с более коротким синтаксисомjava.lang
пакет импортируется по умолчанию. Из спецификации языка «Модуль компиляции автоматически имеет доступ ко всем типам, объявленным в его пакете, а также автоматически импортирует все открытые типы, объявленные в предопределенном пакете java.lang.»Сетчатка , 6 байт
Попробуйте онлайн!
Ввод - это список
0
s (для False) и1
s (для True).Соответствует всем
1
и заменяет все, кроме первого (1>
), на0
.источник
V , 7 байт
Попробуйте онлайн!
Моя первая подача V! \ О /
Как это устроено
источник
r0
с<C-x>
декрементировать те и сохранить байт.Haskell , 25 байт
Анонимная функция, принимающая и возвращающая список
Bool
s.Используйте как
(foldr(\x l->x:map(x<)l)[])[False,True,False,False]
.Попробуйте онлайн!
Как это устроено
x
это элемент, который будет добавлен к подспискуl
.False
сопостовительные меньшеTrue
, такmap(x<)l
будут превратить любогоTrue
с вl
в ,False
еслиx
естьTrue
.источник
Желе , 4 байта
Попробуйте онлайн!
Вот алгоритм, довольно отличающийся от большинства других языковых решений для игры в гольф (хотя после того, как я его опубликовал, я заметил, что решение R также использует этот алгоритм), и привязка к текущему держателю записи Jelly.
объяснение
Пока все элементы слева от элемента равны 0, совокупная сумма до элемента будет равна самому элементу. Справа от первого 1 они различаются (потому что теперь мы добавляем ненулевое общее количество элементов слева). Таким образом,
+\=
дает нам список, содержащий 1 (т. Е. Истина) до и включая первый истинный элемент. Наконец, логическое И с исходным списком даст нам 1 только для первого истинного элемента.источник
JavaScript (ES6),
3326 байтВвод / вывод находится в массивах 0 и 1.
источник
05AB1E , 6 байтов
Код:
Объяснение:
Использует кодировку 05AB1E . Попробуйте онлайн!
источник
1k>sƶ-_
это еще хуже, хотя.lift
Идея может иметь потенциал , хотя.Симулятор машины Тьюринга , 39 байт
Попробуйте онлайн!
источник
Brainfuck , 55 байт
Попробуйте онлайн!
источник
Желе , 4 байта
Порт моего ответа 05AB1E.
Пояснение (аргумент α ):
Попробуйте онлайн!
источник
R , 24 байта
Попробуйте онлайн!
Пример:
Для ввода
FALSE TRUE TRUE FALSE
cumsum(T<-scan(,F))==T
возвращаетсяTRUE TRUE FALSE FALSE
. F в скане обеспечивает логический ввод.FALSE TRUE TRUE FALSE
иTRUE TRUE FALSE FALSE
естьFALSE TRUE FALSE FALSE
. Сингл&
делает поэлементное сравнение.источник
Октава, 23 байта
Попробуйте онлайн!
Первое отличие совокупного максимума списка.
источник
J , 3 байта
Определяет монадический глагол. Это тривиальный порт моего ответа APL . Попробуйте онлайн!
источник
Python, 58 байт
Если
x[i]
ложь, вывод ложен; в противном случае он определяет, является ли элемент первым вхождением в сам массив.источник
PHP, 37 байт
источник
Perl 5, 20 байт
Истина
1
и ложь''
(пустая строка).Объяснение:
map
перебирает элементы списка it@_
, аргументы передаются в подпрограмму, устанавливает для каждого элемента значение $ _ локально и возвращает массив возвращаемых значений, которые он вычисляет из каждого элемента.$_&&!$x++
выводит,$_
если$_
это фальсификация и!$x++
если это правда. (Обратите внимание, что && имеет короткое замыкание, поэтому!$x++
не выполняется, пока не будет достигнуто первое истинное значение).$x++
Возвращает0
(что неверно) при первом запуске, а затем увеличивается каждый раз (и поэтому остается правдивым). В!
отменяет$x++
, и поэтому она возвращает truthy первый раз , когда он встречается и falsey после этого.источник
sub{...}
).Pyth - 9 байт
Попробуй здесь
источник
m&!~|Z
.Python 2 ,
4536 байтВход и выход - один логический ( True или False ) на строку.
Попробуйте онлайн!
источник
C #, 77 байт
Компилирует в
Func<bool[], bool[]>
. Ничего умного на самом деле, просто прямое решение.источник
sed ,
1619 байтов15Исходный код 18 байтов + 1 байт для флага -r (или -E для BSD sed).Попробуйте онлайн!
Редактировать: Спасибо Райли за указание на ошибку.
источник
Желе , 4 байта
Попробуйте онлайн!
Как?
Это делает то, что было задано в буквальном смысле:
источник
с (со встроенными gcc), 40
Немного другой подход:
Это может быть признано недействительным - в этом случае я с радостью отмечу это как не конкурирующее.
Входные и выходные «массивы» представляют собой 32-разрядные целые числа без знака - это ограничивает размер списка ввода ровно 32 - это может быть дисквалификатором. Если длина входа меньше 32 бит, то он может быть дополнен нулевыми битами в конце.
Попробуйте онлайн .
источник
Пакетная,
8573 байтаПринимает ввод в качестве аргументов командной строки. Для примера:
1.bat 0 1 0 1 0 0 1
Предыдущая версия
источник
Brain-Flak , 230 байт
Я скоро объясню, но моя мама приготовила мне немного жареной картошкиПопробуйте онлайн!
Особая благодарность
Отдельное спасибо Wheat Wizard и Riley за помощь в написании кода!
источник
Python 3,
696664605453 байтаПринимает массив
false
s иtrue
s. Это список изfalse
s, за исключением случаев, когда значение текущей итерации равноtrue
первомуtrue
во входных данных.Это кажется немного длинным (и это моя первая лямбда), так что, если вы найдете способ поиграть в гольф, это будет с благодарностью!
источник
0 for
0for
.Brain-Flak ,
146144 байтаПопробуйте онлайн!
источник
Perl 5 , 12 байт
Код 10 байтов + 2 для
-pl
.Попробуйте онлайн!
источник