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


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.


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.


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

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
$ 

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'

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.

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)


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

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


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

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


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.


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ł


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”

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

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


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 (+ /,)


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

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

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.


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$

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.