W ezoterycznym języku programowania Curly programy składają się wyłącznie z nawiasów klamrowych {}
i średników ;
. Pomimo tego skromnego zestawu narzędzi, Curly ma literały, które mogą reprezentować dowolną nieujemną liczbę całkowitą. Format jest jednak nieco trudny do odczytania przez niewtajemniczonych, więc napiszmy kod, który przeprowadzi dla nas konwersję.
Format liczb
Liczby kręcone są uporządkowane zgodnie z następującymi zasadami:
- Dodanie średnika dodaje jeden do liczby.
- Liczba zamknięta w nawiasy klamrowe jest mnożona przez cztery.
- Grupy nawiasów klamrowych mogą być zagnieżdżone, ale nie łączone. Nawiasy klamrowe muszą być odpowiednio dopasowane.
- Średniki poza zestawem nawiasów klamrowych muszą pojawić się później, a nie wcześniej.
- Aby uniknąć dwuznaczności podczas analizowania, liczba musi zawsze zaczynać się od nawiasów klamrowych.
Kilka przykładów:
{;;} 2*4 = 8
{{;};}; (1*4+1)*4+1 = 21
{};;; 0*4+3 = 3
(Uwaga: reguła 5 oznacza, że liczby od 0 do 3 muszą zaczynać się od pustej pary nawiasów klamrowych).
I niektóre nieprawidłowe przykłady:
{{;}{;;}} Curly brace groups side-by-side, not nested
{;}} Unmatched brace
{;{;}} Semicolon before curly-brace group
;;; Number does not start with curly brace
Oto gramatyka BNF dla liczb kręconych:
<number> ::= "{" <inner> "}" <semis>
<inner> ::= <semis>
| <number>
<semis> ::= ";" <semis>
| ""
Liczby takie jak {;;;;}
(więcej niż 3 średniki z rzędu) lub {{};}
(niepotrzebne puste grupy nawiasów klamrowych) są nazywane nieprawidłowymi liczbami kręconymi. Przestrzegać ich wyżej gramatyki i może być rozpatrywane w zwykły sposób, ale są również zdolne do krótszych przedstawień (w powyższych przykładach, {{;}}
a {;}
odpowiednio).
Wyzwanie
Napisz program lub funkcję, która wprowadza / odbiera ciąg znaków. Jeśli ciąg jest nieujemną liczbą całkowitą dziesiętną, wyślij / zwróć odpowiednią (tj. Najkrótszą możliwą) reprezentację Curly dla tej liczby całkowitej. Jeśli ciąg jest liczbą Curly, wyślij / zwróć jego reprezentację dziesiętną.
Dane wejściowe można odbierać za pomocą STDIN, argumentu wiersza poleceń lub parametru funkcji. To musi być sznurek; to znaczy, nie możesz napisać funkcji, która akceptuje łańcuchy dla liczb Curly, ale liczby całkowite dla liczb dziesiętnych.
Wyjście można wydrukować do STDOUT lub zwrócić z funkcji. Funkcja może zwracać liczbę całkowitą, gdy jest to właściwe, lub może zwracać ciągi we wszystkich sytuacjach.
Twój program nie musi obsługiwać złe wejście (liczby Curly, które łamią zasady formatowanie liczb zmiennoprzecinkowych, ujemnych liczb całkowitych, tekst losowe), a to jest nie muszą obsługiwać niewłaściwych numerów Curly (ale patrz niżej). Dane wejściowe będą składały się wyłącznie z drukowalnych znaków ASCII.
Punktacja
Najkrótszy kod w bajtach wygrywa. Jeśli Twój program może wykonać obie następujące czynności:
- poprawnie obsługiwać niewłaściwe liczby kręcone, oraz
- po otrzymaniu liczby Curly zignoruj dodatkowe znaki, które nie są
{};
następnie odejmij 10% od swojego wyniku. (Dane liczbowe całkowite nigdy nie będą miały obcych znaków, nawet dla bonusu).
Przypadki testowe
Input Output
{;;} 8
{{;};}; 21
{};;; 3
{{{{;}}};} 260
{} 0
4 {;}
17 {{;}};
1 {};
0 {}
96 {{{;};;}}
Aby otrzymać bonus:
{};;;;; 5
{{;;;;};;} 72
c{u;r;l}y;! 9
42{;} ;;;; 8
Uwaga: Curly nie jest jeszcze zaimplementowany. Ale jeśli to pytanie się powiedzie, mogę je rozwinąć.
źródło
Odpowiedzi:
Pyth,
3532 bajtów - 10% = 28,8Wypróbuj online: pakiet demonstracyjny lub testowy
edytuj: Jak się okazało, przez przypadek mogę również obsługiwać niewłaściwe numery kręcone. W ogóle nie był planowany. ;-)
Wyjaśnienie:
Kod zawiera dwa wyrażenia. Pierwszy przekształca liczbę w Liczbę kręconą, a drugi przekształca Liczbę kręconą w liczbę zwykłą.
.x
uchwyty, których wyrażenie zostanie wydrukowane. Spróbuje wydrukować pierwsze wyrażenie. Jeśli na wejściu są jakieś cyfry, pierwsze wyrażenie nie powiedzie się (przez wyjątek)..x
wyłapuje wyjątek i drukuje drugi.źródło
.[Z2
to konieczne.CJam,
51474441 bajtówWypróbuj online: uruchomienie próbne | pakiet testowy
Jak to działa
źródło
Python 2, 167 bajtów - 10% = 150,3
W tej implementacji
c
jest funkcja, która spełnia wymagania. Zwraca ciąg, jeśli podano nieujemną liczbę całkowitą jako dane wejściowe lub liczbę całkowitą, jeśli podano liczbę kręconą jako dane wejściowe.źródło
Python 266 bajtów - 10% =
1268,1326,7 239,4bajtówChłopiec nie jestem golfistą jeszcze kodu = /, ale 10% pomógł mi się na wiele , kiedy mój wynik był nadal ponad 1000!
Mam tutaj w pełni rozwiniętą (i pełną) wersję tego kodu . Będzie rozpoznawał ważność liczb kręconych i zapewni zapętlony interfejs do wprowadzania liczb do testowania.
(Komentarze tylko w celu wyjaśnienia)
Zobacz ten kod w akcji
Podziękowania dla Erika Konstantopoulosa za znaczną redukcję bajtów! Można powiedzieć, że ... naprawdę wyjął ... bajt ... z mojego kodu ... * siebie pięć *
źródło
print
instrukcji i komentarzy, nazwy zmiennych są za długie i niektóre białe znaki można wyeliminować. Polecam również przeczytanie Porady dotyczące gry w golfa w Pyrhon .value
nav
itp.), 3) sprytnie graj w golfa : w tym miejscu musisz spojrzeć na link Dennisa. Jestem ciekawy, jak możesz to zmniejszyć!CJam,
87 bajtówwynik 80,1 (89 bajtów - 10% bonusu)Zaktualizuj wersję, która kwalifikuje się do premii, powiększając się o 2 bajty:
Wypróbuj online
Pierwszy raz użyłem rekurencji w CJam! Całość może wydawać się długa, ale suma dwóch całkowicie osobnych konwersji.
Użyłem zupełnie osobnego przypadku do konwersji liczb mniejszych niż 4 na Curly. Prawdopodobnie można tego uniknąć, ale złożenie obsługi specjalnych przypadków do funkcji rekurencyjnej nie byłoby całkowicie trywialne. Dodanie tego dodatku
{}
jako etapu przetwarzania końcowego nie wyglądało wcale lepiej, chociaż powinienem spróbować ponownie, jeśli może być nieco krótszy.źródło
C #, 173 - 10% = 155,7
171,0, 177,3To nie robi walidacji i tylko wygląda na
;
i}
znaków. Zakłada, że wszystkie{
postacie występują przed dowolnymi;
postaciami. Najtrudniejszą rzeczą, jaką znalazłem, było nie wstawianie znaku{}
pośrodku liczby Curly.Podziały linii i wcięcia dla przejrzystości:
źródło
Java 326 bajtów - 10% = 294 bajtów
Jest to kompletny program napisany w Javie,
Jestem pewien, że może być znacznie krótszy, ale nie mam teraz dużo czasu na jego optymalizację
źródło
public
przed klasąpublic static void main(String[]c){
zstatic{
GNU sed,
330326 - 10% = 293,4(Dodałem jeden do wykorzystania
-r
przed zażądaniem premii 10%; mam nadzieję, że to prawda)Pełna wersja pokazuje, że większość z powyższych to konwersja między dziesiętną a jednostkową:
źródło
Perl,
183177To może nie być najkrótsza odpowiedź Perla, ale myślę, że jest wystarczająco interesująca, aby opublikować (wejście
$_
, wyjście jako wartość zwracana):sub f{if(/}/){s/[{}]/00/g;oct'0b'.s/00(;+)/sprintf'%02b',length$1/ger}else{$_=sprintf'%064b',$_;s/../oct"0b$&"/ge;s/^0+(?!$)//;$_='{'x length.$_;s/\d/'}'.';'x$&/ge;s/\Q{{}/{/r}}
Zauważamy, że Curly to po prostu notacja czwartorzędowa (podstawa-4). Trochę przeszkadza nam brak natywnego wsparcia dla czwartego kwartału przez Perla, ale na szczęście każdy z czwartorzędowych bitów ma dwa bity, i możemy czytać i pisać w formacie binarnym. Mamy więc następujące:
Wersja rozszerzona
źródło
JavaScript (ES6), 95 (105–10%)
Przetestuj poniższy fragment kodu
źródło
Rubin,
126,9129,6 (144-10%)Używa rekurencji do konwersji dziesiętnej na formę nawiasową. Usunięcie zaznaczenia ignorowania postaci poza wartością
/[;{}]/
zwiększa wynik0.4
w tej chwili.źródło
Perl 5, 154 (
185170 bajtów - 10% + 1 kara)Regex i eval rozwiązują curlies.
Generowanie loków odbywa się inaczej.
Test
Plik testowy zawiera również przypadki bonusowe
źródło
Retina ,
6964 bajtówWypróbuj pakiet testowy
Wyjaśnienie
Rozkład wewnętrzne klamry na tylko
;
s. Pętla, aż nie będzie więcej nawiasów klamrowych.Konwertuj między dziesiętną a jednostkową
;
Znajdź najdłuższy z nich
;
to wielokrotność 4 i zagnieźdź w nawiasy klamrowe, zapętlaj, aż nie będzie już więcej serii 4+.Jeśli wynikowa liczba kręcona zaczyna się od
;
lub jest pustym ciągiem, dodaj{}
z przodu.źródło
Python 2 , 157 bajtów -10% = 141,3
Wypróbuj online!
Bardziej golfowa odpowiedź na Python 2, która obsługuje przypadki bonusowe. Nie chciałem nekrologować martwych postów z tym komentarzem, więc oto jest.
Działa od wewnątrz na liczbach kręconych, dodając 4 ^ (liczbę końcowych nawiasów klamrowych pozostałych w ciągu) do sumy dla każdego znalezionego średnika. Jeśli ciąg jest liczbą, rekurencyjnie tworzy liczbę kręconą w taki sam sposób, jak podaną gramatykę.
źródło