Licznik licznika

18

W typografii licznik to obszar litery, który jest całkowicie lub częściowo otoczony postacią literową lub symbolem. Zamknięty licznik to licznik całkowicie zamknięty literą lub symbolem. Musisz napisać, że program pobiera ciąg wejściowy i wypisuje całkowitą liczbę zamkniętych liczników w tekście.

Twój wkład:

  • Może być wejściem wiersza poleceń lub STDIN, ale musisz określić, które.

  • Będzie składał się wyłącznie z drukowalnych znaków ASCII, co oznacza wszystkie wartości ASCII od 32 do 126 włącznie. Dotyczy to spacji. Więcej informacji.

Teraz różni się to nieznacznie w zależności od czcionek. Na przykład czcionka, którą czytasz, uważa, że ​​„g” ma jeden zamknięty licznik, podczas gdy czcionka Google ma „g” z dwoma zamkniętymi licznikami. Aby nie było to problemem, oto oficjalna liczba zamkniętych liczników na postać.

Wszystkie symbole bez zamkniętych liczników:

 !"'()*+,-./12357:;<=>?CEFGHIJKLMNSTUVWXYZ[\]^_`cfhijklmnrstuvwxyz{|}~

Pamiętaj, że obejmuje to miejsce.

Oto wszystkie symbole z jednym zamkniętym licznikiem:

#0469@ADOPQRabdegopq

A oto wszystkie symbole z 2 zamkniętymi licznikami:

$%&8B

I na koniec, oto kilka przykładowych danych wejściowych i wyjściowych.

Programming Puzzles and Code-Golf powinien wydrukować 13

4 8 15 16 23 42 powinien wydrukować 5

All your base are belong to us powinien wydrukować 12

Standard loopholes apply powinien wydrukować 12

Shortest answer in bytes is the winner! powinien wydrukować 8

DJMcMayhem
źródło
1
Dwie odpowiedzi przesłały funkcje zamiast pełnych programów. Chociaż jest to domyślnie dozwolone, sformułowanie sugeruje inaczej. Czy możesz to wyjaśnić?
Dennis
Czy miałbyś coś przeciwko ujawnieniu, które obliczenia wykorzystałeś do liczenia?
Martin Ender,
3
Żadna z czcionek, w których przeglądam pytanie, nie odpowiada podanej przez ciebie liczbie. Np. W przeglądarce zero ma ukośne cięcie, dające dwa liczniki. Czcionka w aplikacji na Androida nie ma, ale tutaj gma dwa zamknięte liczniki. Czy ustaliłeś liczniki na podstawie jakiejś konkretnej czcionki?
Martin Ender
1
@DJMcMayhem „g” ma 1; chociaż jest wymieniony w kodzie, gma 2. Nieco mylący z czytaniem, ale nie sądzę, że różni się w zależności od lokalizacji.
OJFord
1
Czy nie 0ma 2 zamkniętych liczników w niektórych czcionkach, zwłaszcza w wielu czcionkach o stałej szerokości?
vsz

Odpowiedzi:

10

Pyth, 31 bajtów

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

Demonstracja.

Pamiętaj, że kod może nie być wyświetlany poprawnie ze względu na użycie znaków spoza ASCII. Prawidłowy kod znajduje się pod linkiem.

Zrobiłem tabelę danych wyjściowych pożądaną dla każdego znaku wejściowego, obróciłem ją o 32, aby skorzystać z modułowego indeksowania Pytha, utknąłem 1 na początku i zinterpretowałem ją jako liczbę podstawową 3, podając liczbę 2229617581140564569750295263480330834137283757. Następnie przekonwertowałem ten numer na bazę 256 i przekonwertowałem go na ciąg znaków, który jest ciągiem użytym w odpowiedzi.

isaacg
źródło
29

Python 3, 63

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

Proste podejście. Iteruje po każdej postaci zamkniętym licznikiem, sumując liczbę wystąpień, robiąc to dwukrotnie dla postaci z dwoma zamkniętymi licznikami. Zamiast tego miałby taką samą długość

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

Python 3 jest potrzebny, aby tego uniknąć raw_input.

xnor
źródło
12

CJam, 41 39 37 34 bajtów

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

Dzięki @ jimmy23013 za grę w golfa z 3 bajtów!

Wypróbuj online.

Jak to działa

"$%&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).
Dennis
źródło
2
"$%&8Badopq#0469@Rbeg"_A<eu+.
jimmy23013
@ jimmy23013: Próbowałem kilku odmian eui el, ale nigdy tego nie znalazłem. Dzięki!
Dennis,
8

sed, 51

Przy pomocy gry w golfa od @manatwork i @TobySpeight:

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

Dane wejściowe ze STDIN. Mając na uwadze to meta-pytanie , wynik jest jednoznaczny:

$ 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
$ 
Cyfrowa trauma
źródło
7

Perl, 41

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

41+1 znaków dla -pflagi.

Używa y /// do liczenia znaków.

