Oto puzzle programowania dla Ciebie:
Biorąc na przykład listę par ciągów znaków i odpowiadających im liczb, [[A,37],[B,27],[C,21],[D,11],[E,10],[F,9],[G,3],[H,2]]
wypisz inną listę, która będzie miała tylko ciągi znaków w następujący sposób:
Całkowita liczba dowolnego łańcucha powinna być dokładnie równa odpowiadającej mu liczbie w danych wejściowych.
Żaden ciąg nie powinien być powtarzany w sekwencji obok siebie, a każdy ciąg powinien pojawiać się na liście wyników.
Wyboru następnego ciągu należy dokonać losowo, o ile nie przekroczą one dwóch reguł. Każde rozwiązanie powinno mieć niezerowe prawdopodobieństwo wyboru.
Jeśli żadna kombinacja nie jest możliwa, wynik powinien być sprawiedliwy
0
.
Lista wejściowa może być podana w dowolnej kolejności (posortowana lub nieposortowana), a ciągi na liście mogą mieć dowolną długość.
Przykładowy wynik dla powyższego przykładowego wejścia 1
[A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,G,H,G,H,G]
Próbka wejściowa 2:
[[A,6],[B,1],[C,1]]
Wyjście dla drugiego wejścia:
0
ponieważ żadna lista nie jest możliwa na podstawie reguł.
Przykładowe wejście 3:
[[AC,3],[BD,2]]
prawidłowe wyjście: [AC,BD,AC,BD,AC]
nieprawidłowe wyjście: [AC,BD,AC,AC,BD]
Jeśli potrzebne są dalsze wyjaśnienia, proszę nie wahaj się powiedzieć mi w komentarzach, a niezwłocznie podejmę odpowiednie działania.
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach dla każdego języka!
Odpowiedzi:
Galaretka , 11 bajtów
Wypróbuj online!
źródło
Œṙ
nie było wektoryzacji, działałoby bez niego'
Galaretka , 17 bajtów
Wypróbuj online!
źródło
["A", 100], ["B", 3]
że kiedy próbuję , nic nie wychodzi.Œ!
będzie miał 99029007164861804075467152545817733490901658221144924830052805546998766658416222832141441073883538492653516385977292093222882134415149891584000000000000000000.O(n!)
krótkie, ale szybkość nie ma znaczenia. Nie próbuj tego z niczym, gdy liczby sumują się do więcej niż około 6-8 lub mniej więcej: PŒṙ
pomóc?["AT", 3], ["B", 3]
i dostałemTBATATBAB
jako wyjście, co jest złePython 2 ,
114189185174 bajtówWypróbuj online!
Auć! Znacznie trudniej z zasadą 3 ... :). Wciąż próbuję uniknąć
O(n!)
podejścia, aby mógł obsłużyć wszystkie przypadki testowe przed śmiercią wszechświata przed upałem ...Algorytm: załóżmy, że całkowita suma ciągów znaków wynosi
t
. Jeśli dowolny ciąg ma liczyćn
z2*n>t+1
, to nie jest możliwe do spełnienia ograniczeń. Dlatego też, jeśli dowolny ciąg znaków (z wyłączeniem wcześniej wybrańca) musi liczyćn
się2*n=t+1
, to musimy wybrać ten ciąg obok. W przeciwnym razie możemy wybrać losowo dowolny ciąg, który nie jest wcześniej wybranym ciągiem.źródło
R ,
148141 bajtówWypróbuj online! (Skopiowałem
combinat::permn
i nazwałem tocombinatXXpermn
tam.)Rozwiązanie Brute Force O (n!).
Korzysta
permn
zcombinat
pakietu, aby wygenerować wszystkie możliwe uporządkowania. Następnie sprawdza, czy ktoś przestrzega zasad, i wybiera jedną z nich losowo.źródło
n<-sum(n|1)
to chyba bajt krótszy. Ale dziwactwosample
z wprowadzeniem długości jednego jest tutaj dość frustrujące.JavaScript, 112 bajtów
Pierwsze przejście, więcej golfa do (miejmy nadzieję).
Wypróbuj online
źródło
J,
6053 bajtów-7 dzięki FrownyFrog
oryginalny
bez golfa
Sugestie dotyczące ulepszeń mile widziane.
Wypróbuj online!
źródło
[:*/2~:/\|:
jest dwa razy krótszyJavaScript (ES6), 160 bajtów
Wypróbuj online!
źródło
Węgiel drzewny , 38 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Powtarzaj, dopóki jest co najmniej jedna niezerowa liczba.
Znajdź dowolną liczbę, która stanowi ponad połowę pozostałej części.
Jeśli nie było, po prostu weź niezerowe liczby przefiltrowane wcześniej.
Odfiltruj ciąg, który został wyprowadzony ostatnim razem.
Przypisz losowy element z pierwszego niepustego z powyższych dwóch list do ostatniego ciągu wyjściowego. Zauważ, że jeśli zostanie wprowadzona niemożliwa kombinacja, program zawiesi się w tym momencie.
Wydrukuj ciąg.
Zmniejsz jego liczbę.
źródło
["h4x0r", 1337]
dołączonym jako ciąg.Rubin , 85 bajtów
Podejście brutalnej siły (dzięki Jonasz za pomysł).
Wypróbuj online!
Ruby ,
108 10096 bajtówWcześniej podejście Bogosort
Wypróbuj online!
źródło
Rdza 633 bajtów
To, co czyni to trochę innym niż pozostałe, to fakt, że zaczął się od pomysłu na zmianę kolejności ciągów poprzez symulację układu fizycznego. Każdy ciąg jest najpierw duplikowany odpowiednią liczbę razy. Następnie każdy pojedynczy ciąg znaków jest traktowany jako cząstka w przestrzeni. Dwie cząstki o tej samej wartości łańcucha „odpychają się”, a dwie cząstki o różnych wartościach przyciągają się. Na przykład, jeśli zaczniemy od AAAAAAABBBBCC, As zniesie się nawzajem, oddalając się od siebie, umożliwiając Bs przemieszczanie się między nimi. Z czasem osiąga to przyjemną mieszankę cząstek. Po każdej iteracji „ruchu cząstek” program sprawdza, czy żadne cząstki nie sąsiadują ze sobą, a następnie zatrzymuje się i drukuje stan układu, który jest po prostu listą łańcuchów w kolejności, tak jak pojawiają się w przestrzeni 1-wymiarowej.
Teraz, jeśli chodzi o rzeczywiste wdrożenie tego systemu fizycznego, zaczęło się od użycia staroświeckiej techniki demonstracyjnej / gry na PC, aby zapisać pozycję i prędkość każdej cząstki jako liczby, a następnie przejść przez iteracje, aby zaktualizować pozycję i prędkość. Przy każdej iteracji dodajemy prędkość do pozycji (ruch) i dodajemy przyspieszenie do prędkości (zmiana prędkości ruchu) i obliczamy przyspieszenie (znalezienie siły na cząsteczce). Aby uprościć, system nie oblicza siły na każdą cząsteczkę na podstawie wszystkich innych cząstek - sprawdza tylko cząstki bezpośrednio sąsiadujące. Był także efekt „tłumienia”, dzięki czemu cząstki nie przyspieszałyby zbytnio i nie odlatowały do nieskończoności (na przykład prędkość jest zmniejszana o x procent z każdym krokiem).
Jednak w trakcie gry w golfa cała ta sprawa została zredukowana i drastycznie uproszczona. Teraz zamiast dwóch podobnych sobie cząstek odpychających się, po prostu „teleportują się”. Różne cząstki po prostu „odrobinę” skracają, aby zapobiec stagnacji w systemie. Na przykład, jeśli A znajduje się obok A, teleportuje się. Jeśli A znajduje się obok B, tylko nieznacznie się przesunie. Następnie sprawdza, czy warunki są spełnione (żadnych sąsiadujących cząstek) i drukuje ciągi w kolejności, na podstawie ich położenia w przestrzeni 1-d. Jest to prawie bardziej algorytm sortowania niż symulacja - z drugiej strony algorytmy sortowania można postrzegać jako formę symulowanego „dryfowania” opartego na „masie”. Robię dygresję.
Tak czy inaczej, jest to jeden z moich pierwszych programów Rust, więc zrezygnowałem po kilku godzinach gry w golfa, choć wciąż mogą tam być możliwości. Bit przetwarzania jest dla mnie trudny. Odczytuje ciąg wejściowy ze standardowego wejścia. W razie potrzeby można to zastąpić słowem „let mut s =” [[A, 3], [B, 2]] ”. Ale teraz„ echo [[A, 3], [B, 2]] | cargo run ”w wierszu poleceń.
Obliczenie zatrzymania jest trochę problemem. Jak wykryć, czy prawidłowy stan systemu nigdy nie zostanie osiągnięty? Pierwszym planem było wykrycie, czy „bieżący” stan kiedykolwiek powtórzył stary stan, na przykład, jeśli ACCC zmieni się na CACC, ale potem z powrotem na ACCC, wiemy, że program nigdy się nie zakończy, ponieważ jest tylko pseudolosowy. Następnie powinien się poddać i wydrukować 0, jeśli tak się stanie. Wydawało się to jednak ogromną ilością kodu Rust, więc zamiast tego zdecydowałem, że jeśli przejdzie przez dużą liczbę iteracji, prawdopodobnie utknie i nigdy nie osiągnie stanu ustalonego, więc wypisuje 0 i zatrzymuje się. Ile? Liczba cząstek podniesiona do kwadratu.
Kod:
źródło
regex
JavaScript (Node.js) , 249 bajtów
Wypróbuj online!
źródło
Java (JDK 10) , 191 bajtów
Wypróbuj online!
To nigdy nie powraca, jeśli nie ma rozwiązań.
źródło