Wszyscy to zrobiliśmy, no cóż, może nie, ale tworzenie własnego obcego języka i systemu numeracji jest podstawowym elementem pisania fantasy, ale przede wszystkim jest zabawą.
Zadanie jest proste, weź dwa dane wejściowe:
Uporządkowana lista zawiera 10 [dziesięć] unikatowych „cyfr” (dowolnych drukowalnych znaków ASCII) i interpretuje je w kolejności jako wartości 0, 1, 2, 3, ..., 9
+ Istnieją wyjątki od tego, co może być cyfrą tutaj. Operatory arytmetyczne (+, -, *, /), nawiasy i spacje nie mogą być używane jako jedna z cyfr.
Problem arytmetyczny z wykorzystaniem tylko tych „cyfr”
I wyprowadza równoważną liczbę całkowitą w podanej formie.
Oto przykład:
INPUT
abcdefghij
bcd + efg + hij
OUTPUT
bdgi
W tym przykładzie lista wejściowa (możesz wybrać, w jakiej formie się pojawi) „abcdefghij” odpowiada „0123456789”, podobnie jak „hjkloiwdfp” również odpowiada 1 do 1 z „0123456789”, gdzie zamiast „a” kojarzy się z zero, „h” robi. Arytmetyka po „tłumaczy” przekłada się na 123 + 456 + 789, co równa się 1368. Musi to zostać wyprowadzone w postaci, w jakiej ją otrzymaliśmy, więc b (co oznacza 1) d (dla 2) g (dla 6) i i (dla 8).
PRZYPADKI TESTOWE
abcdefghij
abc + def - ghij
-gedc
qwertyuiop
qwerty / uiop
e
%y83l;[=9|
(83l * 9) + 8%
y9|8
WIĘCEJ ZASAD
- Standardowe luki są zabronione!
- To jest kod golfowy, więc wygrywa najkrótsza odpowiedź w bajtach.
- Musi to być pełny program lub funkcja przyjmująca wejścia i wyjścia w dowolnym formacie, który najbardziej Ci odpowiada. (Po prostu nie można dodać dodatkowych informacji do danych wejściowych, tylko „cyfry” i wyrażenie.
- Używaj dowolnego języka (o ile jest zgodny z innymi zasadami)
źródło
q.ioiopewioyetqorw...
. Jeśli tak, jakie zaokrąglenie należy zastosować?1
dla5/3
, a nie2
, ze względu na podział całkowitej (brak zaokrąglenia). Nie unieważnia to wyzwania, ale może być konieczne dopuszczenie różnych akceptowalnych odpowiedzi dla tego samego przypadku testowego (zobacz moją odpowiedź T-SQL poniżej).Odpowiedzi:
05AB1E ,
109 bajtów(Teraz) wyprowadza jako listę znaków.
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Nowa wersja 05AB1E to build, build w Elixir .
.E
Funkcja zadzwonicall_unary(fn x -> {result, _} = Code.eval_string(to_string(x)); result end, a)
, gdzieCode.eval_string
jest wbudowane Elixir .Zauważ, że starsza wersja 05AB1E nie działa w tym celu, ponieważ jest wbudowana w Pythona. Liczby z wiodącymi zerami nie będą oceniane:
Zobacz wszystkie przypadki testowe w starszej wersji (która używa wersji 10-bajtowej, ponieważ
Åв
wbudowane jest nowe).źródło
R , 58 bajtów
Wypróbuj online!
Używa translacji znaków,
chartr
aby zamienić cyfry,parse
s ieval
s wyrażenia, a następniechartr
s z powrotem do oryginalnych cyfr.Jeśli wymagane jest zaokrąglenie do najbliższej liczby całkowitej, jest to
R , 65 bajtów
Wypróbuj online!
źródło
[
jako krótszej nazwy funkcji z 3 parametrami jest bardzo sprytne. Dobra robota.T-SQL, 117 bajtów
Podziały linii służą wyłącznie do odczytu.
Wprowadzanie odbywa się za pomocą istniejącej tabeli t z kolumnami tekstowymi c (znaki) i e (równanie), zgodnie z naszymi zasadami IO .
Używa funkcji SQL 2017
TRANSLATE
do przełączania się między znakami i generowania ciągu zawierającego nie tylko równanie, ale także kod do przetłumaczenia z powrotem na oryginalne znaki:Ten ciąg jest następnie oceniany przy użyciu
EXEC()
.Może być kilka znaków (na przykład pojedynczy cytat
'
), które mogłyby złamać ten kod; Nie przetestowałem wszystkich możliwych znaków ASCII.Pod kątem wyzwania oceniam podane wyrażenie, z zastrzeżeniem sposobu, w jaki mój język interpretuje te operatory. Jako taki, drugi przypadek testowy zwraca 1 (
w
), a nie 2 (e
), z powodu podziału na liczby całkowite.źródło
Perl 6 , 38 bajtów
Wypróbuj online!
Nie jestem pewien, jak powinno działać zaokrąglanie. Jeśli zaokrągli się na końcu, mogę dodać
.round
dla +6 bajtów . Jeśli zachowanie/
powinno być inne, może być dłuższe. Sprawia, że wejście jest curry jakf(arithmetic)(numerals)(arithmetic)
.Wyjaśnienie:
źródło
Stax ,
746665 bajtówUruchom i debuguj
Stax nie radzi sobie tutaj dobrze, brakuje mu prawdziwej instrukcji „ewaluacji”. Ma taki, który w dokumentach nazywa się „eval”, ale działa tylko na wartościach dosłownych, a nie na pełnych wyrażeniach.
źródło
Bash, 97 bajtów
Mogłoby być mniej, gdybyśmy mogli obciąć, a nie zaokrąglić. Trudne jest także posługiwanie się zerami wiodącymi (jak w przypadku testowym nr 2), ponieważ Bash interpretuje liczby zaczynające się od 0 jako ósemkowe.
źródło
tr
jest częścią coreutils, abc
nie jest. Niemniej jednakbc
jest bardzo powszechnym narzędziem. Każde inne polecenie w tej odpowiedzi to bash.$T
jest tylko jeden bajt krótszy niż0-9
, używasz go tylko dwa razy i wydajesz 8 bajtów, aby go zdefiniować.Bean ,
9490 bajtówHexdump
JavaScript
Wyjaśnienie
Ten program domyślnie przypisuje pierwszy i drugi wiersz danych wejściowych jako ciągi do zmiennych
a
ib
odpowiednio.Każdy znak
c
w wierszub
jest zastępowany odpowiednim indeksemi
znaku znalezionego w wierszua
lub samego , jeśli nie został znaleziony.Następnie usuwa każdą sekwencję jednego lub więcej
0
s poprzedzoną granicą z wynikowego łańcucha. Zapobiega toeval()
ocenieniu jakiejkolwiek sekwencji cyfr rozpoczynającej się0
od literału ósemkowego.Po
eval()
iMath.round()
wynik jest ponownie wymuszany na ciąg znaków, a każdy znak cyfryi
jest zastępowany odpowiednim znakiem z wierszaa
o indeksiei
.Przypadki testowe
Próbny
Próbny
Próbny
Próbny
źródło
Perl 5
-p
, 63 bajtówWypróbuj online!
Pobiera wyrażenie w pierwszym wierszu wprowadzania, a listę tłumaczeń w drugim.
źródło
Perl 5 , 130 bajtów
Wypróbuj online!
Może ta podwójna ewaluacja może się jakoś zmienić
s/.../.../geer
.źródło
Węgiel drzewny , 14 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Uwaga: Wyrażenie jest oceniane zgodnie z semantyką języka Python 3, więc na przykład początkowe zera na liczbach niezerowych są nielegalne. Wyjaśnienie:
źródło
0
s nie działają w Pythonie, który jest obecny w przypadkach testowych.Python 3 , 137 bajtów
Podejście inne niż wyrażenia regularne, w którym stosuje się
str.translate
istr.maketrans
do zamiany znaków. Straciłem wiele znaków po przycięciu wiodących zer ...Wypróbuj online!
źródło
Python 3 , 167 bajtów
Wypróbuj online!
Miejsce na udoskonalenie...
źródło
Wolfram Language (Mathematica) , 121 bajtów
Definiuję funkcję czystą z dwoma argumentami. Ponieważ niektóre funkcje są powtarzane, zapisuję je w zmiennej, aby zapisać kilka znaków. Ten kod po prostu zastępuje ciągi znaków, a następnie używa
ToExpression
do oceny wyrażenia za pomocą jądra Wolfram.Wypróbuj online!
źródło
Lua ,
162151150 bajtówload
zamiastfunction(...) end
Wypróbuj online!
Nie jest to najkrótsza rzecz na świecie (Lua zmusza cię do fantazji, szczególnie przez ogromne słowa kluczowe), ale tworzenie jej było całkiem fajne. Pełny program przyjmujący dane wejściowe jako argumenty i wynik drukowania.
Wyjaśnienie
Wprowadzenie
Przypisz wartości z argumentów do zmiennych. Nasz słownik jest
l
i wyrażenie jestp
.Następujące wyrażenie jest dość trudne do zrozumienia, ponieważ ma dziwną kolejność wykonywania, więc wyjaśnię to krok po kroku:
Konwersja na liczby normalne
Wykonaj zamianę na ciąg wyrażenia: weź każdy symbol i przekaż go do funkcji (
load
okazało się, że jest krótszy niż normalna deklaracja tutaj).Funkcja wyszukuje pozycję wystąpienia w łańcuchu dict dla przekazanego symbolu za pomocą
find
....
jest pierwszym (i jedynym) argumentem tutaj, ponieważ jesteśmy w funkcji vaarg (dowolnaload
edycja), która jest naszym bieżącym symbolem. Następujące argumenty są wymagane, abyfind
zignorować specjalne symbole (1
jest to tylko krótka wartość, która ocenia się tak, jak wtrue
przypadku konwersji na wartość logiczną): pozycja początkowa (jeden jest tutaj wartością domyślną) iplain
która faktycznie wyłącza obsługę wzorca. Bez tych programów nie powiedzie się trzeci przypadek testowy, ponieważ%
jest wyjątkowy.Jeśli znaleziono dopasowanie, odejmij jeden, ponieważ łańcuchy Lua (i tablice btw) są oparte na 1. Jeśli nie zostanie znalezione dopasowanie, nic nie zwróci, w wyniku czego nie zostanie wykonana zamiana.
Rozwiązywanie
Przygotuj się
return
na nasze wyrażenie, aby zwrócił wynik, oblicz go, kompilując jako funkcję Lua i wywołując ją, wykonując zaokrąglanie ( to zamienił odwrót, aby krótszy).Na końcu otrzymujemy numeryczne rozwiązanie naszego problemu, pozostaje tylko jego konwersja.
Znowu to wariuje
Pierwszy wiersz to krótki sposób na konwersję liczby na ciąg, dzięki czemu możemy teraz wywoływać metody ciągów w krótki sposób. Zróbmy to!
Teraz
gsub
jest ponownie wzywany, aby zastąpić wszystko z powrotem szaleństwem. Ten czas%d
jest używany zamiast.
wzorca zastępczego, ponieważ nasza funkcja może i musi przetwarzać tylko liczby (.
spowodowałoby to błąd na liczbach ujemnych). Ta funkcja czasu (load
ponownie edytowana w celu zapisania bajtów) dodaje najpierw1
edytowana w swój pierwszy (i tylko) vaargument, konwertując go na pozycję w łańcuchu dict, a następnie zwraca znak z tej pozycji.Brawo, już prawie!
Dramatyczny finał, czyli dlaczego nawiasy mają znaczenie
Cóż… dlaczego w ogóle dwie pary nawiasów? Czas porozmawiać o paraleli ... eh, wielokrotny powrót do Lua. Chodzi o to, że jedna funkcja może zwrócić kilka wartości z jednego wywołania (spójrz na to meta-pytanie, aby uzyskać więcej przykładów).
W tym przypadku ostatnia
gsub
zwróciła dwie wartości: łańcuch odpowiedzi, którego potrzebujemy, i liczbę wykonanych wymian (liczba cyfr faktycznie, ale kogo to obchodzi). Gdyby nie para wewnętrzna, wydrukowano by zarówno łańcuch, jak i numer, co nas popsuło. Dlatego poświęcamy dwa bajty, aby pominąć drugi wynik i ostatecznie wydrukować produkt tej fabryki szaleństwa.Cóż, podobało mi się wyjaśnianie prawie tak samo jak gra w golfa, mam nadzieję, że wiesz, co się tutaj dzieje.
źródło