echo 'Programming Puzzles and Code-Golf' | perl -pe'$_=y/#0469@ADOPQRabdegopq//+y/$%&8B//*2'
hmatt1
źródło
6

GNU APL, 39 bajtów

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

Wypróbuj online w GNU APL.js .

Jak to działa

                                      ⍞ 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.
Dennis
źródło
6

JavaScript, 86

I / O przez wyskakujące okienko. Uruchom fragment w dowolnym d najnowszej przeglądarki do testu.

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

edc65
źródło
6

K, 54 43 42 37 bajtów

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

Odetnij 5 bajtów dzięki @JohnE!

Starsza wersja:

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

Oryginalny:

f:+/{2-(5="$%&8B"?x;20="#0469@ADOPQRabdegopq"?x;0)?0}'
kirbyfan64sos
źródło
#&Wewnątrz parens mogłyby równie dobrze być +/, co oznacza, można iść dalej z +//"#0469@ADOPQRabdegopq$%&8B$%&8B"=\:. Wreszcie, nie jest konieczne posiadanie f:tej funkcji, ponieważ funkcja może być używana w milczącej formie. To obniżyłoby cię do 38!
JohnE
Niestety trick kilka innych rozwiązań, które zastosowano do sprasowania tabeli odnośników wychodzi martwy nawet przy obecnym rozwiązaniu 38 bajtów: +//(30#"$%&8B#0469@ADOPQRabdegopq")=\:. To może być najlepsze, co możemy zrobić.
JohnE,
haha, nie wcześniej to napisałem, niż zapisałem postać:+//(30#"$%&8B#0469@ADOPQRabdegopq"=)'
JohnE
5

C, 127 bajtów

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

Całkiem proste. Wersja bez golfa:

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

Sprawdź to tutaj

Jeśli argumenty funkcji nie są dozwolone, stdinwersja zajmuje do 141 bajtów:

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

Zauważ, że powyższa wersja zakłada, że ​​dane wejściowe mają długość 98 znaków.

Sprawdź to tutaj

Wersja argumentów wiersza polecenia (143 bajty):

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

Sprawdź to tutaj

Spikatrix
źródło
1
@DJMcMayhem C naprawdę nie jest taki zły. Spróbuj zagrać w golfa w Fortran 77.;)
Alex A.
5

Python 2, 96 90 75 67 + 2 = 69 bajtów

Nie mogę wymyślić innego sposobu na zrobienie tego ... tak myślałem, dopóki nie zobaczyłem rozwiązania xnor. I tak opublikuję to, co miałem.

Dzięki FryAmTheEggman za oszczędność 6 bajtów

Dobra, teraz jestem z tego zadowolony.

Dzięki xnor za szukanie sztuczki, oszczędność 4 bajtów.

Dodano dwa bajty, ponieważ dane wejściowe muszą być ujęte w cudzysłów.

print sum('#0469@ADOPQRabdegopq$%&8B'.find(x)/20+1for x in input())
Kade
źródło
1
Lubię sprytne wykorzystanie indeksów! Także Python 3 jest nieco krótszy, ponieważ wykorzystuje dane wejściowe zamiast raw_input.
DJMcMayhem
Rozumiem. Przepraszam, połączyłem to z komentarzem Pythona 3 w DJJcMayhem.
manatwork
4

Java, 162

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

Dobrze, jeśli ma to być pełny program ... To tylko jedna linijka, która dopasowuje znaki i zastępuje je dłuższym ciągiem. Następnie zwraca różnicę długości w stosunku do oryginału. Niestety, java tak naprawdę nie ma niczego, co by tylko policzyło liczbę dopasowań.

Oto podział linii:

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

Pyth - 35 bajtów

Używa oczywistej metody w pierwszym + * 2 w drugim. Dzięki @FryTheEggman.

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

Wypróbuj tutaj online .

Maltysen
źródło
4

JavaScript, 114 95 bajtów

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

Dzięki Ismael Miguel za pomoc w golfa.

