Twoim celem jest napisanie kodera semaforów flag , który przekształci dane zdanie w odpowiednie znaki semaforów flag, zgodnie z systemem semaforów opisanym na Wikipedii .
Załóżmy, że dane wejściowe są pojedynczym zdaniem podanym przez stdin (lub odpowiednik). Twój wynik powinien składać się z szeregu znaków semaforów, przy czym każdy wiersz reprezentuje jedno słowo z zdania. Musisz tylko radzić sobie z alfabetem (AZ) i powinieneś ignorować wszystkie inne znaki spacji, ale musisz umieć obsługiwać zarówno wielkie, jak i małe litery. Twoje dane wyjściowe mogą zawierać dodatkowe białe znaki.
Znaki semafora muszą być wyświetlane jako kwadrat 3 x 3, z O
pośrodkiem i pozycjami flagi reprezentowanymi przez znaki | - / \
. Każdy znak semafora musi być oddzielony od sąsiednich znaków spacją, a każdy wiersz musi być oddzielony pustą linią. Nie przejmuj się zawijaniem słów, które mogą być zbyt długie dla twojego wyświetlacza - udawaj, że twoje linie mają nieskończoną długość.
Przykładowe dane wejściowe:
abcdefg hijklmn opqrstu vwxyz
Przykładowe dane wyjściowe:
\ | /
O -O O O O O- O
/| | | | | | |\
\ | | /
-O O O- O O O- O
/ / / / / / \
\ | / \| \ /
-O -O -O -O- -O O O
\
| / / \
O O- O O- O-
\ \ \
Przykładowe dane wejściowe:
This is Code Golf.
Przykładowe dane wyjściowe:
\| \
O -O O -O
/ / \
\
O -O
/ \
\ \ | /
O -O O O
| | |
\ /
O -O O O-
|\ / |
Ponieważ jest to gra w golfa , wygrywa najkrótsze rozwiązanie.
and each row must be separated by a blank line
=> każde słowo ma na myśli, prawda?Odpowiedzi:
Perl,
282264251247245243241240236233229227220218216214 znakówZ pewnymi upiększającymi podziałami linii:
Zajęło mi trochę czasu, aby to zadziałało (moja pierwsza próba odpowiedzi na Perla). Opiera się na podobnym pomyśle do wielu innych odpowiedzi. Każda flaga może znajdować się w jednej z 8 pozycji, są dwie flagi, a dwie flagi nigdy nie mogą być w tej samej pozycji. Oznacza to, że mogę zakodować pozycję obu flag w jednym bajcie - co oznacza również, że mogę tłumaczyć bezpośrednio ze znaku na jego kodowanie za pomocą
y///
funkcji Perla (operator?). Więc:-W związku z tym:
Uciekłem sporej liczbie znaków spoza normalnie używanego zakresu, aby ułatwić kopiowanie i wklejanie programu - ale jestem całkiem pewien, że mógłbym napisać program, który zastąpiłby kody ucieczki samymi zapisującymi mnie znakami około 30 znaków.
źródło
Python,
244238233232Wykorzystuje to moją ulubioną sztuczkę: kodowanie jednościeżkowe. Oznaczyłem bity semafora (sbits)
aby uzyskać następującą tabelę, które sekwencje występują dla której litery:
każda litera występuje dokładnie dwa razy na mapie, ponieważ sygnalizator ma dwa ramiona. Następnie widzę to jako wykres na literach az, z krawędziami między literami dzielącymi fragmenty, z krawędziami oznaczonymi zgodnie ze wspólnym bitem. Idealnie byłoby znaleźć ścieżkę Hamiltona przez ten wykres, tak aby kolejne krawędzie nie miały tej samej etykiety. Nie ma takich ścieżek ... więc zauważysz, że zmienna
e
zawiera literęb
dwa razy.Na mojej ścieżce prawie Hamiltona
e
konstruuję tablicęd
etykiet sbit używanych podczas przechodzeniae
. Następnie, aby dowiedzieć się, gdzie położyć ręce, sygnalizator musi znaleźć tylko pożądaną literę na poniższej poręcznej tabeliskąd jej ramiona idą w pozycję bezpośrednio poniżej, a także poniżej i na prawo od litery.
źródło
to_lower()
sięlower()
. Ponadto wystąpił błąd, gdy próbowałem podać dane niealfabetyczne.Scala, 272 znaków
Nie golfowy (no, mniej golfowy):
źródło
Ruby, 287 znaków
Dane wejściowe należy podać na STDIN.
źródło
Scala
494 bez nowych linii520 z nowymi liniami:bez golfa:
Wyjaśnienie:
Obserwowałem wzorzec zegara, ale nie z 12 godzinami, ale 8. A Starttime wynosi 0, gdzie jest godzina 6, a a, b, c są pierwszymi kodami, z pierwszą (jedną) flagą na południu.
Ponieważ flagi 1 i 2 są nierozróżnialne, możemy najpierw sortować wszystkie kombinacje z niższą liczbą dla pierwszej flagi. Niestety porządek od początku jest zakłócany, gdy j nie podąża za i, ale k, l, m, a później robi się bałagan.
Dlatego zmieniam układ klawiszy na mapowanie:
Jeśli odejmiemy „a” od każdego znaku, otrzymamy liczby od (0 do 7 + 6 + 5 + ... + 1). Możemy zmapować numery siatki znaków
Para dwóch liczb może odwzorować dwie flagi, gdzie pierwsza liczba jest indeksem od 0 do 6 dla pierwszej flagi, a druga flaga nie jest liczbą od 1 do 7 dla drugiej flagi, ale dla odległości od pierwsza do drugiej flagi. (2,2) oznaczałoby, że pierwsza flaga jest na zachód, a druga to dwa kroki stamtąd zgodnie z ruchem wskazówek zegara, do PÓŁNOCNEJ.
źródło
object Main extends Application
blok, ale to nie wydaje się wystarczające.readLine
w ostatnim wierszu"readLine"
, powinien on działać (kod jest zgodny z 2.8).Haskell
331357339 znakówGra w golfa:
Nie golfowany:
Kodowanie polega na tym,
[hour, minute]
że zegary mają 8 godzin i 8 minut. Minuty poruszają się szybciej niż godziny. Jeśli zegar tyka, gdy godzina i minuta byłyby równe, dodaj 1 do godziny i 2 do minuty (patrz drugi przykład zaznaczenia powyżej). To jedyny sposób na zwiększenie godzin. Godziny NIE rosną, gdy minuta osiągnie dowolną minutę. Tylko wtedy, gdy minuty będą równe godzinom. W kodzie bez golfaclock
zamienia litery w zegary reprezentujące semafor. Większość zegarów jest zbudowana na podstawie tykania z poprzednich. Reszta jest na stałe zakodowana. W kodzie nie ma nic więcej.źródło
Perl,
356, 275 znakówZapisano dużą liczbę znaków, zastępując „jeśli jeszcze” na „? : „konstrukcja.
źródło
<>
zamiast$ARGV[0]
, możesz pobrać dane wejściowe ze standardowego wejścia i użyćlc
do konwersji wszystkich znaków na małe litery. Ma to dodatkową zaletę polegającą na oszczędzeniu 4 znaków. Nie obsługuje też znaków innych niż alfabet, ale zapewneYou only need to deal with the alphabet (A-Z) and should ignore all other non-space characters
nie jest jasne, co z nimi zrobić ...PowerShell ,
198192191188 bajtówWypróbuj online!
Dane wyjściowe zawierają jeden pusty wiersz ogona.
Mniej golfa:
źródło
Węgiel drzewny , 70 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Podziel małe litery na spacje i zapętlaj każde słowo.
Pętla nad każdą postacią.
Podziel skompresowany ciąg znaków
fjmrwyz gnsvxz abcdefg ahiklmn bhopqrs ciotuy djkptv elquwx
na spacje i zapętlaj każdą grupę liter.Jeśli grupa zawiera bieżącą literę, narysuj linię w bieżącym kierunku.
Obróć o 45 ° w prawo.
Wyjmij środek
o
i przejdź do pozycji następnej litery.Przejdź na początek następnego słowa.
źródło