Wprowadzenie
Rozważ następujący przykład:
CODE
+ GOLF
——————
GREAT
Jest to równanie, w którym każda litera reprezentuje cyfrę dziesiętną, a słowa reprezentują liczby naturalne (podobne litery reprezentują podobne cyfry, a różne litery reprezentują różne cyfry). Zadaniem jest dopasowanie każdej litery do jej wartości cyfrowej, aby równanie było prawidłowe. Jednym z rozwiązań powyższego równania jest:
9265
+ 1278
——————
10543
Twoje zadanie
Twoim zadaniem jest napisanie programu lub funkcji, która może rozwiązać takie równania, jak pokazano powyżej.
Wejście
Dane wejściowe to ciąg znaków w następującym formacie:
[A-Z]+\+[A-Z]+=[A-Z]+
Przykład:
CODE+GOLF=GREAT
AA+BB=CC
Spacje są pomijane i będą używane tylko litery pomiędzy dużymi literami A i Z (bez specjalnych lub małych liter).
Ciąg ten można odczytać ze standardowego wejścia, z pliku lub jako parametr funkcji.
Wynik
Dostępne są następujące dwie opcje formatu wyjściowego:
- oryginalne równanie z podstawionymi cyframi
- lista liter i ich wartości
Jeśli istnieje wiele rozwiązań, należy zwrócić dowolne (ale tylko jedno) z nich. Jeśli nie ma rozwiązań, program powinien zwrócić pusty ciąg lub wartość null. Dane wyjściowe można zwrócić jako ciąg znaków, można zapisać na standardowym wyjściu lub w pliku.
Przykład:
9265+1278=10543
A=1 B=2 C=3
(możesz użyć dowolnego ogranicznika)
Zasady
- Aby ułatwić sprawę, liczby zaczynają się od 0, ale możesz traktować liczby z wiodącym 0 jako nieprawidłowe rozwiązania, to zależy od Ciebie
- Podobne litery reprezentują podobne cyfry, a różne litery reprezentują różne cyfry
- Możesz użyć dowolnego języka i standardowej biblioteki wybranego języka (bez zewnętrznych bibliotek)
- Nie możesz połączyć się z żadnymi zasobami w Internecie (dlaczego miałbyś tak robić?)
- To jest zadanie w golfa kodu, wygrywa najkrótszy kod. Kolejne białe znaki są liczone jako pojedynczy znak. (Tak więc każdy program napisany w białej spacji automatycznie wygrywa)
Mam dość hackerskie rozwiązanie, używając 179 znaków. Jeśli coś nie jest jasne, zapytaj mnie w komentarzach.
źródło
If there are no solutions, the program should return an empty string or null.
Nieskończone pętle nadal nic nie dają ... czy mogę?Odpowiedzi:
Python - 48 znaków
Nadużywanie reguły białych znaków.
Najpierw przekonwertowałem każdą postać w odpowiedzi CesiumLifeJacket na jej wartość ASCII (mógłbym napisać własną, ale jestem leniwy, i tak nie wpłynęłoby to na końcowy wynik). Długi ciąg w moim rozwiązaniu to jedna spacja dla każdej z tych wartości ASCII i oddzielające je tabulatory. Podziel na zakładkach, znajdź długości, przekonwertuj z powrotem na znaki i uruchom.
SE konwertuje tabulatory na 4 spacje, więc kopiowanie nie będzie działać. Musisz mi tylko uwierzyć :)
źródło
Ruby 2.0, 122 znaki
Brute force shuffling + eval!
Nie spełnia to jeszcze kryteriów zwracania pustego / pustego łańcucha, gdy nie ma rozwiązania; po prostu zapętla się w nieskończoność.Jeśli nie będzie w stanie znaleźć wyniku po ~ 300 milionach iteracji, zwróci zero. Wystarczająco blisko?Znajduje wszystkie unikalne litery na wejściu, a następnie wielokrotnie tasuje cyfry 0–9 i próbuje dopasować je do liter, aż znajdzie konfigurację, która działa.
Kod jest prezentowany jako wywoływana funkcja,
f
która zwraca ciąg znaków z podstawionymi liczbami, jak w opcji wyjścia 1 powyżej. Przykładowe użycie:Czas działania dla
CODE+GOLF=GREAT
przykładu na mojej maszynie waha się od chwilowego do około 6 sekund - zależy od tego, ile masz szczęścia z tasowaniem!Jestem szczególnie niezadowolony z tego,
gsub(/\b0/,'')
że usuwam początkowe zera, ale to jedyna rzecz, o której mogłem pomyśleć, aby nieeval
interpretować liczb jako liczb ósemkowych.( BONUS : Ponieważ używa eval, działa dla dowolnych wyrażeń Ruby, a nie tylko dla dodawania!)
źródło
permutation
, ale, jak mówisz, przede wszystkim martwiłem się długością kodu.LiveScript (179 znaków)
Ma deterministyczny i stosunkowo szybki czas działania i współpracuje również z innymi operatorami (+, -, *).
źródło
Python,
256213 znakówPrzerażający czas pracy, postara się poprawić:
źródło
JavaScript 138
Losowa brutalność.
Może trochę potrwać (moje najlepsze ujęcie
CODE+GOLF=GREAT
to 3 sekundy, moje najgorsze 3 minuty).Spróbuj z prostym wyrażeniem, takim jak
A+B=C
źródło
Haskell, 222
Brutalna siła. Próbuje każdego możliwego dopasowania, dopóki go nie znajdzie lub po zakończeniu wypróbowania wszystkich. Rozciągnąłem reguły wyjściowe: drukuje coś w rodzaju
[[('C','3'),('O','8'),('D','6'),('E','7'),('G','0'),('L','5'),('F','2'),('R','4'),('A','1'),('T','9')]]
rozwiązania, a jeśli nie istnieje, drukuje[]
. Daj mi znać, jeśli będę musiał to zmienić.źródło
CJam - 17
Łącznie 975 znaków, ale 960 z nich to białe znaki w 2 sekwencjach, więc liczą się one jako 2 znaki, a wraz z pozostałymi 15 otrzymujemy 17.
975 może wydawać się dużo, ale zauważ, że rozwiązanie python podziemnej kolejki ma 18862 znaków, są tylko na jednej linii :)
Możesz uruchomić go na http://cjam.aditsu.net/ dla krótkich słów, ale prawdopodobnie powinieneś używać interpretera java dla dłuższych. Z java na moim laptopie,
SEND+MORE=MONEY
działa w 30-40 sekund iCODE+GOLF=GREAT
prawie 3 minuty. Nie akceptuje liczb zaczynających się od 0 (ponieważ to nie jest fajne).Oto program, który generuje program powyżej (pomaga również, jeśli StackExchange nie wyświetla poprawnie białych znaków):
Pierwsze 11 wierszy zawiera oryginalny program (nie tak naprawdę golfowy) w ciągu, a ostatni wiersz dokonuje konwersji i dodaje część dekodującą.
źródło
PowerShell, 137 bajtów
port LiveScript
Skrypt testowy bez golfisty:
Wynik:
źródło
PHP,
118113 bajtówdrukuje cyfry pod literami i wychodzi z programu; zapętla się w nieskończoność, jeśli nie da się go rozwiązać. Uruchom jako potok z
-nr
.awaria
źródło
PHP, 145 bajtów
funkcja rekurencyjna, drukuje rozwiązane równanie i wychodzi z programu; zwraca,
NULL
gdy nierozwiązywalne.Wypróbuj online
awaria
źródło