Ciekawa łamigłówka przyszła mi dziś rano, patrząc na przyciski windy.
Musisz wygenerować listę wszystkich wzorów brajlowskich pasujących do siatki 2x3. Użyj skrótu, #
aby oznaczyć wypukłość, a łącznika, -
aby oznaczyć płaski obszar.
Oczekiwana próbka wyjściowa:
#-
--
--
##
--
--
#-
#-
--
(and so on...)
Zasady:
- Twój program musi oddzielić każdy wzór co najmniej jednym znakiem lub linią.
- Wzory mogą być generowane w dowolnej kolejności.
- Wszystkie wzory, niezależnie od tego, czego faktycznie używa alfabet Braille'a, powinny zostać wyprodukowane. Całkowicie pusty wzór jest opcjonalny.
- Należy generować tylko unikalne wzorce wypukłości. Następujące wzory są uważane za równoważne, ponieważ guzy mają identyczny układ. W takich przypadkach użyj wzoru znajdującego się najbliżej lewego górnego rogu (tj. Pierwszej opcji w tym przykładzie).
#- -# -- --
#- -# #- -#
-- -- #- -#
Dodatkowe punkty, jeśli można zrobić to praca dla każdego x przez y wielkości siatki. ( EDYCJA: W rozsądnych granicach. Do potwierdzenia koncepcji wystarcza 4x4).
Po przeczytaniu artykułu na wiki okazuje się, że jest 45 wzorów (w tym pustych), które spełniają zasady tej układanki.
code-golf
combinatorics
Hand-E-Food
źródło
źródło
x
xy
generujesz pierwsze2^(xy)
liczby i odfiltrowujesz te, które maskują do 0 przed2^x - 1
lub(2^(xy+1) - 1)/(2^y - 1)
.Odpowiedzi:
GolfScript,
3432 znakiOkazuje się, że nie są krótsze niż tylko generowanie rozwiązania wszystkich 64 wzorów i odfiltrowanie tych złych. W rzeczywistości, poprzez odpowiednie mapowanie bitów na pozycje siatki, możliwe jest mapowanie wszystkich prawidłowych (niepustych) wzorów na kolejny zakres liczb, tak jak robi to ten program.
W szczególności używam mapowania:
gdzie liczby oznaczają pozycję bitu (zaczynając od najmniej znaczącego bitu
0
) zmapowaną do tej pozycji w siatce. Przy takim mapowaniu prawidłowe siatki odpowiadają liczbom od 20 do 63 włącznie.Jest to prawie to samo, co oczywiste mapowanie uzyskane przez zapisanie 6-bitowej liczby w systemie binarnym i dodanie przerw między wierszami między co drugim bitem, z wyjątkiem tego, że bity
1
i2
są zamieniane - i tak właśnie oblicza to mój program. (Dodaję również 64 do liczb przed konwersją ich na binarne, a następnie usuwam bardzo wysoki bit; to po prostu zerowanie liczb do 6 bitów, ponieważ wbase
przeciwnym razie GolfScript nie zwróciłby żadnych zer wiodących.)Ps. Demo online tutaj. (Serwer wydaje się ostatnio przeciążony; jeśli masz limit czasu, spróbuj ponownie lub pobierz interpreter i przetestuj go lokalnie).
Edycja: Udało się zaoszczędzić dwa znaki, unikając niepotrzebnego budowania i zrzutu tablicy. Uff!
źródło
Mathematica 97
Puste nie jest wliczone:
NB! = To pojedynczy znak w Mathematica.
źródło
C # - 205
Wersja do odczytu:
źródło
Perl,
716765 charKonwertuj int na binarne, wykonuj transliterację i dodawaj nowy wiersz po każdych dwóch znakach.
/^#/m
Testu eliminuje dwa wzory (20 i 21), które nie mają podniesioną gulę w skrajnej lewej kolumnie.Ogólne rozwiązanie,
150106103100 charCzytaj
x
iy
z argumentów wiersza poleceń. Nowe linie są znacząceIteruj ponad 0..2 xy jak poprzednio, konwertując każdą int na binarną, podstawiając
-
i#
dla0
i1
oraz wstawiając nowy wiersz po każdym$x
znaku./^#/m
sprawdza, czy w lewej kolumnie znajduje się wypukły guz, i/^.*#/
czy w górnym rzędzie jest wypukły guz. Drukowane są tylko wzory, które przejdą oba testy.źródło
Pyton,
12011811395118Edycja: wykorzystano sugestię Winstona Ewerta i dodano rozwiązanie siatki x by y
Edycja: Jakoś przegapiłem ostatnie ograniczenie dotyczące wyjątkowości. Ten skrypt generuje wszystkie możliwe sekwencje, nie tylko 45.
Edycja: kopia zapasowa do 118, ale teraz poprawna
źródło
['#','-']
z'#-'
J,
3533 znakówWykorzystuje podejście, które wymyślił Ilmari Karonen w swoim rozwiązaniu Golfscript. Ponieważ jednak czasownik J
#:
(antiase) przechowuje bity (lub, no cóż, cyfry w ogólnym przypadku) na liście, musimy zindeksować je od lewej zamiast od prawej (tzn. Indeks 0 jest skrajnie lewy, najwyższy bit).Rozwiązanie jest dość proste:
20+i.44
podaje listę liczb20..63
, włącznie.#:
pobiera antiase-2 każdego elementu z tej listy, a tym samym tworzy listę wzorów bitów dla każdej liczby w tym zakresie.{
wybiera (zasadniczo zmienia kolejność) bitów na odpowiedni wzorzec, a następnie{
jest ponownie używany, aby użyć cyfr jako wskaźników w ciągu „- #” w celu przygotowania wyniku. Na koniec umieszczamy każde wejście w prostokącie 2 na 3 o$
(kształcie).źródło
(0 2 3 ,. 1 4 5) { #: 44
można ulepszyć coś podobnego do pracy z listą liczb, a nie z pojedynczą liczbą? Prawdopodobnie ogoliłbym jeszcze kilka znaków.Python -
121112puste miejsce nie jest wliczone
źródło
'_#',repeat=6
->*['_#']*6
b
jest już krotką, więc nie trzeba jej konwertować :)