Zakładając, że A = 1, B = 2 ... Z = 26, a wartość słowa jest sumą tych wartości literowych, możliwe jest podzielenie niektórych słów na dwie części, tak aby miały one równe wartości.
Na przykład, „wordsplit” można podzielić na dwie części, takie jak: ordsl wpit, ponieważ o + r + d + s + l = w + p + i + t.
Było to wyzwanie postawione nam przez mojego nauczyciela informatyki - to najwyraźniej stare wyzwanie Lionhead Studios. Rozwiązałem go w Pythonie i wkrótce opublikuję moją odpowiedź.
Wyzwanie: Najkrótszy program, który może wymienić wszystkie możliwe podziały, które mają równe wyniki. Zauważ, że musi zawierać tylko jeden dla każdej grupy liter - na przykład ordsl wpit jest taki sam, jak rdosl wtip. Łatwiej jest je wymienić w kolejności, w jakiej występują w słowie.
Premia:
- Jeśli zaznaczysz pary, w których oba słowa są poprawnymi słowami angielskimi (lub pewna permutacja liter), użyj jakiejś listy słów. (Można to zrobić, umieszczając gwiazdkę obok każdej innej metody, ale wyjaśnij to.)
- Dodanie opcji usuwania duplikatów (nie powinno to być domyślne).
- Obsługuje więcej niż dwa podziały, na przykład trzy, cztery lub nawet n-kierunkowe.
Odpowiedzi:
Perl, 115
118123Uruchom z
perl -nE '<code goes here>'
. To „n” jest liczone w rozmiarze kodu.Odpowiedzi:
Z komentarzami i nazwami zmiennych:
Niektóre z zastosowanych sztuczek:
1..1<<@_
obejmuje ten sam zakres bitów co0..(1<<@_)-1
, ale jest krótszy. (zauważ, że rozważanie problemu z większej odległości, w tym wielokrotne granice zasięgu i tak nie spowodowałoby błędnego wyniku)64-ord$_[$_]
zamiast dodawaniaord$_[$_]-64
wygrywa niewidzialny znak: ponieważ kończy się na separatorze, czyni to miejsce przedfor
zbędnym.cond ? var1 : var2 = new_value
.&&
i||
są używane zamiast odpowiednich warunków warunkowych.$l-$r
jest krótszy niż$l!=$r
źródło
J (109)
Dane wyjściowe dla
wordsplit
:Wyjaśnienie:
1!:1[1
: przeczytaj wiersz ze standardowego wejścia([{~(i.@!A.i.)@#)
: uzyskaj wszystkie permutacje"1
: dla każdej permutacji:(96-~a.&i.)
: uzyskaj wyniki dla liter}.@(split~&.>i.@#@>)@<
: podziel każdą permutację wyników na każdej możliwej przestrzeni, z wyjątkiem przed pierwszą i po ostatniej liczbie>(>@(=/@:(+/"1&>)&.>)#[)
: sprawdź, które kombinacje mają pasujące połówki, i wybierz je{&a.@(96&+)&.>
: zamień wyniki z powrotem na litery~.(/:{[)
: usuń trywialne odmiany (np.ordsl wpit
iordsl wpti
)źródło
{a,bc}
już została znaleziona, do usunięcia,{a,cb}
ale nie do usunięcia{bc,a}
. (I oczywiście nie obrażam się, gdybym faktycznie / miał / zduplikował czyjąś odpowiedź, wolałbym ją, gdyby ktoś to zauważył.)c99 - 379 niezbędnych znaków
Podejście jest dość oczywiste. Istnieje funkcja, która sumuje słowa według maski i ta, która drukuje je również według maski. Wejście ze standardowego wejścia. Jedną z osobliwości jest to, że procedura drukowania wstawia spacje na litery, które nie znajdują się w masce. Do oddzielenia grup służy karta.
Nie robię żadnego z przedmiotów bonusowych, ani nie jest łatwo przekonwertować je na wsparcie.
Czytelne i skomentowane:
Uprawomocnienie
źródło
Ruby: 125 znaków
Przykładowy przebieg:
źródło
Mathematica
123111Wyszukuje wszystkie podzbiory słowa, które mają 1/2 „Total ASCII” wyrazu
d
. Następnie znajduje uzupełnienia tych podzbiorów.d = „WORDSPLIT”
źródło
J, 66 znaków
Za pomocą cyfr liczb base2 wybierz każdy możliwy podzbiór.
źródło
Moje rozwiązanie jest poniżej. Jego rozmiar jest prawie anty-golfowy, ale działa bardzo dobrze. Obsługuje podział n-kierunkowy (chociaż czas obliczeniowy staje się bardzo długi dla więcej niż około 3 podziałów) i obsługuje usuwanie duplikatów.
Przykładowe dane wyjściowe:
źródło
Lua - 195
dane wejściowe muszą być pisane wielkimi literami:
źródło
Python - 127
a tutaj wersja n-split ze 182 bajtami bez duplikatów:
Dane wejściowe to np .:
źródło