Oto prosty rubin artystyczny ASCII :
___
/\_/\
/_/ \_\
\ \_/ /
\/_\/
Jako jubiler dla ASCII Gemstone Corporation, Twoim zadaniem jest sprawdzenie nowo nabytych rubinów i pozostawienie notatki o wszelkich znalezionych wadach.
Na szczęście możliwe jest tylko 12 rodzajów wad, a twój dostawca gwarantuje, że żaden rubin nie będzie miał więcej niż jednej wady.
W 12 wady odpowiada zastąpieniu jednego z 12 wewnętrzną _
, /
lub \
znaków rubinu z spacji ( ). Zewnętrzny obwód rubinu nigdy nie ma wad.
Wady są ponumerowane, zgodnie z którymi wewnętrzny charakter ma w miejscu miejsce:
Rubin z wadą 1 wygląda następująco:
___
/\_/\
/_/ _\
\ \_/ /
\/_\/
Rubin z wadą 11 wygląda następująco:
___
/\_/\
/_/ \_\
\ \_/ /
\ _\/
To ten sam pomysł dla wszystkich innych wad.
Wyzwanie
Napisz program lub funkcję, która pobiera ciąg jednego, potencjalnie wadliwego rubinu. Numer wady należy wydrukować lub zwrócić. Numer wady wynosi 0, jeśli nie ma wady.
Weź dane wejściowe z pliku tekstowego, standardowego wejścia lub argumentu funkcji łańcuchowej. Zwróć numer usterki lub wydrukuj go na standardowe wyjście.
Możesz założyć, że rubin ma końcową nową linię. Być może nie przyjąć, że ma jakieś wiodące spacje lub znaki nowej linii.
Najkrótszy kod w bajtach wygrywa. ( Poręczny licznik bajtów. )
Przypadki testowe
13 dokładnych rodzajów rubinów, a następnie bezpośrednio oczekiwany wynik:
___
/\_/\
/_/ \_\
\ \_/ /
\/_\/
0
___
/\_/\
/_/ _\
\ \_/ /
\/_\/
1
___
/\ /\
/_/ \_\
\ \_/ /
\/_\/
2
___
/\_/\
/_ \_\
\ \_/ /
\/_\/
3
___
/\_/\
/_/ \_\
\ _/ /
\/_\/
4
___
/\_/\
/_/ \_\
\ \ / /
\/_\/
5
___
/\_/\
/_/ \_\
\ \_ /
\/_\/
6
___
/\_/\
/_/ \ \
\ \_/ /
\/_\/
7
___
/\_ \
/_/ \_\
\ \_/ /
\/_\/
8
___
/ _/\
/_/ \_\
\ \_/ /
\/_\/
9
___
/\_/\
/ / \_\
\ \_/ /
\/_\/
10
___
/\_/\
/_/ \_\
\ \_/ /
\ _\/
11
___
/\_/\
/_/ \_\
\ \_/ /
\/_ /
12
źródło
Odpowiedzi:
CJam,
2723 bajtówKonwertuj bazę 11, weź mod 67, weź mod 19 wyniku, a następnie znajdź indeks tego, co masz w tablicy
Magia!
Wypróbuj online .
źródło
Ruby 2.0, 69 bajtów
Hexdump (aby wiernie pokazać dane binarne w ciągu):
Wyjaśnienie:
-Kn
Opcja odczytuje jako plik źródłowyASCII-8BIT
(binarne).-0
Opcja pozwalagets
czytać w całej wejście (i nie tylko jednej linii).-rdigest
Opcja ładujedigest
moduł, który zapewniaDigest::MD5
.źródło
Julia,
9059 bajtówZdecydowanie nie najkrótsza, ale piękna dziewica Julia z wielką starannością kontroluje królewskie rubiny.
Tworzy to funkcję lambda, która przyjmuje ciąg znaków
s
i zwraca odpowiedni numer defektu ruby. Aby to nazwać, nadaj mu nazwę, npf=s->...
.Niegolfowane + wyjaśnienie:
Przykłady:
Zauważ, że odwrotne ukośniki muszą być poprzedzone znakami ucieczki. Potwierdziłem w @ Calvin'sHobbies, że jest w porządku.
Daj mi znać, jeśli masz jakieś pytania lub sugestie!
Edycja: Zapisano 31 bajtów z pomocą Andrew Pilisera!
źródło
search
i indeksowania tablicy.s->(d=reshape([18 10 16 24 25 26 19 11 9 15 32 34],12);search(s[d],' '))
. Nie podoba mi się przekształcanie, ale nie mogłem wymyślić krótszego sposobu na uzyskanie tablicy 1d.reshape()
do użyciavec()
. :)> <> (Ryba) , 177 bajtów
To długie, ale wyjątkowe rozwiązanie. Program nie zawiera arytmetyki ani rozgałęzień oprócz wstawiania znaków wejściowych w ustalonych miejscach w kodzie.
Zauważ, że wszystkie sprawdzone znaki budujące ruby (
/ \ _
) mogą być „kopiami lustrzanymi” w kodzie> <>, które zmieniają kierunek wskaźnika instrukcji (IP).Możemy użyć tych znaków wejściowych do zbudowania z nich labiryntu za pomocą instrukcji modyfikującej kod
p
i przy każdym wyjściu (utworzonym przez brakujące lustro na wejściu) możemy wydrukować odpowiednią liczbę.Te
S B U
litery są te zmieniły się/ \ _
odpowiednio. Jeśli dane wejściowe są pełne ruby, końcowy kod staje się:Możesz wypróbować program dzięki temu świetnemu tłumaczowi wizualnemu online . Ponieważ nie możesz wprowadzać tam nowych wierszy, musisz zamiast tego użyć fikcyjnych znaków, aby wprowadzić pełny rubin, np
SS___LS/\_/\L/_/S\_\L\S\_/S/LS\/_\/
. (Spacje również zmieniły się na S z powodu przeceny).źródło
CJam,
41 31 2928 bajtówJak zwykle, w przypadku znaków niedrukowalnych kliknij ten link .
Wypróbuj online tutaj
Wyjaśnienie wkrótce
Poprzednie podejście:
Całkiem pewne, że można to zmniejszyć, zmieniając logikę cyfr / konwersji. Ale tutaj jest pierwsza próba:
Jak zwykle, użyj tego linku do znaków niedrukowalnych.
Logika jest dość prosta
"Hash for each defect":i
- To daje mi skrót za defekt jako indeksqN-"/\\_ "4,er
- zamienia znaki na liczby4b1e3%A/
- jest to unikalny numer w podstawowej liczbie przeliczonej#
Następnie po prostu znajduję indeks unikalnego numeru w haszuWypróbuj online tutaj
źródło
.h
obecnie jest bezużyteczny, ponieważ wykorzystuje wbudowaną niewiarygodną i złąhash()
), do tego czasu nie mogę zrobić nic lepszego.Poślizg ,
123108 + 3 = 111 bajtówUruchom z flagami
n
io
, tjMożesz też spróbować online .
Slip jest językiem przypominającym wyrażenia regularne, który powstał w ramach wyzwania polegającego na dopasowaniu wzorca 2D . Poślizg może wykryć lokalizację wady za pomocą
p
flagi pozycji za pomocą następującego programu:który szuka jednego z następujących wzorców (tutaj
S
oznacza to, że zaczyna się dopasowanie):Wypróbuj online - współrzędne są wyprowadzane jako para (x, y). Wszystko brzmi jak normalne wyrażenie regularne, z wyjątkiem tego, że:
`
służy do ucieczki,<>
obróć wskaźnik dopasowania odpowiednio w lewo / w prawo,^6
ustawia wskaźnik dopasowania twarzą w lewo, a\
przesuwa wskaźnik dopasowania prostopadle w prawo (np. jeśli wskaźnik jest skierowany w prawo, to idzie w dół o rząd)Ale niestety potrzebujemy pojedynczej liczby od 0 do 12, która mówi, która wada została wykryta, a nie gdzie została wykryta. Slip ma tylko jedną metodę wyprowadzania pojedynczej liczby -
n
flagę, która wypisuje liczbę znalezionych dopasowań.Aby to zrobić, rozszerzamy powyższe wyrażenie regularne, aby dopasować prawidłową liczbę razy dla każdej wady, za pomocą
o
nakładającego się trybu dopasowania. Podział na elementy to:Tak, to nadmierne użycie,
?
aby uzyskać prawidłowe liczby: Pźródło
JavaScript (ES6), 67
72Po prostu szuka pustych miejsc w podanych 12 lokalizacjach
Edytuj Zapisane 5 bajtów, dzięki @apsillers
Przetestuj w konsoli Firefox / FireBug
Wydajność
źródło
C,
9884 bajtówAKTUALIZACJA: Trochę bardziej sprytna w odniesieniu do łańcucha i naprawiono problem z nieuszkodzonymi rubinami.
Rozpruty:
Całkiem proste i prawie 100 bajtów.
Dla testów:
Wejście do STDIN.
Jak to działa
Każda wada rubinu ma inną postać. Ta lista pokazuje, gdzie występuje każda wada w ciągu wejściowym:
Ponieważ tworzenie tablicy
{17,9,15,23,24,25,18,10,8,14,31,33}
kosztuje dużo bajtów, znajdujemy krótszy sposób na utworzenie tej listy. Zauważ, że dodanie 30 do każdej liczby daje listę liczb całkowitych, które mogą być reprezentowane jako drukowalne znaki ASCII. Ta lista jest następująca:"/'-5670(&,=?"
. Zatem możemy ustawić tablicę znaków (w kodziec
) na ten ciąg i po prostu odjąć 30 od każdej wartości, którą pobieramy z tej listy, aby uzyskać naszą oryginalną tablicę liczb całkowitych. Określamy,a
aby być równym wc
celu śledzenia, jak daleko doszliśmy na liście. W kodzie pozostaje tylkofor
pętla. Sprawdza, aby upewnić się, że jeszcze nie dotarliśmy do końcac
, a następnie sprawdza, czy znakiemb
bieżącegoc
jest spacja (ASCII 32). Jeśli tak, ustawiamy pierwszy, nieużywany elementb
na numer wady i zwróć go.źródło
Python 2,
146888671 bajtówFunkcja
f
sprawdza lokalizację każdego segmentu i zwraca indeks segmentu defektu. Test pierwszego bajtu w ciągu wejściowym gwarantuje, że wrócimy,0
jeśli nie zostaną znalezione żadne defekty.Teraz pakujemy przesunięcia segmentów w zwarty ciąg i używamy
ord()
do ich odzyskania:Testowanie z doskonałym rubinem:
Testowanie z segmentem 2 zastąpionym spacją:
EDYCJA: Dzięki @xnor za dobrą
sum(n*bool for n in...)
technikę.EDIT2: Podziękowania dla @ Sp3000 za dodatkowe wskazówki dotyczące gry w golfa.
źródło
sum(n*(s[...]==' ')for ...)
.<'!'
zamiast==' '
na bajt. Możesz również wygenerować listę za pomocąmap(ord, ...)
, ale nie jestem pewien, co sądzisz o materiałach doPyth,
353128 bajtówWymaga załatanego Pytha , obecna najnowsza wersja Pyth'a zawiera błąd,
.z
który usuwa końcowe znaki.Ta wersja nie używa funkcji skrótu, nadużywa podstawowej funkcji konwersji w języku Pyth, aby obliczyć bardzo głupi, ale działający skrót. Następnie przekształcamy ten skrót na znak i sprawdzamy jego indeks w postaci ciągu.
Odpowiedź zawiera znaki niedrukowalne, użyj tego kodu Python3, aby dokładnie wygenerować program na komputerze:
źródło
Haskell, 73 bajty
Ta sama strategia, co wiele innych rozwiązań: szukanie przestrzeni w danych lokalizacjach. Wyszukiwanie zwraca listę indeksów, z których pobieram ostatni element, ponieważ zawsze istnieje trafienie dla indeksu 0.
źródło
05AB1E , 16 bajtów
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Zobacz moją wskazówkę 05AB1E (sekcje Jak kompresować duże liczby całkowite? I Jak kompresować listy liczb całkowitych? ), Aby zrozumieć, dlaczego
•W)Ì3ô;4(•
jest2272064612422082397
i•W)Ì3ô;4(•₆в
jest[17,9,15,23,24,25,18,10,8,14,31,33]
.źródło