Большинство людей здесь знакомы с семью сегментами дисплеев, которые также используются в головоломках спичек. Ниже приведены цифры 0
через 9
и письма a
через z
, за исключением того k,m,t,v,w
, написанные в этом формате.
_ _ _ _ _ _ _ _
| | | _| _| |_| |_ |_ | |_| |_|
|_| | |_ _| | _| |_| | |_| _|
_ _ _ _ _ _ _ _ _
|_| |_ | _| |_ |_ | |_ | | | _ _ |_| |_| _ |_ |_| |_| _|
| | |_| |_ |_| |_ | |_| | | | |_| |_ | | |_| | | | _| |_| | | | |_
Задача здесь проста. Учитывая входную строку, выведите количество спичек, необходимых для представления этой строки. Если строка содержит символ вне вышеприведенного представления, игнорируйте его (считайте 0).
Например, для ввода 53
требуется общее количество 10
совпадений, 5
для 5
и 5
для 3
, поэтому вывод 10
.
Для ввода hello
требуется общее количество 19
спичек, h (4), e (5), l (3), l (3), o (4)
поэтому вывод есть 19
.
Для ясности вот спички, необходимые для построения каждого персонажа:
0 -> 6
1 -> 2
2 -> 5
3 -> 5
4 -> 4
5 -> 5
6 -> 6
7 -> 3
8 -> 7
9 -> 6
a -> 6
b -> 5
c -> 4
d -> 5
e -> 5
f -> 4
g -> 5
h -> 4
i -> 2
j -> 4
l -> 3
n -> 3
o -> 4
p -> 5
q -> 5
r -> 2
s -> 5
u -> 3
x -> 5
y -> 4
z -> 5
Теперь для поворота, и есть два из них.
- Во - первых, что вход считается к регистру в чувствительной. То есть
A
иa
оба должны учитывать6
спички, хотя визуальное представление выглядит как заглавныеA
. - Ваша оценка - ваш исходный код, выполненный по этому алгоритму, плюс длина исходного кода в байтах, чем меньше, тем лучше. Например, если ваш исходный код был
abc123
, ваш счет будет6+5+4+2+5+5 = 27 + 6 = 33
. Если ваш исходный код был#&@()*
, ваш счет будет0 + 6 = 6
.
Примеры ввода / вывода
0 -> 6
53 -> 10
111 -> 6
112 -> 9
8888 -> 28
hello -> 19
PPCG -> 19
Programming Puzzles & Code Golf -> 99
#&()mt!!~ -> 0
*DḌƤÆE%Ḅċ0 -> 16
правила
- Если применимо, вы можете предположить, что ввод / вывод будет соответствовать целочисленному типу вашего языка.
- Вход и выход могут быть заданы любым удобным способом .
- Допустимы либо полная программа, либо функция. Если функция, вы можете вернуть вывод, а не распечатать его.
- Стандартные лазейки запрещены.
code-challenge
counting
AdmBorkBork
источник
источник
|_\n|_
(строчные буквыt
)[0-9a-z]
мы должны считать 0 спичек? Вот что я понимаю из вашей оценки - ваш исходный код проходит по этому алгоритму плюс длина исходного кода в байтах .Ответы:
Python 2 , 97 байт + 237 совпадений = 334
Попробуйте онлайн!
Это работает путем генерации строки, в которой каждый строимый символ содержит одинаковое количество спичек, необходимых для построения этого символа.
источник
+'069a8'*6+'8')
вместо+'069a'*6+'8'*7)
.Perl 5 с
-pF
, 95 байт + 14, 109Это эквивалентно:
но используя
~
оператор, мы можем использовать старшие байты и избегать большого количества символов, не жертвуя байтами.Все еще довольно далеко от счета Тони, даже с помощью!
Попробуйте онлайн!
Это решение содержит непечатаемые таблицы, поэтому вот обратимый шестнадцатеричный дамп для проверки количества байтов:
источник
}{
? Брось и-n
вариант. Кроме того, вы продолжаете подделывать+lc
вместоlc()
:-)+
не сразу приходит на ум! Мне нужноn
на моей машине и забыть, что я могу уронить ее!}{
и-p
» (и замените его на,-n
если ваш perl все еще нуждается в нем. В настоящее время он все равно не считается)JavaScript (ES6), 198 (102 байта + 96 спичек)
Сохранено 5 баллов благодаря @ l4m2
Попробуйте онлайн!
Как?
Мы используем код ASCII по модулю 9 символов, который не добавляет штрафов для кодирования количества спичек.
Нам не нужно беспокоиться о случае, потому что он
parseInt()
не учитывает регистр.Для символов, которые не соответствуют [0-9A-Za-z] ,
parseInt()
возвращается,NaN
и поиск строки приводит кundefined
. После приведения к строке"undefined".charCodeAt()
возвращает код ASCII"u"
, равный 117 . Удобно, 117 по модулю 9 дает 0, как и ожидалось.источник
v=>[...v].map(w=>t+='~{w__^_{]|{{_^__^_^w^~]~]^__w_~]~~_^_'.charCodeAt(1+parseInt(w,36))%9,t=+[])|t
1 меньшеЖеле , 42 байта + 0 спичек = 42 балла
Спасибо @JonathanAllan за -2 балла!
Попробуйте онлайн!
Как это устроено
Литералы, которые начинаются с
“
и заканчиваются’
разделением на“
, заменяют оставшиеся символы их основанными на 1 индексами на кодовой странице Jelly, затем преобразуются из биективного основания 250 в целое число.Этот конкретный буквальный кодирует
×/
уменьшает умножением, давая(Кодирование этого целого числа напрямую сэкономило бы 6 байтов, но стоило 28 спичек.)
ṚṚ
дважды переворачивается; первый вызов переводит целое число в свой массив цифр. Это даетċЀØW$
count (ċ
) вхождения каждого (Ѐ
) символа «A ... Za ... z0 ... 9_» (ØW
) во входной строке.Наконец,
æ.
берется скалярное произведение, умножая количество каждого символа на соответствующую стоимость в спичках, а затем беря сумму.источник
D
чтобы сохранить другой. Попробуй онлайнƊ
. Благодарность!Perl 5
-p
, код9064 + 9 жгутов Eval + 14 спичек = 87Замените шестнадцатеричные коды их буквальным 1-байтовым вариантом ( не UTF-8, как пытается TIO) для заявленной оценки
Попробуйте онлайн!
Код внутри дополненной строки:
источник
Желе , 34 байта + 3 совпадения = 37
Монадическая ссылка, принимающая список символов и возвращающая целое число.
Попробуйте онлайн!
Как?
Работает аналогично ответу на желе Денниса, но потребовал достаточно усилий, чтобы я чувствовал, что это оправдывает другой ответ. Основное отличие состоит в том, что в нижнем регистре вводится стоимость трех совпадений (
Œl
содержитl
), что позволяет использовать гораздо меньшее число для создания массива затрат. Сложнее было найти способ построить это число без совпадений, оставаясь при этом кратким.ØW
Таким"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"
образом, подсчет входных значений в нижнем регистре всегда начинается с 26 нулей. Мы можем изменить это и выполнить точечное произведение с массивом длиной 37 вместо одного с длиной 63.источник
PHP 176 байт = 397 баллов
Попробуйте онлайн!
источник
SOGL V0.12 , 34 байта + 18 = 52
Попробуй здесь!
Гольф, но не забил так сильно :
источник
Python 3 , 138 + 265 = 403 байта
Попробуйте онлайн!
источник
Рубин , 125 байт + 87 спичек = 212
Попробуйте онлайн!
Сильно вдохновлен ответом Арнаулда на Javascript .
Обычно стоимость объявления лямбды для использования только дважды не стоит этого, но вес спички "
scanap
".scan(/./).map
изменил это. Это было весело!источник
МАТЛ , оценка
166156Длина кода 41 + выход для кода, используемого в качестве входа 115.
Попробуйте онлайн!
источник
R, 112 байт + 319 совпадений = 431 счет
Попробуйте онлайн!
Слава Джузеппе который придумал это улучшение.
Старая версия, 143 байта + 454 совпадения = 597 баллов
Чтобы
el()
функция работала на TIO, вам нужно использоватьlibrary(methods)
.Черт возьми, это R многословно!
источник
methods
пакет автоматически , но, поскольку этоbase
пакет, я всегда помещаю его в заголовок и не считаю его для подсчета байтов.readline
также не будет работать на TIO, поскольку это не интерактивный сеанс. Это, безусловно, игра в гольф, хотя.Perl 6 , 87 байт + 26 спичек = 113
Попробуйте онлайн!
Использует некоторые не-ASCII символы Unicode. Таблица поиска закодирована в строке Unicode:
Символы преобразуются в индексы с помощью преобразования base-36 с использованием арабско-индийских цифр:
источник
sed, 367 (байты исходного кода) + 532 (количество спичек для исходного кода) = 899
Попробуйте онлайн
Многострочная версия:
Объяснение:
Вышеуказанный скрипт построчно считывает стандартный ввод (в пространство шаблона - обычный «способ sed») и для каждой строки выводит количество спичек, необходимых для представления всех представляемых спичками символов в этой строке. Вычисления для каждой строки ввода выполняются следующим образом:
Сначала мы удаляем каждый символ, для которого у нас нет соответствующего представления спички (как указано в вопросе) из пространства образца. То есть мы удаляем каждый символ, который не является ни цифрой от «0» до «9», ни буквой от «а» до «j», от «n» до «s», «l», «u», «х», «у» или «г». Прописные и строчные буквы обрабатываются одинаково.
Если мы получим пустое пространство шаблона, мы печатаем 0 (автоматически следует новая строка, как всегда делает sed, если вы не передаете ему специальный флаг), пропускаете все задние строки сценария и переходите к следующему «циклу sed» ( т. е. читать следующую строку ввода и повторять обработку заново, начиная с первой команды, пока не останется больше строк ввода для обработки).
В противном случае, если пространство шаблона не является пустым, мы теперь разделяем его на два «подпространства», разделенных точкой с запятой: сначала идет пространство ввода , которое первоначально формируется всеми символами, которые не были удалены из пространства шаблона после исполнение строки 1; Далее следует точка с запятой, а после нее - пространство карты .
Пространство карты говорит нам, сколько спичек рядом с 1 необходимо для представления каждого соответствующего буквенно-цифрового символа. Если мы хотим узнать, сколько совпадений необходимо для представления любого алфавитно-цифрового символа в пространстве карты, мы ищем первую последовательность смежных% слева от этого символа, и ответом будет число% в эта последовательность плюс 1. Так, например, количество спичек, необходимых для представления «b», равно 4 + 1 = 5; представлять «4», 3 + 1 = 4, представлять «y», 3 + 1 = 4; и так далее.
Это петля. Теперь мы заменим каждый символ во входном пространстве на (завершенную) последовательность%, число которой указывает необходимое количество спичек для представления этого символа, и последуем за этой последовательностью символом пробела (опять же, заглавные и строчные буквы дано такое же лечение). Критерий определения того, должен ли цикл завершиться, заключается в проверке наличия символа пробела в левой части точки с запятой в пространстве шаблона: если это условие выполняется, мы завершаем цикл и переходим к следующей строке.
Эти две строки удаляют точку с запятой и все после нее из пространства шаблона, а затем вставляют запятую и точку с запятой в начало пространства шаблона. Теперь у нас есть пространство шаблонов, разделенное еще раз на два новых подпространства: пространство аналоговых результатов перед точкой с запятой и пространство аналоговых входов после него.
Пространство аналогового ввода - это то, что мы ранее называли «пространством ввода», но в другой форме: теперь оно содержит последовательности%, разделенных пробелом. Общее количество таких% в пространстве аналогового ввода равно количеству спичек, необходимых для представления исходной строки входных символов, т. Е. Это число является результатом. Но мы должны напечатать этот результат в десятичной записи, а не как последовательность знаков процента. Цель аналогового результата пространства , чтобы провести аналоговое представление каждой цифры результата , пока мы вычислить , что результат путем суммирования каждой непрерывной последовательности% 'S в пространстве аналогового входа по одному. Следующий цикл выполняет эту сумму:
Сначала после ярлыка 2 мы перемещаем следующую смежную последовательность% после точки с запятой из пространства аналогового ввода в непосредственную левую точку с запятой в пространстве аналоговых результатов;
Далее, мы вступаем в под-цикл (метка 3 ), который выполняет следующие вычисления:
Если в аналоговой области результатов есть непрерывная последовательность из десяти% после запятой, мы удаляем эти% и помещаем один% непосредственно слева от запятой. Проще говоря, это означает, что одно из десятичных разрядов в результате получило более 9 единиц, поэтому мы убираем 10 единиц из этого десятичного разряда и добавляем 1 единицу к следующему большему десятичному разряду;
Если «%» является первым символом в пространстве шаблона, мы вставляем новую запятую непосредственно перед ним. Это указывает на то, что сумма достигла значения, у которого десятичное представление имеет еще один десятичный знак слева от предыдущего значения;
Если в аналоговом результирующем пространстве все еще есть какая-то непрерывная последовательность из десяти%, мы возвращаемся к метке 3 и повторяем этот процесс. В противном случае мы выходим из этого под-цикла и переходим на следующую строку.
Теперь, если все еще есть «%» в пространстве аналогового ввода (то есть после точки с запятой), это означает, что к общей сумме еще нужно добавить некоторое количество спичек - поэтому мы возвращаемся к метке 2 .
Как только сумма будет завершена, мы переходим к последнему циклу кода:
Здесь мы проверяем каждую пару символов, образованную запятой слева и точкой с запятой или запятой справа. Мы заменяем все такие пары символов на «0» внутри двух запятых.
Приведенный выше фрагмент кода довольно прост: мы заменяем каждую смежную последовательность% в пространстве аналоговых результатов символом десятичной цифры, который соответствует числу% в каждой конкретной последовательности.
Наконец, мы удаляем каждый нечисловой символ из пространства образца, и остается только конечный результат в знакомой десятичной записи. Это значение печатается на стандартном выводе, и начинается следующий цикл sed, если есть еще входные строки для обработки.
источник
C (gcc) , 134 байта + 38 спичек = 172
Попробуйте онлайн!
источник
05AB1E , 30 байтов + 70 совпадений = 100 баллов
Попробуйте онлайн!
-5 спасибо Эмгине
источник
Al
=A
. Вам также не нужно}
.Java 10,
452432416404 (145 байтов + 259 соответствий)Объяснение:
Попробуйте онлайн.
Имена переменныхРЕДАКТИРОВАТЬ:$ραετ
используются вместо букв.kmtvw
вместо этого теперь используются имена переменных , потому что они не могут быть сформированы совпадениями в соответствии с описанием задачи.''
(непечатный) используется вместо6
.m-m
иt-t
используются вместо0
.(char)(w|32)+""
с вводом символьного массива, используемого вместо вводаw.toLowerCase()
строкового массива.источник
AutoHotkey , 148 байт + 345 спичек = 493
Этот был немного сложным для сокращения.
источник
Python 3 , 123 байта + 65 совпадений = 188
Безымянная функция, принимающая строку и возвращающая целое число.
Содержит много непечатаемых символов (в частности, байтов от одного до восьми).
Попробуйте онлайн!
источник
Древесный уголь , 48 байтов + 3 = 51
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Переберите символы входных данных, рассчитайте количество спичек каждого из них, затем сложите результат, преобразуйте в строку и неявно напечатайте.
Если это письмо ...
Посмотрите количество спичек в сжатой строке
65455454240303455250300545
.Иначе, если это появляется в значении
2 ** 1000
...Посмотрите количество спичек в сжатой строке
6255456376
.источник
PHP, 98 + 253 = 351
Запустите как трубу с
-nr
или попробуйте онлайн .источник