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
g
ma dwa zamknięte liczniki. Czy ustaliłeś liczniki na podstawie jakiejś konkretnej czcionki?g
ma 2. Nieco mylący z czytaniem, ale nie sądzę, że różni się w zależności od lokalizacji.0
ma 2 zamkniętych liczników w niektórych czcionkach, zwłaszcza w wielu czcionkach o stałej szerokości?Odpowiedzi:
Pyth, 31 bajtów
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.źródło
Python 3, 63
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ść
Python 3 jest potrzebny, aby tego uniknąć
raw_input
.źródło
CJam,
41393734 bajtówDzięki @ jimmy23013 za grę w golfa z 3 bajtów!
Wypróbuj online.
Jak to działa
źródło
"$%&8Badopq#0469@Rbeg"_A<eu+
.eu
iel
, ale nigdy tego nie znalazłem. Dzięki!sed, 51
Przy pomocy gry w golfa od @manatwork i @TobySpeight:
Dane wejściowe ze STDIN. Mając na uwadze to meta-pytanie , wynik jest jednoznaczny:
źródło
Perl, 41
41
+1 znaków dla-p
flagi.Używa y /// do liczenia znaków.
źródło
GNU APL, 39 bajtów
Wypróbuj online w GNU APL.js .
Jak to działa
źródło
JavaScript, 86
I / O przez wyskakujące okienko. Uruchom fragment w dowolnym
dnajnowszej przeglądarki do testu.źródło
K,
54434237 bajtówOdetnij 5 bajtów dzięki @JohnE!
Starsza wersja:
Oryginalny:
ź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 posiadanief:
tej funkcji, ponieważ funkcja może być używana w milczącej formie. To obniżyłoby cię do 38!+//(30#"$%&8B#0469@ADOPQRabdegopq")=\:
. To może być najlepsze, co możemy zrobić.+//(30#"$%&8B#0469@ADOPQRabdegopq"=)'
C, 127 bajtów
Całkiem proste. Wersja bez golfa:
Sprawdź to tutaj
Jeśli argumenty funkcji nie są dozwolone,
stdin
wersja zajmuje do 141 bajtów: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):
Sprawdź to tutaj
źródło
Python 2,
96907567 + 2 = 69 bajtówNie 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.
źródło
Java, 162
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:
źródło
Pyth - 35 bajtów
Używa oczywistej metody w pierwszym + * 2 w drugim. Dzięki @FryTheEggman.
Wypróbuj tutaj online .
źródło
JavaScript,
11495 bajtówDzięki Ismael Miguel za pomoc w golfa.
źródło
alert(prompt().replace(/[#046@ADOPQRabdegopq]/g,9).replace(/[$%&8B]/g,99).match(/9/g).length)
Ruby, 59 bajtów
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ł
źródło
Siatkówka , 44 bajty
Daje wynik jednostkowy.
Każda linia powinna przejść do własnego pliku lub możesz użyć
-s
flagi. Na przykład:Pary linii (wzór - pary zastępcze) wykonują następujące kroki podstawiania:
1
„s1
11
1
„s”źródło
J, 43
Jako funkcja:
46 bajtów (wiersz poleceń)
Jako samodzielny program wiersza poleceń:
Zapisz powyższą linię jako
counter2.ijs
i wywołaj z linii poleceń:źródło
f=:your_function_code
.Julia,
7774 bajtówOdczytuje tekst ze STDIN i drukuje wynik do STDOUT.
Niegolfowane + wyjaśnienie:
Przykład:
źródło
rs , 56 bajtów
Demo na żywo.
źródło
GNU APL, 37 znaków
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 (+ /,)
źródło
JavaScript
159, 130 bajtówunminified:
Za pomocą @ edc65:
źródło
~ -1 == 0
możesz pisać~x?
zamiast-1 != x?
. Zobacz mi odpowiedź na przykład użycia.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ćmap
wtedyreduce
Haskell, 117
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:
źródło
C #, 157
Nie golfowany:
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.
źródło
Erlang, 103 bajty
Jest to kompletny program, który działa przy użyciu escript. Pierwszy wiersz pliku musi być pusty (dodanie 1 bajtu).
Przykładowy przebieg:
źródło
C, 99 bajtów
Wyjaśnienie
Dalej grałem w golfa odpowiedź Cool Guy ; zajęło to zbyt długo, aby być komentarzem. Zamiast
if
/else
skorzystałem z!
konwersji wskaźnika na bool. Dodałem także opcjęo
włączenia,t
aby dodać „jest wo
” i „jest wt
” dla całkowitej liczby liczników.Rozszerzony kod
Wyjście jest włączone
num
, które należy wyczyścić przed każdym połączeniem.Program testowy i wyniki
Sam kod zawiera 37 liczników według własnej miary.
źródło