В типографии счетчик - это область буквы, которая полностью или частично заключена в буквенную форму или символ. Закрытый счетчик - это счетчик, который полностью заключен в буквенную форму или символ. Вы должны написать программу, которая принимает строку в качестве входных данных и печатает общее количество закрытых счетчиков в тексте.
Ваш вклад:
Может быть из командной строки или из STDIN, но вы должны указать, какой именно.
Будет полностью состоять из печатных символов ASCII, что означает все значения ASCII от 32 до 126 включительно. Это включает в себя пробелы. Дополнительная информация.
Теперь это немного различается между шрифтами. Например, шрифт, в котором вы читаете этот текст, считает, что «g» имеет один закрытый счетчик, тогда как шрифт Google имеет «g» с двумя закрытыми счетчиками. Так что это не проблема, вот официальное количество закрытых счетчиков на символ.
Все символы без закрытых счетчиков:
!"'()*+,-./12357:;<=>?CEFGHIJKLMNSTUVWXYZ[\]^_`cfhijklmnrstuvwxyz{|}~
Обратите внимание, что это включает в себя пространство.
Вот все символы с одним закрытым счетчиком:
#0469@ADOPQRabdegopq
А вот и все символы с 2 закрытыми счетчиками:
$%&8B
И последнее, но не менее важное, вот несколько примеров входов и выходов.
Programming Puzzles and Code-Golf
должен напечатать 13
4 8 15 16 23 42
должен напечатать 5
All your base are belong to us
должен напечатать 12
Standard loopholes apply
должен напечатать 12
Shortest answer in bytes is the winner!
должен напечатать 8
g
есть два закрытых счетчика. Вы определили счетчики на основе какого-либо конкретного шрифта?g
есть 2. Немного сбивает с толку, чтобы прочитать, но я не думаю, что это отличается по местоположению.0
имеет 2 закрытых счетчика в определенных шрифтах, особенно во многих моноширинных шрифтах?Ответы:
Pyth, 31 байт
Демонстрация.
Обратите внимание, что код может отображаться неправильно из-за использования не-ASCII символов. Правильный код находится по ссылке.
Я сделал таблицу поиска выходных данных, требуемых для каждого входного символа, повернул ее на 32, чтобы использовать модульное индексирование Пита, вставил 1 в начале и интерпретировал его как основную цифру 3, давая число
2229617581140564569750295263480330834137283757
. Затем я преобразовал это число в основание 256 и преобразовал его в строку, которая является строкой, используемой в ответе.источник
Питон 3, 63
Простой подход. Перебирает каждый символ с закрытым счетчиком, суммируя количество вхождений, делая это дважды для символов с двумя закрытыми счетчиками. Это было бы той же длины, чтобы вместо этого написать
Python 3 необходим, чтобы избежать
raw_input
.источник
CJam,
41393734 байтаСпасибо @ jimmy23013 за игру в 3 байта!
Попробуйте онлайн.
Как это устроено
источник
"$%&8Badopq#0469@Rbeg"_A<eu+
,eu
иel
, но так и не нашел. Благодарность!Сед, 51
С помощью гольфа от @manatwork и @TobySpeight:
Ввод из STDIN. Имея в виду этот мета-вопрос , результат в унарном виде:
источник
Perl, 41
41
символы +1 за-p
флаг.Это использует y /// для подсчета символов.
источник
GNU APL, 39 байт
Попробуйте его в Интернете в GNU APL.js .
Как это устроено
источник
JavaScript, 86
Ввод / вывод через всплывающее окно. Выполните фрагмент код в любом
гнедавнего браузера для тестирования.источник
K
54434237 байтВырежьте 5 байтов благодаря @JohnE!
Старая версия:
Оригинал:
источник
#&
таким же успехом может быть и внутри паренсов+/
, а значит, вы можете пойти дальше+//"#0469@ADOPQRabdegopq$%&8B$%&8B"=\:
. Наконец, нет необходимости иметь,f:
так как функцию можно использовать в неявной форме. Это привело бы вас к 38!+//(30#"$%&8B#0469@ADOPQRabdegopq")=\:
. Это может быть лучшее, что мы можем сделать.+//(30#"$%&8B#0469@ADOPQRabdegopq"=)'
C 127 байтов
Довольно просто. Безголовая версия:
Проверьте это здесь
Если аргументы функции не разрешены, тогда
stdin
версия занимает до 141 байта:Обратите внимание, что в приведенной выше версии предполагается, что длина ввода не более 98 символов.
Проверьте это здесь
Версия аргументов командной строки (143 байта):
Проверьте это здесь
источник
Python 2,
96907567 + 2 = 69 байтНе могу придумать другого способа сделать это ... это то, что я думал бы, пока не увидел решение xnor. Я выложу то, что у меня было в любом случае.
Спасибо FryAmTheEggman за сохранение 6 байт
Хорошо, теперь я доволен этим.
Спасибо xnor за трюк с поиском, сэкономив 4 байта.
Добавлены два байта, поскольку входные данные должны быть заключены в кавычки.
источник
Ява, 162
Хорошо , если это имеет быть полная программа ... Это просто один лайнер , который соответствует символам и заменяет их с более длинной строки. Затем возвращает разницу в длине от оригинала. К сожалению, java на самом деле не имеет ничего, чтобы просто посчитать количество совпадений.
Вот это с переносами строк:
источник
Pyth - 35 байт
Использует очевидный метод в первом + * 2 во втором. Спасибо @FryTheEggman.
Попробуйте здесь онлайн .
источник
Javascript,
11495 байтСпасибо Исмаилу Мигелю за помощь в этом.
источник
alert(prompt().replace(/[#046@ADOPQRabdegopq]/g,9).replace(/[$%&8B]/g,99).match(/9/g).length)
Рубин, 59 байт
Ввод из командной строки или стандартного ввода. Самый короткий пока что использование неэзотерического языка.
Обновление: чилимаги бить меня
источник
Сетчатка , 44 байта
Дает вывод в одинарный.
Каждая строка должна идти в свой собственный файл или вы можете использовать
-s
флаг. Например:Пары линий (пары шаблон - замена) выполняют следующие шаги замещения:
1
'ы1
11
1
«sисточник
J, 43
Как функция:
46 байт (командная строка)
Как отдельная программа командной строки:
Сохраните вышеприведенную строку как
counter2.ijs
и вызовите из командной строки:источник
f=:your_function_code
.Юлия,
7774 байтаЭто читает текст из STDIN и печатает результат в STDOUT.
Ungolfed + объяснение:
Пример:
источник
RS , 56 байт
Живая демоверсия.
источник
GNU APL, 37 символов
построить символьный вектор, который содержит 2 счетчика символов дважды (30⍴)
сравнить каждый входной символ с каждым символом в векторе (∘. =)
подвести итоги разыгранных матчей (+ /,)
источник
Javascript
159, 130 байтunminified:
С помощью @ edc65:
источник
~ -1 == 0
, вы можете написать~x?
вместо-1 != x?
. Смотрите мне ответ для примера использования.function c(b){return b.split('').reduce(function(t,a){return t+(~"$%&8B".indexOf(a)?2:~"#0469@ADOPQRabdegopq".indexOf(a)?1:0)},0)}
Нет необходимости , чтобыmap
затемreduce
Хаскелл, 117
c - это функция,
c :: Int -> String -> Int
которая принимает счетчик и строку и просматривает строку по одной букве за раз, проверяя, является ли текущая буква членом массива из 1 точки или массива из 2 точек, и вызывает себя для остальной части строки после увеличения Счетчик соответствующей суммы.Вызов со счетчиком = 0 в ghci:
источник
C #, 157
Ungolfed:
Преобразование строки в массив символов, а затем проверка наличия каждого символа в каждом счетчике. Если это во втором, я просто увеличиваю счетчик снова.
источник
Эрланг, 103 байта
Это полная программа, которая запускается с использованием escript. Первая строка файла должна быть пустой (добавляется 1 байт).
Образец прогона:
источник
C, 99 байтов
объяснение
Далее я сыграл в гольф ответ Cool Guy ; это слишком долго, чтобы быть комментарием. Вместо
if
/else
я использовал!
преобразование указателя в bool. Я также сделалo
включение,t
чтобы я мог добавить «находится вo
» и «находится вt
» для общего количества счетчиков.Расширенный код
Выход находится в
num
, который должен быть очищен перед каждым вызовом.Программа испытаний и результаты
Сам код содержит 37 счетчиков по своей метрике.
источник