SuperJedi224
źródło
2
93 bajty:alert(prompt().replace(/[#046@ADOPQRabdegopq]/g,9).replace(/[$%&8B]/g,99).match(/9/g).length)
Ismael Miguel
Przepraszam za złe liczenie. Tak, jego 95.
Ismael Miguel
3

Ruby, 59 bajtów

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

Dane wejściowe z wiersza poleceń lub standardowego wejścia. Najkrótszy jak dotąd przy użyciu nieezoterycznego języka.

Aktualizacja: chilemagic mnie pokonał

David Bailey
źródło
3

Siatkówka , 44 bajty

1

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

Daje wynik jednostkowy.

Każda linia powinna przejść do własnego pliku lub możesz użyć -sflagi. Na przykład:

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

Pary linii (wzór - pary zastępcze) wykonują następujące kroki podstawiania:

  • Usuń 1„s
  • Zamień 1-licznik liter na 1
  • Zamień 2-licznikowe litery na 11
  • Usuń wszystko oprócz 1„s”
randomra
źródło
3

J, 43

Jako funkcja:

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

46 bajtów (wiersz poleceń)

Jako samodzielny program wiersza poleceń:

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

Zapisz powyższą linię jako counter2.ijsi wywołaj z linii poleceń:

$ jconsole counter2.ijs 'Programming Puzzles and Code Golf'
13
hoosierEE
źródło
Kopiowanie wklejania danych wejściowych do kodu jest niedozwolone, ale funkcja, która może przyjmować dane wejściowe jako argument, jest w porządku. Np f=:your_function_code.
randomra
2

Julia, 77 74 bajtów

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

Odczytuje tekst ze STDIN i drukuje wynik do STDOUT.

Niegolfowane + wyjaśnienie:

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

Przykład:

julia> t=readline();length(join(t∩"#0469@ADOPQRabdegopq")*join(t∩"\$%&8B")^2)
Programming Puzzles and Code Golf
13
Alex A.
źródło
2

rs , 56 bajtów

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

Demo na żywo.

kirbyfan64sos
źródło
Po prostu fyi: Stworzyłem stronę stub esolangs dla rs. Możesz dodać do niego: esolangs.org/wiki/Rs
mbomb007
@ mbomb007 WOW !! To właśnie sprawiło, że mój dzień. : D
kirbyfan64sos
Cóż, „rs” nie pojawia się w Google ani nic, ponieważ są to tylko dwie litery. W ten sposób ludzie mogą to znaleźć. :)
mbomb007,
2

GNU APL, 37 znaków

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

skonstruuj wektor znaków, który zawiera dwa znaki licznika dwa razy (30⍴)

porównaj każdy znak wejściowy z każdym znakiem w wektorze (∘. =)

podsumuj zniszczone mecze (+ /,)

Jürgen Sauermann
źródło
1

JavaScript 159 , 130 bajtów

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

Za pomocą @ edc65:

function c(b){return b.split('').reduce(function(t,a){return t+(~"$%&8B".indexOf(a)?2:~"#0469@ADOPQRabdegopq".indexOf(a)?1:0)},0)}
Thomas Junk
źródło
2
Ponieważ ~ -1 == 0możesz pisać ~x?zamiast -1 != x?. Zobacz mi odpowiedź na przykład użycia.
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)}Nie trzeba mieć mapwtedyreduce
edc65
1

Haskell, 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 jest funkcją c :: Int -> String -> Int która pobiera licznik i ciąg i przechodzi przez ciąg po jednej literze sprawdzając, czy bieżąca litera należy do tablicy 1-punktowej lub tablicy 2-punktowej i po inkrementacji wywołuje samą resztę ciągu licznik odpowiednią kwotę.

Zadzwoń z licznikiem = 0 w ghci:

ghci> c 0 "All your base are belong to us"
12
Craig Roy
źródło
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);}

Nie golfowany:

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

Konwertowanie ciągu znaków na tablicę znaków, a następnie sprawdzanie, czy każdy znak znajduje się w dowolnym liczniku. Jeśli jest w drugim, po prostu ponownie zwiększam licznik.

Cooler Ranch
źródło
1

Erlang, 103 bajty

Jest to kompletny program, który działa przy użyciu escript. Pierwszy wiersz pliku musi być pusty (dodanie 1 bajtu).

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

Przykładowy przebieg:

$ escript closed.erl 'Shortest answer in bytes is the winner!'
8$
Edwin Fine
źródło
Witamy w PPCG, c (L, „# 0469 @ ADOPQRabdegopq”) + 2 * c (L, „$% i 8B”) jest dłuższy niż c (L, „# 0469 @ ADOPQRabdegopq $% i 8B $% i 8B”) o 5 bajty :).
Katenkyo
@Katyenko, dzięki za sugestię. Niestety nie działa poprawnie dla niektórych danych wejściowych. „$% I 8B” liczy się dla 5, ale powinno być 10. Funkcja c / 2 działa poprzez odfiltrowanie znaków ciągu, które nie należą do zestawu znaków, takich jak „$% i 8B”. Sprawdza włączenie zestawu, usuwając znak do przetestowania ze zbioru, a następnie porównując wynik z zestawem oryginalnym. Jeśli nie są one równe, char był w zestawie i jest uwzględniany. Wiele kopii znaków w zestawie nie ma żadnego efektu.
Edwin Fine
Ho, rozumiem, nie wiem, Erlang, myślałem, że używasz sznurka do liczenia licznika: 3. W każdym razie, nieważne i dobrze zrobione :)
Katenkyo
0

C, 99 bajtów

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

Wyjaśnienie

Dalej grałem w golfa odpowiedź Cool Guy ; zajęło to zbyt długo, aby być komentarzem. Zamiast if/ elseskorzystałem z !konwersji wskaźnika na bool. Dodałem także opcję owłączenia, taby dodać „jest w o” i „jest w t” dla całkowitej liczby liczników.

Rozszerzony kod

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

Wyjście jest włączone num, które należy wyczyścić przed każdym połączeniem.

Program testowy i wyniki

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

Sam kod zawiera 37 liczników według własnej miary.

Toby Speight
źródło