Einstein napisał zagadkę. Powiedział, że 98% świata nie może tego rozwiązać.
Rozwiązałem tę zagadkę w około 25 minut w pociągu do pracy. To po prostu dedukcja.
Zagadka
Istnieje 5 domów w 5 różnych kolorach z rzędu.
W każdym domu mieszka osoba o innej narodowości.
Pięciu właścicieli pije określony rodzaj napoju, pali określoną markę cygara i utrzymuje określone zwierzę domowe.
Żaden właściciel nie ma tego samego zwierzaka, nie pali tej samej marki cygara ani nie pije tego samego napoju.
Pytanie: Kto jest właścicielem ryby?
Aby rozwiązać tę zagadkę, Einstein zapewnia 15 wskazówek:
- Brytyjczyk mieszka w czerwonym domu.
- Szwed trzyma psy jako zwierzęta domowe.
- Duńczyk pije herbatę.
- Zielony dom znajduje się po lewej stronie białego domu.
- Właściciel zielonego domu pije kawę.
- Właściciel, który pali Pall Mall, hoduje ptaki.
- Właściciel żółtego domu pali Dunhill.
- Właściciel mieszkający w domu centralnym pije mleko.
- Norweg mieszka w pierwszym domu.
- Właściciel, który pali mieszanki, mieszka obok tego, który trzyma koty.
- Właściciel, który trzyma konia, mieszka obok tego, który pali Dunhill.
- Właściciel, który pali Bluemasters, pije piwo.
- Niemiec pali księcia.
- Norweg mieszka obok niebieskiego domu.
- Właściciel, który pali mieszanki, mieszka obok tego, który pije wodę.
Dzięki tym wskazówkom możesz znaleźć rozwiązanie.
Twoje zadanie: Stwórz program, który rozwiąże tę zagadkę. Kodowanie na stałe rozwiązanie jest niedozwolone (duh)
Dozwolone jest zakodowanie podpowiedzi w dowolnym formacie.
Przykładowy format:
//Hints in order
(Nationality:Brit)==(Color:Red)
(Nationality:Swede)==(Pet:Dogs)
(Nationality:Dane)==(Drink: Tea)
(Color:Green)/(Color:White)
(Color:Green)==(Drink:Coffee)
(Smoke:PallMall)==(Pet:Birds)
(Color:Yellow)==(Smoke:Dunhill)
(House:3)==(Drink:Milk)
(Nationality:Norwegian)==(House:1)
(Smoke:Blend)/\(Pet:Cats)
== oznacza równa
/ oznacza po lewej stronie
\ oznacza po prawej stronie
/ \ oznacza po lewej lub prawej stronie
Tak jak powiedziałem, dozwolone są albo wskazówki twardego kodu, albo mieć je jako dane wejściowe.
Dane wyjściowe: Dane wyjściowe powinny być w następującym formacie (z poprawnymi wartościami, mówiąc tylko o trollach;))
_____________ _____________ _____________ _____________ _____________
| Number | | Number | | Number | | Number | | Number |
| Nationality | | Nationality | | Nationality | | Nationality | | Nationality |
| Color | | Color | | Color | | Color | | Color |
| Drink | | Drink | | Drink | | Drink | | Drink |
| Smoke | | Smoke | | Smoke | | Smoke | | Smoke |
| Pet | | Pet | | Pet | | Pet | | Pet |
--------------- --------------- --------------- --------------- ---------------
The <Nationality> in the <Color> house owns the fish!
Pola sztuki Ascii mogą być przez ciebie zmieniane, o ile są to pudełka, nie ma znaczenia, jakich symboli używasz.
Żadna wiedza na temat tej zagadki i rozwiązania nie może być wykorzystana w programie. Aby rozwiązać zagadkę, należy użyć czystej logiki i dedukcji.
Oznaczono to jako codegolf, ale może to być wyzwanie kodowe, nie jestem pewien. Wszelkie uwagi na temat kryteriów wygranej w konkursie kodowym możesz podzielić się :)
Na razie jest to gra w golfa, więc wygrywa program o najniższej liczbie bajtów.
Powodzenia i Szczęśliwego kodowania :)
Odpowiedzi:
Prolog - 954 znaków
Wynik
Klucz:
źródło
Ruby 322 + wejście 442
Poszukiwanie brutalnej siły blisko 25 miliardów możliwych odpowiedzi. Uruchomienie tego programu na
moim komputerze zajęłoby około 75 dni .
Nigdy nie sprawdziłem, czy ten program wyświetla poprawną odpowiedź!
Uruchom jako
ruby riddle.rb < riddle.in
riddle.rb (332 bajty)
riddle.in (442 bajty)
Plik wejściowy musi zawierać 5 wierszy nazw, po których następują wiersze wyrażeń logicznych. Numery domów to od 0 do 4. Musi być
fish
.Program wzywa
Array#permutation
pięć razy, aby znaleźć wszystkie sposoby na uporządkowanie tablic narodowości, kolorów, napojów, smoków i zwierząt domowych. Długa pętlac.product(*d){|a|...}
, nazywającArray#product
iteracyjne prawie 25 miliardów możliwych odpowiedzi. Ciało pętli ma formę(f=eval ...)&&(...)
.eval ...
Część ocenia wyrażeń logicznych. Jeśli wszystkie są prawdziwe, tof
jest numer domu ryby, a&&(...)
część wypisuje odpowiedź. Dom numer 0 jest prawdziwy w Ruby.Code golf oznacza brak dodawania kodu prędkości! Ale brakuje mi 75 dni na uruchomienie programu!
źródło
Prolog, 653 znaków
źródło
Smalltalk 1332 znaków
Używając zwykłego Smalltalk:
Wynik:
Ponieważ wersja gry w golfa jest prawie nieczytelna, oto kod programisty z odpowiednimi nazwami, wcięciami i miejscami do odczytu:
Korzystanie z biblioteki solvera ograniczeń:
Korzystanie z biblioteki solvera ograniczeń, która jest bardzo podobna do opisanej w podręczniku OZ / Mozart. Jak się spodziewam, narzekasz, że to nie dotyczy konkursu ;-), jest dodawane tylko dla twojej rozrywki i inspiracji (poszukaj pakietu przeciwwskazań w twoim języku), niepolowane i nie licząc znaków.
Zwróć uwagę na operatora „=:”, co oznacza „ujednolicenie z”. Solver wykorzystuje algorytm cofania na zbiorze ograniczeń zdefiniowanych w bloku problemu. Pozostały kod drukuje rozwiązanie w polach:
Wynik:
Edycja: ups - zapomniałem wydrukować wiersz „kto jest właścicielem ryby” w wersji zwykłej.
źródło
Ruby 1166 znaków
Edycja: Zaktualizowano dla poprawnego formatu wyjściowego
Działa konsekwentnie w czasie poniżej 0,2 sekundy na MBP i5.
Źródło: View On Github
Jednowarstwowy:
Wyściełane nowymi liniami, aby pasowały do strony:
Wyjścia:
Kod niepoznany
Wyjścia:
Zastosowanie
shuffle
w początkowej konfiguracji zapewnia za każdym razem unikalne ścieżki rozwiązania. Widać to po liczbie prób zmiany między uruchomieniami. Ogranicza to potrzebę oddzielnego wprowadzania danych wejściowych, choć zmiana kodu w tym celu byłaby trywialna.źródło