Счетчик счетчик


18

В типографии счетчик - это область буквы, которая полностью или частично заключена в буквенную форму или символ. Закрытый счетчик - это счетчик, который полностью заключен в буквенную форму или символ. Вы должны написать программу, которая принимает строку в качестве входных данных и печатает общее количество закрытых счетчиков в тексте.

Ваш вклад:

  • Может быть из командной строки или из 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


1
Два ответа представили функции вместо полных программ. Хотя это разрешено по умолчанию, ваша формулировка предполагает иное. Не могли бы вы уточнить?
Деннис

Не могли бы вы раскрыть, в каком направлении вы использовали счетчики?
Мартин Эндер

3
Ни один из шрифтов, в которых я просматриваю вопрос, не соответствует подсчетам, которые вы дали. Например, в браузере ноль имеет косую черту, что дает два счетчика. Шрифт в приложении для Android нет, но здесь gесть два закрытых счетчика. Вы определили счетчики на основе какого-либо конкретного шрифта?
Мартин Эндер

1
@DJMcMayhem 'g' имеет 1; хотя там, где указано в коде, gесть 2. Немного сбивает с толку, чтобы прочитать, но я не думаю, что это отличается по местоположению.
OJFord

1
Не 0имеет 2 закрытых счетчика в определенных шрифтах, особенно во многих моноширинных шрифтах?
вс

Ответы:


10

Pyth, 31 байт

sm@tjC"cúÁ-ÈN%³rØ|­"3Cdz

Демонстрация.

Обратите внимание, что код может отображаться неправильно из-за использования не-ASCII символов. Правильный код находится по ссылке.

Я сделал таблицу поиска выходных данных, требуемых для каждого входного символа, повернул ее на 32, чтобы использовать модульное индексирование Пита, вставил 1 в начале и интерпретировал его как основную цифру 3, давая число 2229617581140564569750295263480330834137283757. Затем я преобразовал это число в основание 256 и преобразовал его в строку, которая является строкой, используемой в ответе.


29

Питон 3, 63

print(sum(map(input().count,"#0469@ADOPQRabdegopq$%&8B$%&8B")))

Простой подход. Перебирает каждый символ с закрытым счетчиком, суммируя количество вхождений, делая это дважды для символов с двумя закрытыми счетчиками. Это было бы той же длины, чтобы вместо этого написать

"#0469@ADOPQRabdegopq"+"$%&8B"*2

Python 3 необходим, чтобы избежать raw_input.


12

CJam, 41 39 37 34 байта

"$%&8Badopq#0469@Rbeg"_A<eu+qfe=1b

Спасибо @ jimmy23013 за игру в 3 байта!

Попробуйте онлайн.

Как это устроено

"$%&8Badopq#0469@Rbeg"             e# Push that string.
                      _A<          e# Retrieve the first 10 characters.
                         eu+       e# Convert to uppercase and append.
                                   e# This pushes "$%&8Badopq#0469@Rbeg$%&8BADOPQ".
                            q      e# Read from STDIN.
                             fe=   e# Count the occurrences of each character. 
                                1b e# Base 1 conversion (sum).

2
"$%&8Badopq#0469@Rbeg"_A<eu+,
jimmy23013

@ jimmy23013: я пробовал несколько вариантов euи el, но так и не нашел. Благодарность!
Деннис

8

Сед, 51

С помощью гольфа от @manatwork и @TobySpeight:

