Kolejny problem związany z naszym wewnętrznym golfem ... tym wokół wakacji w zeszłym roku.
PROBLEM
Andy, Barb, Carl, Didi, Earl i Fran kupują sobie prezenty. Narysuj nazwy do wymiany prezentów.
- Każda osoba kupuje jeden prezent i otrzymuje jeden prezent.
- Nikt nie kupuje własnego prezentu.
- Wielokrotne uruchomienie rozwiązania powinno dawać różne wyniki (para odbiorca-odbiornik nie powinna być przewidywalna ani identyczna dla poszczególnych uruchomień).
WEJŚCIE
Żaden.
WYNIK
Sformatowany jak w tym przykładzie:
Andy kupuje dla Barb
Barb kupuje dla Carl
Carl kupuje dla Didi
Didi kupuje dla Earl
Earl kupuje dla Fran
Fran kupuje dla Andy
Odpowiedzi:
J, 57
na przykład
źródło
c99 - 252 znaków
Niewielka poprawa dzięki wykorzystaniu okrągłego charakteru permutacji. Ta wersja zawsze buduje strategię kupowania podobną do pętli, więc jest mniej losowa niż poprzednia wersja (271 znaków), ale wierzę, że nadal spełnia specyfikację.
Wymaga platformy, która ma sprawny
/dev/random
. Powinienem być w stanie zrzucić około 8, pomijając literę\0
s w dużym łańcuchu, ale moja biblioteka nie wydaje się zajmować%4s
specyfikacjami drukowania tak, jak mówi strona podręcznika.Losowanie jest złe, ale robienie tego w ten sposób zapobiega sprawdzaniu warunków „Foo kupuje za Foo” .
Czytelny:
źródło
Windows PowerShell, 83
Historia:
$i
będzie za każdym razem odtwarzany.$_
do sznurka, aby zapisać+
.źródło
Haskell,
241189 znakówW pełni losowe wyjście (które nadal spełnia specyfikację).
To generuje wszystkie permutacje z listy nazwisk, wybiera jedną losowo (myślę, że jest to najkrótsza droga w Haskell do przetasowania listy - jeśli ktoś ma coś mniejszego, doceniłbym to), a następnie każda osoba kupuje obecny dla następnej osoby na liście.
źródło
permutations$words"Andy Barb Carl Didi Earl Fran"
i kilka innych sztuczek, które wypróbowałem w ulepszonej wersji. Zapomniałem, żepermutations
nie ma go w 98List
, więc musisz użyć długiej nazwy. Spójrz na to.r=tail.cycle
. i niż wstawić to.main=randomRIO(0,719)>>=mapM_ putStrLn.f
Golfscript:
72 6457 znakówTesty
"AndyBarbCarlDidiEarlFran"4/
, zaktualizowałem i dostałem 7 znaków mniej;9rand
jest bardziej losowe niż moje6rand*
źródło
"AndyBarbCarlDidiEarlFran"4/
6rand*
-0=rand
a może;9rand
lepiej. Pętla{.n+\' buys for '}%(
jest krótsza.6rand*
ponieważ myślałem, że równomiernie losuje tablicę 6 elementów (myślę, że się myliłem, ponieważ;9rand
wygląda naprawdę losowo niż mój)Japt -R, 41 bajtów
-2 bajty dzięki @Oliver!
Spróbuj!
Takie podejście przyjęłam na wysokim poziomie:
Mam trochę historii z tym problemem, ponieważ wiele lat temu stworzyłem program „tajnego Świętego Mikołaja” dla mojej pracy. Skończyło się też na tym, że poprosiliśmy kilku kandydatów do pracy :)
źródło
ã
to, że nie zwraca pary, która łączy pierwszy z ostatnim elementem. Pracuję nad sposobem, aby to zadziałało, ale pomyślałem, że dam ci znać. Jeszcze raz dziękuję! ethproductions.github.io/japt/…"q"
in-.ö("q")
doPython - 118 znaków
Python - 120 znaków
źródło
R - 85 znaków
źródło
Python - 154 znaków
źródło
map
wywołujestr.__eq__
każdą parę odpowiednich wartości w L i M, a pętla działa, dopóki żadna z nich nie jest prawdziwa.D: 233 znaków
Bardziej czytelnie:
źródło
Python (175)
źródło
Schemat, 173
Daje jedno z dwóch rozwiązań.
źródło
C #,
210183 znakówSterty płyty kotłowej :(
To rozwiązanie nie jest całkowicie losowe - zawsze istnieje jedna lub więcej „pętli” ludzi, np. A-> C-> E-> A, a przesunięcia są zawsze takie same w pętlach. Jednak nie można przewidzieć wyniku określonego przebiegu, chyba że masz jego część.
źródło
var n="Andy Barb Carl Didi Earl Fran".Split()
? Oszczędza 16 bajtów. Możesz pominąć argumentMain()
, który oszczędza kolejne 9 bajtów. Możesz połączyć deklaracjęc
ii
:int c,i=...;for(c=0;...
co oszczędza kolejne dwa.Rubin - 89 znaków
Wynik:
źródło
map
zamiasteach
.MathGolf , 41 bajtów
Wypróbuj online!
Wyjaśnienie
Nie gwarantuje się, że każdy przypadek zostanie wygenerowany z jednakowym prawdopodobieństwem, ale daje różne wyniki dla każdego przebiegu. Jeden bajt mógłby zostać usunięty, gdybym miał operatora tasowania, ale to na inny dzień.
źródło