Вдохновленный и в память о моем дорогом друге и коллеге,
Дэн Баронет , 1956 - 2016 гг. RIP
Он нашел кратчайшее возможное решение APL для этой задачи:
задача
Если задан логический список, подсчитайте количество конечных значений истинности.
Примеры случаев
{}
→ 0
{0}
→ 0
{1}
→ 1
{0, 1, 1, 0, 0}
→ 0
{1, 1, 1, 0, 1}
→ 1
{1, 1, 0, 1, 1}
→ 2
{0, 0, 1, 1, 1}
→ 3
{1, 1, 1, 1, 1, 1}
→ 6
01100
?Ответы:
Дьялог АПЛ,
62 байтаПроверьте это на TryAPL .
Как это устроено
⊥ (uptack, dyadic: decode) выполняет базовое преобразование. Если левый операнд является вектором, он выполняет смешанное базовое преобразование, что идеально подходит для этой задачи.
Для базового вектора b = b n , ⋯, b 0 и цифрового вектора a = a n , ⋯, a 0 , b ⊥ a преобразует a в смешанную базу b , т. Е. Вычисляет b 0 ⋯ b n-1 a n + ⋯ + b 0 b 1 a 2 + b 0 a 1 + a 0 .
Теперь ⍨ (тильда dieresis , commute ) изменяет оператор влево следующим образом. В монадическом контексте он вызывает оператор с равными левым и правым аргументами.
Например, ⊥⍨ a определяется как a ⊥ a , который вычисляет a 0 ⋯ a n + ⋯ + a 0 a 1 a 2 + a 0 a 1 + a 0 , сумму всех накопленных произведений справа налево ,
Для K завершающих единиц, то к крайнему правым продукты 1 , а все остальные являются 0 , поэтому их сумма равна K .
источник
b⊥b
и⊥⍨b
отказываемся от бесконечного ускорения.JavaScript (ES6), 21 байт
Контрольные примеры
Показать фрагмент кода
источник
f(l)+1
вернуть значение> 2
?l.pop()?(l.pop()?(l.pop()?(...etc...)+1:0)+1:0)+1:0
.Желе , 4 байта
Попробуйте онлайн! или Проверьте все контрольные примеры.
Для случая, когда список пуст, есть несколько любопытных наблюдений. Во-первых, длина строки, кодирующая пустой список,
[]
возвращает другой пустой список[]
. Затем извлечение последнего элемента из этого с использованием tailṪ
возвращает0
вместо пары,[value, count]
которые являются регулярными элементами массива кодированной длины серии. Затем продуктP
возвращается0
при вызове,0
что является ожидаемым результатом.объяснение
источник
ŒgṪS
, тоже работает!Ṫ
в желе реализован в виде:lambda z: iterable(z).pop() if iterable(z) else 0
.iterable
при вызове из списка просто возвращает список, и пустой список, конечно, ложный.Брахилог ,
765 байтПопробуйте онлайн!
объяснение
Так как
@] - Suffix
начинается с самого большого суффикса до самого маленького, сначала он найдет самый длинный.источник
CJam (8 байт)
Набор онлайн-тестов
рассечение
источник
Haskell,
2625 байтИспользование:
Версия Pointfree (26 байт):
Использование целочисленного списка вместо списка bool (21 байт, благодаря Christian Sievers):
Использование:
Pointfree версия (25 байт)
источник
foldl
идея работает сa%b=b*(a+1)
Сетчатка ,
75 байтПопробуйте онлайн! (Первая строка включает набор тестов, разделенных переводом строки.)
Определение формата ввода для Retina не совсем однозначно. Поскольку Retina не имеет понятия о каком-либо типе, кроме строк (и также не имеет значения, которое можно использовать для нашего обычного определения истинности и фальши), я обычно использую
0
и1
(или что-то позитивное в целом), чтобы соответствовать истине и фальши, как они представляют ноль или несколько совпадений соответственно.С односимвольными представлениями нам также не нужен разделитель для списка (что, в некотором смысле, является более естественным представлением списка для языка, который имеет только строки). Адам подтвердил, что это приемлемый формат ввода.
Что касается самого регулярного выражения, оно совпадает
r
справа налево и\G
привязывает каждое совпадение к предыдущему. Следовательно, это подсчитывает, сколько1
s мы можем сопоставить с конца строки.источник
05AB1E ,
121065 байтСохранено 1 байт благодаря carusocomputing .
Попробуйте онлайн!
объяснение
источник
0¡¤g
это четыре байта.J0¡¤g
тоже еще короче;).Î
обработать пустой ввод, но это все еще сохраненный байт, спасибо :)Python, 31 байт
источник
Желе , 4 байта
TryItOnline! или все тесты
Как?
источник
MATL , 4 байта
Попробуйте онлайн!
источник
Mathematica,
2524 байтаисточник
FromDigits[b=Boole@#,MixedRadix@b]&
(35 байт).Pyth, 6 байт
Попробуй это здесь!
Добавляет 0, переворачивает и находит индекс первого 0
источник
C90 (gcc), 46 байтов
Ввод осуществляется через аргументы командной строки (одно целое число на аргумент), вывод через код завершения .
Попробуйте онлайн!
Как это устроено
r является глобальной переменной. Его тип по умолчанию равен int и, будучи глобальным, значение по умолчанию равно 0 .
Аргумент функции c по умолчанию также имеет значение int . Он будет содержать целое число n + 1 для массивов из n логических значений ; первым аргументом main всегда является путь к исполняемому файлу.
Аргумент функции v объявлен как
int**
. Фактический тип v будет такимchar**
, но поскольку мы будем проверять только младший значащий бит каждого аргумента, чтобы разделить символы 0 (кодовая точка 48 ) и 1 (кодовая точка 49 ), это не будет иметь значения для little-endian машины.Цикл while уменьшает значение c и сравнивает его с 0 . Как только c достигнет 0 , мы вырвемся из цикла. Это необходимо только в том случае, если массив не содержит 0 .
Пока
0<--c
возвращается 1 , мы берем c- й аргумент командной строки (v[c]
) и извлекаем его первый символ с помощью разыменования указателя (*
). Мы берем побитовое AND логического0<--c
и кодовую точку символа (и три мусорных байта, которые следуют за ним), поэтому условие вернет 0, как только встретится 0 , выходя из цикла.В оставшемся случае, в то время как аргументы командной строки 1 ,
r++
приращения г на 1 , таким образом , подсчет количества завершающих 1 «с.Наконец,
c=r
сохраняет вычисленное значение r в c . С настройками по умолчанию компилятор оптимизирует и удаляет назначение; это фактически генерируетmovl %eax, -4(%rbp)
инструкцию. Так какret
возвращает значение регистра EAX, это генерирует желаемый результат.Обратите внимание, что этот код не работает с C99, который возвращает 0 из основного, если достигнут конец основного .
источник
argc
крайней мере1
(с указаниемargv[0]
имени файла)? Вы можете сохранить один байт--c&&
вместо0<--c&
. Код выхода gcc взят изargc
? Ухоженная.*v[c]
это кодовая точка 1 или 0 , так что это либо 49, либо 48 и, следовательно, всегда верно.k, 6 байтов
Эта композиция функций переводится в
sum mins reverse
inq
, более читабельный брат языка, где mins - это скользящий минимум.источник
J,
93 байтаЭто рефлексивное смешанное базовое преобразование. Потому что это то же самое, что и смешанное базовое преобразование. Очередной раз.
Контрольные примеры
источник
R,
40 3925 байтПолностью переработанное решение благодаря @Dason
Чтение входных данных из stdin, обратный вектор, и, если первым элементом является,
!=0
то вывод первой длины кодировки длин серий (rle
), иначе0
.источник
ifelse(r$v,r$l,0)[1]
. (Если векторизовано, а затем взять первый элемент.)Haskell, 24 байта
Итерирует по списку, добавляя по одному для каждого элемента, сбрасывая до
0
того, как он попадет вFalse
.16 байтов с входом 0/1:
Если бы список был гарантированно непустым, мы могли бы получить 14 байтов:
Это вычисляет совокупный продукт от спины, затем суммирует их. Совокупный продукт остается 1, пока не достигнет 0, а затем станет 0. Таким образом, 1 соответствуют конечным 1.
источник
Пайк,
106 байтПопробуй это здесь!
источник
C # 6,
10372 байтаИспользование неуниверсального списка превосходит общий список на 1 байт
-31 байт благодаря Скотту
источник
int
s, вы можете сойти с рукint a(int[] l)=>l.Reverse().TakeWhile(i=>i>0).Sum();
Func<bool[], int>
для 57 байтов, т.е.using System.Linq;l=>l.Reverse().TakeWhile(x=>x).Count();
Python, 37 байт
источник
DASH , 16 байт
Это не самое короткое из возможных DASH-решений, но самое короткое из возможных DASH-решений вызывает у меня проблемы. Я публикую этот новый подход на своем месте.
Использование:
объяснение
источник
Скала, 25 байт
Ungolfed:
Переворачивает список, добавляет 0 и находит первый индекс 0, который является числом элементов перед первым 0
источник
Пакетный, 57 байт
Принимает ввод как параметры командной строки. Работает путем умножения аккумулятора на текущее значение перед его добавлением, так что любые нули в командной строке сбрасывают счет. Обратите внимание, что
%%n
это не то же самое, что переменнаяn
или%n%
.источник
GolfSharp, 14 байтов
источник
Java 7, 62 байта
Ungolfed & тестовый код:
Попробуй это здесь.
Выход:
источник
Perl 5,10, 22 байта
21 байт + 1 байт для
-a
флага. Поскольку выражение на основе регулярных выражений было сделано ...: pВходные значения для массива должны быть разделены пробелом.
Попробуйте онлайн!
источник
perl -E '$_++while pop;say' 0 1 1 0 1 1 1
но это ничего не выводит для0
(хотя я не уверен, что это проблема!)Perl, 22 байта
21 байт кода + 1 байт для
-p
флага.Чтобы запустить это:
( На самом деле, формат ввода не имеет значения , много:
0110111
,0 1 1 0 1 1 1
, и[0,1,1,0,1,1,1]
т.д. бы все работы)18- байтовая версия от @Dom Hastings, но она требует ввода в виде строки 0 и 1, что недопустимо:
источник
;
трюк :) Если формат - это одна непрерывная строка:perl -pE '/1*$/;$_=length$&' <<< '0110111'
для 18, не уверен, что это нарушает правила или нет ...PHP, 50 байт
Жутко моя первая попытка с регулярным выражением оказалось короче , чем мои попытки с массивами ...
Использование как:
источник
Ruby
3732 байтаСоздает анонимную функцию, которая находит самый правый экземпляр ложного значения и подсчитывает размер подмассива, начиная с этого значения.
Используется
!0
как false, так как 0 являются истинными значениями в Ruby.rindex
находит последний индекс значения в массиве.Использование :
Возвращает 1
Если бы мне было разрешено передать строку 0 и 1 в качестве параметров командной строки (что не так, как ruby представляет списки логических значений), я мог бы получить значение 24:
При этом используются регулярные выражения и выводится длина строки, возвращаемой регулярным выражением
/(1*)\z/
, где\z
находится конец строки.$*[0]
является первым переданным аргументом и является строкой 0 и 1.Использование:
Возвращает 1.
источник