s/[$%&8B]/oo/g
s/[^#0469@ADOPQRabdegopq]//g
s/./1/g

Ввод из STDIN. Имея в виду этот мета-вопрос , результат в унарном виде:

$ echo 'Programming Puzzles and Code-Golf
4 8 15 16 23 42
All your base are belong to us
Standard loopholes apply
Shortest answer in bytes is the winner!' | sed -f countercounter.sed
1111111111111
11111
111111111111
111111111111
11111111
$ 

7

Perl, 41

$_=y/#0469@ADOPQRabdegopq//+y/$%&8B//*2

41символы +1 за -pфлаг.

Это использует y /// для подсчета символов.

echo 'Programming Puzzles and Code-Golf' | perl -pe'$_=y/#0469@ADOPQRabdegopq//+y/$%&8B//*2'

6

GNU APL, 39 байт

+/⌈20÷⍨26-'$%&8B#0469@ADOPQRabdegopq'⍳⍞

Попробуйте его в Интернете в GNU APL.js .

Как это устроено

                                      ⍞ Read input.
          '$%&8B#0469@ADOPQRabdegopq'⍳  Compute the indexes of the input characters
                                        in this string. Indexes are 1-based.
                                        26 == 'not found'
       26-                              Subtract each index from 26.
   20÷⍨                                 Divide those differences by 20.
  ⌈                                     Round up to the nearest integer.
+/                                      Add the results.

6

JavaScript, 86

Ввод / вывод через всплывающее окно. Выполните фрагмент код в любом г недавнего браузера для тестирования.

for(c of prompt(t=0))c='$%&8B#0469@ADOPQRabdegopq'.indexOf(c),~c?t+=1+(c<5):0;alert(t)


6

K 54 43 42 37 байт

+//(30#"$%&8B#0469@ADOPQRabdegopq"=)'

Вырежьте 5 байтов благодаря @JohnE!

Старая версия:

f:+/(#&"#0469@ADOPQRabdegopq$%&8B$%&8B"=)'

Оригинал:

f:+/{2-(5="$%&8B"?x;20="#0469@ADOPQRabdegopq"?x;0)?0}'

С #&таким же успехом может быть и внутри паренсов +/, а значит, вы можете пойти дальше +//"#0469@ADOPQRabdegopq$%&8B$%&8B"=\:. Наконец, нет необходимости иметь, f:так как функцию можно использовать в неявной форме. Это привело бы вас к 38!
JohnE

К сожалению, трюк несколько других решений использовали уплотнить таблицу поиска выходит мертвый , даже с текущим решением 38 байт: +//(30#"$%&8B#0469@ADOPQRabdegopq")=\:. Это может быть лучшее, что мы можем сделать.
JohnE

ха-ха, как только я опубликовал это, я спас персонажа:+//(30#"$%&8B#0469@ADOPQRabdegopq"=)'
JohnE

5

C 127 байтов

n;f(char*i){char*o="#0469@ADOPQRabdegopq",*t="$%&8B";for(;*i;i++)if(strchr(o,*i))n++;else if(strchr(t,*i))n+=2;printf("%d",n);}

Довольно просто. Безголовая версия:

int num = 0;
void f(char* input)
{
    char *one="#0469@ADOPQRabdegopq";
    char *two="$%&8B";

    for(;*input;input++)
        if(strchr(one, *input))     //If current character is found in first array
            num ++;
        else if(strchr(two, *input))//If cuurent character is found in second array
            num += 2;

    printf("%d", num);
}

Проверьте это здесь

Если аргументы функции не разрешены, тогда stdinверсия занимает до 141 байта:

n;f(){char*o="#0469@ADOPQRabdegopq",*t="$%&8B",i[99],*p;gets(i);for(p=i;*p;p++)if(strchr(o,*p))n++;else if(strchr(t,*p))n+=2;printf("%d",n);}

Обратите внимание, что в приведенной выше версии предполагается, что длина ввода не более 98 символов.

Проверьте это здесь

Версия аргументов командной строки (143 байта):

n;main(c,v)char**v;{char*o="#0469@ADOPQRabdegopq",*t="$%&8B",*p=v[1];for(;*p;p++)if(strchr(o,*p))n++;else if(strchr(t,*p))n+=2;printf("%d",n);}

Проверьте это здесь


1
@DJMcMayhem C действительно не так уж и плохо. Попробуйте сыграть в гольф на Фортране 77.;)
Алекс А.

5

Python 2, 96 90 75 67 + 2 = 69 байт

Не могу придумать другого способа сделать это ... это то, что я думал бы, пока не увидел решение xnor. Я выложу то, что у меня было в любом случае.

Спасибо FryAmTheEggman за сохранение 6 байт

Хорошо, теперь я доволен этим.

Спасибо xnor за трюк с поиском, сэкономив 4 байта.

Добавлены два байта, поскольку входные данные должны быть заключены в кавычки.

print sum('#0469@ADOPQRabdegopq$%&8B'.find(x)/20+1for x in input())

1
Мне нравится умное использование индексов! Кроме того, Python 3 немного короче, потому что он использует ввод вместо raw_input.
DJMcMayhem

@manatwork Отлично работает в Python 2 с
Kade

А ну понятно. Извините, я совместил это с комментарием @ DJMcMayhem's Python 3.
Манатворк

4

Ява, 162

class C{public static void main(String[]a){System.out.print(-a[0].length()+a[0].replaceAll("[#0469@ADOPQRabdegopq]","..").replaceAll("[$%&8B]","...").length());}}

Хорошо , если это имеет быть полная программа ... Это просто один лайнер , который соответствует символам и заменяет их с более длинной строки. Затем возвращает разницу в длине от оригинала. К сожалению, java на самом деле не имеет ничего, чтобы просто посчитать количество совпадений.

Вот это с переносами строк:

class C{
    public static void main(String[]a){
        System.out.print(
                -a[0].length() +
                a[0].replaceAll("[#0469@ADOPQRabdegopq]","..")
                .replaceAll("[$%&8B]","...")
                .length()
                        );
    }
}


4

Javascript, 114 95 байт

alert(prompt().replace(/[#046@ADOPQRabdegopq]/g,9).replace(/[$%&8B]/g,99).match‌​(/9/g).length)

Спасибо Исмаилу Мигелю за помощь в этом.


2
93 байта:alert(prompt().replace(/[#046@ADOPQRabdegopq]/g,9).replace(/[$%&8B]/g,99).match(/9/g).length)
Исмаэль Мигель

Извините за плохой счет. Да, его 95.
Исмаэль Мигель

3

Рубин, 59 байт

a=gets;p a.count('#0469@ADOPQRabdegopq')+2*a.count('$%&8B')

Ввод из командной строки или стандартного ввода. Самый короткий пока что использование неэзотерического языка.

Обновление: чилимаги бить меня


3

Сетчатка , 44 байта

1

[#0469@ADOPQRabdegopq]
1
[$%&8B]
11
[^1]
<empty line>

Дает вывод в одинарный.

Каждая строка должна идти в свой собственный файл или вы можете использовать -sфлаг. Например:

> echo "pp&cg"|retina -s counter
11111

Пары линий (пары шаблон - замена) выполняют следующие шаги замещения:

  • Удалить 1
  • Заменить 1 встречные буквы 1
  • Заменить 2 встречные буквы 11
  • Удалите все , но 1«s

3

J, 43

Как функция:

   f=:[:+/[:,30$'$%&8B#0469@ADOPQRabdegopq'=/]
   f 'text goes here'
6

46 байт (командная строка)

Как отдельная программа командной строки:

echo+/,30$'$%&8B#0469@ADOPQRabdegopq'=/>{:ARGV

Сохраните вышеприведенную строку как counter2.ijsи вызовите из командной строки:

$ jconsole counter2.ijs 'Programming Puzzles and Code Golf'
13

Копирование и вставка входных данных в код недопустимы, но функция, которая может принимать входные данные в качестве аргумента, в порядке. Например f=:your_function_code.
Рандомра

2

Юлия, 77 74 байта

t=readline();length(join(t∩"#0469@ADOPQRabdegopq")*join(t∩"\$%&8B")^2)

Это читает текст из STDIN и печатает результат в STDOUT.

Ungolfed + объяснение:

# Read text from STDIN
t = readline()

# Print (implied) to STDOUT the length of the intersection of t with the
# 1-closed counter list joined with the duplicated intersection of t with
# the 2-closed counter list
length(join(t ∩ "#0469@ADOPQRabdegopq") * join(t ∩ "\$%&8B")^2)

Пример:

julia> t=readline();length(join(t∩"#0469@ADOPQRabdegopq")*join(t∩"\$%&8B")^2)
Programming Puzzles and Code Golf
13

2

RS , 56 байт

_/
[#0469@ADOPQRabdegopq]/_
[$%&8B]/__
[^_]/
(_+)/(^^\1)

Живая демоверсия.


Просто к вашему сведению: я создал заглушку на странице rsolangs для rs. Вы можете добавить к нему: esolangs.org/wiki/Rs
mbomb007

@ mbomb007 ВАУ !! Это просто сделало мой день. : D
kirbyfan64sos

Ну, «rs» не появляется в Google или что-то еще, так как это всего две буквы. Таким образом, люди могут найти это. :)
mbomb007

2

GNU APL, 37 символов

+/,⍞∘.=30⍴'$%&8B#0469@ADOPQRabdegopq'

построить символьный вектор, который содержит 2 счетчика символов дважды (30⍴)

сравнить каждый входной символ с каждым символом в векторе (∘. =)

подвести итоги разыгранных матчей (+ /,)


1

Javascript 159 , 130 байт

function c(b){return b.split("").map(function(a){return-1!="$%&8B".indexOf(a)?2:-1!="#0469@ADOPQRabdegopq".indexOf(a)?1:0}).reduce(function(a,b){return a+b})};

unminified:

function c(b) {
    return b.split("").map(function(a) {
        return -1 != "$%&8B".indexOf(a) ? 2 : -1 != "#0469@ADOPQRabdegopq".indexOf(a) ? 1 : 0
    }).reduce(function(a, b) {
        return a + b
    })
};

С помощью @ edc65:

function c(b){return b.split('').reduce(function(t,a){return t+(~"$%&8B".indexOf(a)?2:~"#0469@ADOPQRabdegopq".indexOf(a)?1:0)},0)}

2
Как ~ -1 == 0, вы можете написать ~x?вместо -1 != x?. Смотрите мне ответ для примера использования.
edc65

2
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
edc65

1

Хаскелл, 117

a="#0469@ADOPQRabdegopq"
b="$%&8B"
c n[]=n
c n(x:s)
 |e a=f 1
 |e b=f 2
 |True=f 0
 where
 e y=x`elem`y
 f y=c(n+y)s

c - это функция, c :: Int -> String -> Intкоторая принимает счетчик и строку и просматривает строку по одной букве за раз, проверяя, является ли текущая буква членом массива из 1 точки или массива из 2 точек, и вызывает себя для остальной части строки после увеличения Счетчик соответствующей суммы.

Вызов со счетчиком = 0 в ghci:

ghci> c 0 "All your base are belong to us"
12

1

C #, 157

void Main(string s){int v=0;v=s.ToCharArray().Count(c=>{return "#0469@ADOPQRabdegopq".Contains(c)||"$%&8B".Contains(c)?++v is int:false;});Console.Write(v);}

Ungolfed:

void Main(string s)
{
    int v = 0;

    v = s.ToCharArray()
    .Count(c => 
    {
        return "#0469@ADOPQRabdegopq".Contains(c) || "$%&8B".Contains(c) ? ++v is int:false;
    });

    Console.Write(v);
}

Преобразование строки в массив символов, а затем проверка наличия каждого символа в каждом счетчике. Если это во втором, я просто увеличиваю счетчик снова.


1

Эрланг, 103 байта

Это полная программа, которая запускается с использованием escript. Первая строка файла должна быть пустой (добавляется 1 байт).

main([L])->io:write(c(L,"#0469@ADOPQRabdegopq")+2*c(L,"$%&8B")).
c(L,S)->length([X||X<-L,S--[X]/=S]).

Образец прогона:

$ escript closed.erl 'Shortest answer in bytes is the winner!'
8$

Добро пожаловать в PPCG, c (L, "# 0469 @ ADOPQRabdegopq") + 2 * c (L, "$% & 8B") длиннее c (L, "# 0469 @ ADOPQRabdegopq $% & 8B $% & 8B") на 5 байты :).
Катенкё

@Katyenko, спасибо за предложение. К сожалению, он не работает правильно для определенных входов. «$% & 8B» имеет значение 5, но должно быть 10. Функция c / 2 работает, отфильтровывая символы строки, которые не принадлежат к набору символов, например «$% & 8B». Он проверяет включение набора, удаляя проверяемый символ из набора, а затем сравнивает результат с исходным набором. Если они не равны, то символ был в наборе, и он включен. Несколько копий символов в наборе не имеют никакого эффекта.
Эдвин Файн

Хо, я вижу, я не знаю, Эрланг думал, что вы использовали строку для подсчета счетчика: 3. Во всяком случае, неважно, и молодец :)
Katenkyo

0

C, 99 байтов

n;f(char*i){for(char*o="#0469@ADOPQRabdegopq$%&8B",*t=o+20;*i;)n+=2-!strchr(o,*i)-!strchr(t,*i++);}

объяснение

Далее я сыграл в гольф ответ Cool Guy ; это слишком долго, чтобы быть комментарием. Вместо if/ elseя использовал !преобразование указателя в bool. Я также сделал oвключение, tчтобы я мог добавить «находится в o» и «находится в t» для общего количества счетчиков.

Расширенный код

#include <string.h>
int num = 0;

void f(char* input)
{
    char *one = "#0469@ADOPQRabdegopq"  "$%&8B";
    char *two = strchr(one, '$');

    while (*input) {
        num += 2 - !strchr(one, *input) - !strchr(two, *input));
        ++input;
    }
}

Выход находится в num, который должен быть очищен перед каждым вызовом.

Программа испытаний и результаты

#include <stdio.h>
int main() {
    const char* a[] = {
        "Programming Puzzles and Code-Golf",
        "4 8 15 16 23 42",
        "All your base are belong to us",
        "Standard loopholes apply",
        "Shortest answer in bytes is the winner!",
        NULL
    };
    for (const char** p = a;  *p;  ++p) {
        n=0;f(*p);
        printf("%3d: %s\n", n, *p);
    }
    return 0;
}
 13: Programming Puzzles and Code-Golf
  5: 4 8 15 16 23 42
 12: All your base are belong to us
 12: Standard loopholes apply
  8: Shortest answer in bytes is the winner!
 37: n;f(char*i){for(char*o="#0469@ADOPQRabdegopq$%&8B",*t=o+20;*i;)n+=2-!strchr(o,*i)-!strchr(t,*i++);}

Сам код содержит 37 счетчиков по своей метрике.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.