Większość ludzi zna tu siedmiosegmentowe wyświetlacze, które są również używane w puzzlach. Poniżej znajdują się cyfry 0
przez 9
i litery a
poprzez z
, z wyjątkiem k,m,t,v,w
, napisane w tym formacie.
_ _ _ _ _ _ _ _
| | | _| _| |_| |_ |_ | |_| |_|
|_| | |_ _| | _| |_| | |_| _|
_ _ _ _ _ _ _ _ _
|_| |_ | _| |_ |_ | |_ | | | _ _ |_| |_| _ |_ |_| |_| _|
| | |_| |_ |_| |_ | |_| | | | |_| |_ | | |_| | | | _| |_| | | | |_
Wyzwanie jest tutaj proste. Biorąc pod uwagę ciąg wejściowy, wypisz liczbę zapałek wymaganych do reprezentacji tego ciągu. Jeśli ciąg zawiera znak spoza powyższej reprezentacji, zignoruj go (policz jako 0).
Na przykład, dla danych wejściowych 53
, 10
wymagana jest suma zapałek, 5
dla 5
i 5
dla 3
, więc wyjście jest 10
.
Do wprowadzenia wymagane są hello
wszystkie 19
zapałki h (4), e (5), l (3), l (3), o (4)
, więc wynik jest 19
.
Dla jasności, oto zapałki potrzebne do zbudowania każdej postaci:
0 -> 6
1 -> 2
2 -> 5
3 -> 5
4 -> 4
5 -> 5
6 -> 6
7 -> 3
8 -> 7
9 -> 6
a -> 6
b -> 5
c -> 4
d -> 5
e -> 5
f -> 4
g -> 5
h -> 4
i -> 2
j -> 4
l -> 3
n -> 3
o -> 4
p -> 5
q -> 5
r -> 2
s -> 5
u -> 3
x -> 5
y -> 4
z -> 5
Teraz coś dziwnego, a są ich dwa.
- Pierwszym jest to, że wejście jest uważany CASE- w czuły. To znaczy,
A
ia
oba powinny liczyć się z6
zapałkami, mimo że reprezentacja wizualna wygląda jak duża literaA
. - Twój wynik to kod źródłowy przebiegający przez ten algorytm, plus długość kodu źródłowego w bajtach, im niższa, tym lepiej. Na przykład, jeśli kod źródłowy był
abc123
, wynik byłby6+5+4+2+5+5 = 27 + 6 = 33
. Jeśli kod źródłowy był#&@()*
, wynik byłby0 + 6 = 6
.
Przykłady wejścia / wyjścia
0 -> 6
53 -> 10
111 -> 6
112 -> 9
8888 -> 28
hello -> 19
PPCG -> 19
Programming Puzzles & Code Golf -> 99
#&()mt!!~ -> 0
*DḌƤÆE%Ḅċ0 -> 16
Zasady
- Jeśli ma to zastosowanie, możesz założyć, że wejście / wyjście będzie pasować do rodzimego typu Integer w twoim języku.
- Dane wejściowe i wyjściowe można podać dowolną dogodną metodą .
- Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
- Standardowe luki są zabronione.
code-challenge
counting
AdmBorkBork
źródło
źródło
|_\n|_
(małe literyt
)[0-9a-z]
należy liczyć 0 zapałek? Z twojego wyniku rozumiem, że Twój kod źródłowy jest uruchamiany przez ten algorytm , a także długość kodu źródłowego w bajtach .Odpowiedzi:
Python 2 , 97 bajtów + 237 dopasowań = 334
Wypróbuj online!
Działa to poprzez generowanie ciągu, w którym każda postać do zbudowania wydaje taką samą ilość zapałek potrzebnych do zbudowania tej postaci
źródło
+'069a8'*6+'8')
Zamiast można zapisać jedną postać+'069a'*6+'8'*7)
.Perl 5 z
-pF
, 95 bajtów + 14, 109Jest to równoważne z:
ale za pomocą
~
operatora możemy używać znaków bajtowych i unikać wielu znaków bez poświęcania bajtów.Nadal całkiem daleko od wyniku Tona, nawet z pomocą!
Wypróbuj online!
To rozwiązanie zawiera niedrukowalne, dlatego oto odwracalny zrzut heksadecymalny w celu weryfikacji liczby bajtów:
źródło
}{
? Upuść i-n
opcję. Również zapominacie+lc
zamiastlc()
:-)+
nie od razu przychodzi mi na myśl! Potrzebujęn
na maszynie i zapomnij, że mogę ją upuścić!}{
i-p
” (i zastąp go,-n
jeśli twój perl nadal tego potrzebuje. W dzisiejszych czasach i tak się nie liczy)JavaScript (ES6), 198 (102 bajty + 96 zapałek)
Zaoszczędź 5 punktów dzięki @ l4m2
Wypróbuj online!
W jaki sposób?
Używamy kodu ASCII modulo 9 znaków, które nie dodają żadnej kary do kodowania liczby zapałek.
Nie musimy się martwić o sprawę, ponieważ
parseInt()
nie uwzględnia ona wielkości liter.W przypadku znaków, które nie pasują do [0-9A-Za-z] ,
parseInt()
zwracane są wyniki,NaN
a wynikiem wyszukiwania łańcucha jestundefined
. Po przymuszeniu do ciągu"undefined".charCodeAt()
zwraca kod ASCII"u"
, który ma wartość 117 . Dogodnie 117 modulo 9 daje 0 zgodnie z oczekiwaniami.źródło
v=>[...v].map(w=>t+='~{w__^_{]|{{_^__^_^w^~]~]^__w_~]~~_^_'.charCodeAt(1+parseInt(w,36))%9,t=+[])|t
1 mniejGalaretka , 42 bajty + 0 zapałek = 42 punkty
Dzięki @JonathanAllan za -2 punkty!
Wypróbuj online!
Jak to działa
Literały, które zaczynają się
“
i kończą z’
podziałem na“
, zastępują pozostałe znaki ich indeksami opartymi na 1 na stronie kodowej Jelly, a następnie konwertują z bazy bijective 250 na liczbę całkowitą.Ten konkretny dosłowny kod
×/
zmniejsza przez pomnożenie, dając(Bezpośrednie kodowanie tej liczby całkowitej pozwoliłoby zaoszczędzić 6 bajtów, ale kosztowało 28 zapałek.)
ṚṚ
cofa się dwukrotnie; pierwsze wywołanie promuje liczbę całkowitą w swojej tablicy cyfr. To dajeċЀØW$
zlicza (ċ
) wystąpienia każdego (Ѐ
) znaku „A ... Za ... z0 ... 9_” (ØW
) w ciągu wejściowym.Wreszcie
æ.
bierze iloczyn iloczynu, mnożąc liczbę znaków przez odpowiedni koszt w zapałkach, a następnie biorąc sumę.źródło
D
zapisać inny. Wypróbuj onlineƊ
. Dzięki!Perl 5
-p
,9064 code + 9 eval harness + 14 zapałek = 87Zamień kody szesnastkowe na ich dosłowny wariant 1-bajtowy ( nie UTF-8, jak TIO próbuje) dla zadeklarowanego wyniku
Wypróbuj online!
Kod Wewnątrz uzupełnionego łańcucha:
źródło
Galaretka , 34 bajty + 3 mecze = 37
Monadyczny link akceptujący listę znaków i zwracający liczbę całkowitą.
Wypróbuj online!
W jaki sposób?
Działa w podobny sposób, jak odpowiedź Jelly'ego na Jelly, ale dołożyła wystarczającego wysiłku, aby moim zdaniem uzasadnić inną odpowiedź. Zasadnicza różnica polega na tym, że nakłady na małe litery kosztują trzy dopasowania (
Œl
zawiera anl
), co następnie pozwala na użycie znacznie mniejszej liczby do utworzenia tablicy kosztów. Problem polegał na znalezieniu sposobu na skonstruowanie tej liczby bez dopasowań, pozostając zwięzłym.ØW
daje wynik,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"
więc liczenie wystąpień małych liter zawsze zaczyna się od 26 zer. Możemy to odwrócić i wykonać iloczyn skalarny o tablicy o długości 37 zamiast o długości 63.źródło
PHP 176 bajtów = 397 punktów
Wypróbuj online!
źródło
SOGL V0.12 , 34 bajty + 18 = 52
Wypróbuj tutaj!
Grał w golfa, ale nie zdobył tyle punktów :
źródło
Python 3 , 138 + 265 = 403 bajtów
Wypróbuj online!
źródło
Rubinowy , 125 bajtów + 87 zapałek = 212
Wypróbuj online!
Mocno zainspirowany odpowiedzią Arnaulda na Javascript .
Zwykle koszt deklarowania użycia lambda tylko dwa razy nie jest tego wart, ale waga zapałki „
scanap
”.scan(/./).map
zmieniła to. To było zabawne wyzwanie!źródło
MATL , wynik
166156Długość kodu 41 + wyjście dla kodu używanego jako dane wejściowe 115.
Wypróbuj online!
źródło
R, 112 bajtów + 319 dopasowań = 431 punktów
Wypróbuj online!
Uznanie dla Giuseppe który wymyślił tę poprawę.
Stara wersja, 143 bajty + 454 dopasowania = 597 punktów
Aby
el()
funkcja działała w TIO, musisz użyćlibrary(methods)
.Kurwa, do cholery, jest pełny R !
źródło
methods
pakietu, ale ponieważ jest tobase
pakiet, zawsze wrzuciłem go do nagłówka i nie liczę go do liczenia bajtów.readline
również nie będzie działać na TIO, ponieważ nie jest to sesja interaktywna. Jest to jednak zdecydowanie gra w golfa.Perl 6 , 87 bajtów + 26 zapałek = 113
Wypróbuj online!
Wykorzystuje niektóre znaki Unicode spoza ASCII. Tabela odnośników jest zakodowana w ciągu znaków Unicode:
Znaki są konwertowane na indeksy z konwersją base-36 za pomocą cyfr arabskich:
źródło
sed, 367 (bajty kodu źródłowego) + 532 (ilość zapałek dla kodu źródłowego) = 899
Wypróbuj online
Wersja wieloliniowa:
Wyjaśnienie:
Powyższy skrypt odczytuje standardowy wiersz po wierszu (do przestrzeni wzorów - zwykły „sposób sed”) i dla każdego wiersza wypisuje ilość zapałek potrzebnych do reprezentacji wszystkich znaków reprezentujących zapałki w tym wierszu. Obliczenia dla każdego wiersza danych wejściowych następują w następujący sposób:
Najpierw usuwamy każdą przestrzeń, dla której nie mamy odpowiadającej reprezentacji zapałek (jak podano w pytaniu) z obszaru wzorów. Oznacza to, że usuwamy każdy znak, który nie jest ani cyfrą od „0” do „9”, literą od „a” do „j”, „n” do „s”, „l”, „u”, „x”, „y” lub „z”. Wielkie i małe litery są traktowane tak samo.
Jeśli skończymy z pustą przestrzenią wzorów, wypisujemy 0 (automatycznie następuje nowa linia, jak zawsze sed, chyba że przekażesz specjalną flagę), pomiń wszystkie tylne linie skryptu i przejdź do następnego „cyklu sed” tj. przeczytaj następny wiersz danych wejściowych i powtórz przetwarzanie od początku od pierwszego polecenia, aż nie będzie już więcej wierszy danych wejściowych do przetworzenia).
W przeciwnym razie, jeśli przestrzeń wzorcowa nie jest pusta, dzielimy ją na dwie „podprzestrzenie” oddzielone średnikiem: najpierw pojawia się przestrzeń wejściowa , która początkowo jest utworzona przez wszystkie znaki, które nie zostały usunięte z przestrzeni wzorcowej po wykonanie linii 1; następnie jest średnik, a po nim przestrzeń na mapie .
Obszar mapy mówi nam, ile pasujących puzzli obok 1 jest potrzebnych do przedstawienia każdego odpowiedniego znaku alfanumerycznego. Jeśli chcemy wiedzieć, ile pasujących pasków jest wymaganych do reprezentacji dowolnego znaku alfanumerycznego w obszarze mapy, szukamy pierwszej sekwencji ciągłych% po lewej stronie tego znaku, a odpowiedzią będzie liczba% w ta sekwencja plus 1. Tak więc na przykład liczba zapałek potrzebnych do przedstawienia „b” wynosi 4 + 1 = 5; reprezentować „4”, 3 + 1 = 4, reprezentować „y”, 3 + 1 = 4; i tak dalej.
To jest pętla. Teraz zastąpimy każdy znak w przestrzeni wejściowej (pełną) sekwencją%, której liczba wskazuje niezbędną liczbę zapałek do reprezentowania tego znaku, i podążymy za tą sekwencją spacją (ponownie wielkie i małe litery są poddane temu samemu leczeniu). Kryterium ustalenia, czy pętla powinna się kończyć, jest sprawdzenie, czy w bezpośrednim lewym rogu średnika w przestrzeni wzorca znajduje się biały znak: jeśli ten warunek się utrzymuje, przerywamy pętlę i przechodzimy do następnej linii.
Te dwie linie usuwają średnik i wszystko po nim z obszaru wzorców, a następnie wstawiają przecinek i średnik na początku obszaru wzorców. Mamy teraz przestrzeń wzorcową ponownie podzieloną na dwie nowe podprzestrzenie: analogową przestrzeń wynikową przed średnikiem i analogową przestrzeń wejściową po niej.
Analogowa przestrzeń wejściowa jest dokładnie tym, co wcześniej nazywaliśmy „przestrzenią wejściową”, ale w innej formie: teraz zawiera sekwencje% oddzielone białą spacją. Łączna liczba takich% w analogowej przestrzeni wejściowej to ta sama liczba zapałek potrzebnych do przedstawienia początkowego ciągu znaków wejściowych, tzn. Liczba ta jest wynikiem. Ale musimy wydrukować te wyniki w notacji dziesiętnej, a nie jako ciąg znaków procentu. Celem analogowej przestrzeni wyników jest przechowywanie analogowej reprezentacji każdej cyfry wyniku, podczas gdy my obliczamy ten wynik, sumując każdą ciągłą sekwencję% w analogicznej przestrzeni wejściowej jeden po drugim. Następna pętla wykonuje tę sumę:
Najpierw, po etykiecie 2 , przenosimy kolejną ciągłą sekwencję% za średnikiem z analogowej przestrzeni wejściowej do bezpośredniego lewego średnika, w analogicznej przestrzeni wyników;
Następnie wchodzimy w pętlę podrzędną (etykieta 3 ), która wykonuje następujące obliczenia:
Jeśli istnieje ciągła sekwencja dziesięciu% po przecinku w analogicznej przestrzeni wyników, usuwamy te% i umieszczamy pojedynczy% natychmiast po lewej stronie przecinka. Mówiąc prościej, oznacza to, że jedno z miejsc po przecinku w wyniku uzyskało więcej niż 9 jednostek, więc odejmujemy 10 jednostek od tego miejsca po przecinku i dodajemy 1 jednostkę do następnego większego miejsca po przecinku;
Jeśli „%” jest pierwszym znakiem w obszarze wzorów, wstawiamy nowy przecinek bezpośrednio przed nim. Wskazuje to, że suma osiągnęła wartość, której reprezentacja dziesiętna ma o jedno miejsce dziesiętne po lewej stronie niż poprzednia wartość;
Jeśli nadal istnieje ciągła sekwencja dziesięciu% w analogicznej przestrzeni wyników, wrócimy do etykiety 3 i powtórzymy ten proces. W przeciwnym razie wychodzimy z tej pod-pętli i przechodzimy do następnej linii.
Teraz, jeśli w analogicznym obszarze wejściowym jest jeszcze „%” (tj. Po średniku), oznacza to, że do sumy całkowitej należy dodać jeszcze pewną liczbę zapałek - wracamy do etykiety 2 .
Po zakończeniu sumowania wchodzimy do ostatniej pętli kodu:
Tutaj sprawdzamy każdą parę znaków utworzoną przez przecinek po lewej stronie oraz średnik lub przecinek po prawej stronie. Wszystkie takie pary znaków zastępujemy „0” w dwóch przecinkach.
Powyższy fragment kodu jest dość prosty: zamieniamy każdą ciągłą sekwencję% w analogicznej przestrzeni wyników na znak dziesiętny, który odpowiada liczbie% w każdej określonej sekwencji.
Na koniec usuwamy wszystkie znaki nieliczbowe z obszaru wzorców, a tym, co pozostaje, jest końcowy wynik znanego zapisu dziesiętnego. Ta wartość jest drukowana na standardowym wyjściu i rozpoczyna się następny cykl sed, jeśli jest więcej linii wejściowych do przetworzenia.
źródło
C (gcc) , 134 bajty + 38 zapałek = 172
Wypróbuj online!
źródło
05AB1E , 30 bajtów + 70 dopasowań = 100 punktów
Wypróbuj online!
-5 dzięki Emginie
źródło
Al
=A
. Ty także nie potrzebujesz}
.Java 10
452432416404 wynik (145 bajtów + 259 wyników)Wyjaśnienie:
Wypróbuj online.
Zmienne nazwyEDYCJA: Nazwy zmiennych$ραετ
są używane zamiast liter.kmtvw
Zamiast tego używane są teraz , ponieważ nie można ich tworzyć z dopasowań zgodnych z opisem wyzwania.''
(niedrukowalne) jest używane zamiast6
.m-m
it-t
są używane zamiast0
.(char)(w|32)+""
z wejściem tablicy znaków używanym zamiastw.toLowerCase()
z wejściem tablicy znaków.źródło
AutoHotkey , 148 bajtów + 345 zapałek = 493
To było trochę trudne do skrócenia.
źródło
Python 3 , 123 bajty + 65 dopasowań = 188
Nienazwana funkcja akceptująca ciąg znaków i zwracająca liczbę całkowitą.
Zawiera wiele niedrukowalnych znaków (w szczególności bajty od jednego do ośmiu).
Wypróbuj online!
źródło
Węgiel drzewny , 48 bajtów + 3 = 51
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Zapętlaj znaki wejściowe, obliczając liczbę zapałek każdego z nich, a następnie zsumuj wynik, przekonwertuj na ciąg i niejawnie wydrukuj.
Jeśli to list ...
Sprawdź liczbę zapałek w skompresowanym ciągu
65455454240303455250300545
.W przeciwnym razie pojawi się w wartości
2 ** 1000
...Sprawdź liczbę zapałek w skompresowanym ciągu
6255456376
.źródło
PHP, 98 + 253 = 351
Uruchom jako potok z
-nr
lub spróbuj online .źródło