Moja córka miała zadanie domowe z matematyki. Wyobraź sobie sześciu przyjaciół żyjących na linii o nazwach E, F, G, H, J i K. Ich pozycje na linii są takie, jak wskazano (nie w skali) poniżej:
Zatem F mieszka pięć jednostek z E i dwie jednostki z G i tak dalej.
Twoje zadanie: stworzyć program, który identyfikuje ścieżkę, która odwiedza każdego przyjaciela dokładnie raz, o całkowitej długości n jednostek, przyjmując lokalizacje znajomych i n jako dane wejściowe. Powinien zgłosić ścieżkę, jeśli ją znajdzie (na przykład dla długości 17 może zgłosić „E, F, G, H, J, K” i powinien wyjść z gracją, jeśli nie ma rozwiązania. Dla tego, co jest warte, ukończyłem nierozwiązane rozwiązanie w Mathematica w 271 bajtach. Podejrzewam, że jest to o wiele bardziej zwięzłe.
źródło
[0, 5, 7, 13, 16, 17]
I62
), abyś mógł upewnić się, że nie jest specjalnie zakodowany w tym przypadku."[0, 5, 7, 13, 16, 17], 62"
lub wyjściowe są"(7, 16, 0, 17, 5, 13)"
prawidłowe?Odpowiedzi:
J, 54 bajty
Wyprowadza jedną poprawną trasę. Jeśli żadna trasa nie istnieje, nic nie wyprowadza.
52-bajtowy kod, który wyprowadza wszystkie trasy (jedna na linię):
38-bajtowy kod, który wyświetla pozycje zamiast liter:
źródło
Mathematica, 55 lub 90 bajtów
Mathematica powiedziałeś? ;)
Jest to anonimowa funkcja, która najpierw przyjmuje pozycje znajomych (w dowolnej kolejności), a następnie długość docelową. Zwraca
Missing[NotFound]
, jeśli taka ścieżka nie istnieje.Mogę zapisać cztery bajty, jeśli dozwolone jest zwrócenie wszystkich prawidłowych ścieżek (
FirstCase
->Cases
).Zwracanie tablicy ciągów jest nieco bardziej kłopotliwe:
źródło
Z
będzie kontynuować z następnymi znakami ASCII (nie że i tak chcesz uruchomić mój kod dla n> 20: D).Python 2,
154148 bajtów(lub 118 bajtów dla rozwiązania ogólnego)
Ten program akceptuje linię z listą i liczbą całkowitą taką jak „[0, 5, 7, 13, 16, 17], n” na standardowym wyjściu i wypisuje ścieżkę na wyjściu o długości n lub nic, jeśli jest to niemożliwe.
Pisanie małych programów w Pythonie, które wymagają permutacji, jest trudne. Ten import i użycie jest bardzo kosztowne.
Źródło wymagania OP przed minifikatorem:
Ogólne rozwiązanie (nie zminimalizowane):
Ze względu na prosty algorytm i ogromną liczbę kombinacji wykonanie dla ponad 20 pozycji początkowych będzie bardzo wolne.
źródło
from itertools import*
. Także Python 3 może być krótszyinput()
i*a,c=map(...)
jeśli może współpracować z resztą twojego programu.chr(a.index(n)+69)
?J (48 lub 65)
Podejrzewam, że można pograć w golfa o wiele więcej. Możesz to wykorzystać jako punkt wyjścia do dalszej gry w golfa
Lub z literami:
Co to robi:
(Mam nadzieję, że ten format I / O jest w porządku ...)
Jak to robi:
Generuje wszystkie permutacje danych wejściowych
Oblicza odległość
Widzi, które wyniki są takie same jak dane wejściowe, i ponownie generuje te permutacje (podejrzewam, że niektóre znaki można tutaj zgolić)
Z literami:
Utwórz listę pierwszych n liter, gdzie n jest długością listy wprowadzania
robi to samo co powyżej
źródło
Oktawa, 73
Naprawdę nie ma takiej gry w golfa, więc pozwól mi wyjaśnić ... od wewnątrz do zewnątrz, permutujemy wszystkie odległości, a następnie dla każdej permutacji bierzemy różnice między domami, przyjmujemy wartość bezwzględną jako odległość, dodajemy je w górę, znajdź indeks pierwszej permutacji z żądaną odległością i permutuj litery i znajdź tę konkretną permutację liter.
czyli 13-0-16-5-17-7 => 13 + 16 + 11 + 12 + 10 = 62.
(puste dla niemożliwych danych wejściowych)
źródło
perms()
w Octave 3.6.2 na ideone.com występują problemy z wektorem ciągów.Matlab (86)
Przykład, w którym istnieje rozwiązanie:
Przykład, w którym rozwiązanie nie istnieje:
Matlab (62)
Jeśli format wyjściowy można złagodzić , tworząc pozycje zamiast liter i tworząc pustą macierz, jeśli nie ma rozwiązania:
Przykład, w którym istnieje rozwiązanie:
Przykład, w którym rozwiązanie nie istnieje:
Matlab (54)
Jeśli program może podać wszystkie prawidłowe ścieżki :
Przykład, w którym istnieje rozwiązanie:
źródło
Haskell, 109 bajtów
Przykład użycia:
17 # [0, 5, 7, 13, 16, 17]
który wyprowadza wszystkie prawidłowe ścieżki, tj["EFGHIJ","JIHGFE"]
. Jeśli nie ma prawidłowej ścieżki,[]
zwracana jest pusta lista .Lista listów zawiera
I
(mam nadzieję, że w porządku).Jak to działa: utwórz listę
(name, position)
par, permutuj i weź te, w których długość ścieżki jest równa,n
i usuń część pozycji.źródło