Лічильник лічильників


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
Немає 02 закритих лічильників у певних шрифтах, особливо багато однопросторових шрифтів?
vsz

Відповіді:


10

Pyth, 31 байт

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

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

Зауважте, що код може відображатися неправильно через використання символів, що не належать до ASCII. Правильний код знаходиться за посиланням.

Я зробив таблицю пошуку потрібного виходу для кожного вхідного символу, повернув його на 32 для використання модульної індексації Pyth, наклеїв 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

sed, 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

Перл, 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

Введення / виведення через спливаюче вікно. Запустіть фрагмент у будь-якому d недавньому браузері, щоб перевірити.

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


6

К, 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

Пітон 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


О Я бачу. Вибачте, я поєднав це з коментарем Python 3 @ @ DJMcMayhem.
манатурка

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')

Введення з командного рядка або stdin. Найкоротший поки що використовує неезотеричну мову.

Оновлення: чилімагічний побив мене


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.
randomra

2

Джулія, 77 74 байт

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

Це читає текст з STDIN і друкує результат у STDOUT.

Недоліки + пояснення:

# 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)

Демонстраційна демонстрація.


Просто фій: я створив сторінку заглушки esolangs для rs. Ви можете додати до нього: esolangs.org/wiki/Rs
mbomb007

@ mbomb007 WOW !! Це щойно зробив мій день. : 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})};

немініфікований:

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);}

Безголівки:

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);
}

Перетворимо рядок у масив char, а потім побачимо, чи є кожен char у будь-якому лічильнику. Якщо він знаходиться у другому, я просто знову його збільшив лічильник.


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 байти :).
Katenkyo

@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++);}

Пояснення

Далі я переграв відповідь Класного Гая ; це було занадто довго, щоб бути коментарем. Замість 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.