Istnieje 97 znaków ASCII, z którymi ludzie spotykają się regularnie. Można je podzielić na cztery kategorie:
Listy (łącznie 52)
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
Liczby lub cyfry (łącznie 10)
0123456789
Symbole i znaki interpunkcyjne (łącznie 32)
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
Biała spacja (3 ogółem)
Spacja
\t
i nowa linia\n
. (Traktujemy warianty nowego wiersza jak\r\n
jeden znak).
Dla zwięzłości nazwiemy te kategorie odpowiednio L, N, S i W.
Wybierz dowolną z 24 kombinacji dowolnych liter LNSW
i powtórz ją w nieskończoność, aby stworzyć szablon programowania dla siebie.
Na przykład możesz wybrać permutację NLWS
, więc twoim szablonem programowania byłoby:
NLWSNLWSNLWSNLWSNLWS...
Musisz napisać program lub funkcję na podstawie tego szablonu, gdzie:
Każda
L
jest zastępowana dowolną literą (ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
).Każda
N
jest zastępowana dowolną liczbą (0123456789
).Każdy
S
jest zastępowany dowolnym symbolem (!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
).Każdy
W
jest zastępowany dowolnym znakiem spacji (\t\n
).
Zasadniczo kod musi być zgodny ze wzorem
<letter><number><symbol><whitespace><letter><number><symbol><whitespace>...
jak sugeruje tytuł pytania, z tym wyjątkiem, że w razie potrzeby możesz wybrać inną kolejność czterech kategorii znaków.
Uwaga:
Zamienniki dla kategorii mogą być różnymi postaciami. np.
9a ^8B\t~7c\n]
poprawnie odpowiada szablonowiNLWSNLWSNLWS
(\t
i\n
będzie to ich dosłowne znaki).Nie ma ograniczeń długości kodu. przykład
1A +2B -
i1A +2B
i1A
i1
wszystkie są zgodne z szablonemNLWSNLWSNLWS...
.
Kod zgodny z szablonem musi pobrać jeden nierozszerzony znak ASCII i wypisać liczbę od 0 do 4 w zależności od kategorii, do której należy w powyższej kategoryzacji. To znaczy, 1
jeśli dane wejściowe są literą, 2
liczbą, 3
symbolem i 4
białą spacją. Wyprowadza, 0
jeśli wejście nie jest żadnym z nich (znak kontrolny ).
W celu wprowadzenia można alternatywnie przyjąć liczbę od 0 do 127 włącznie, która reprezentuje kod wejściowego znaku ASCII.
Pary wejściowe (jako kod char) i wyjściowe, które musi posiadać Twój kod, są dokładnie następujące:
in out
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 4
10 4
11 0 or 4
12 0 or 4
13 0 or 4
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 4
33 3
34 3
35 3
36 3
37 3
38 3
39 3
40 3
41 3
42 3
43 3
44 3
45 3
46 3
47 3
48 2
49 2
50 2
51 2
52 2
53 2
54 2
55 2
56 2
57 2
58 3
59 3
60 3
61 3
62 3
63 3
64 3
65 1
66 1
67 1
68 1
69 1
70 1
71 1
72 1
73 1
74 1
75 1
76 1
77 1
78 1
79 1
80 1
81 1
82 1
83 1
84 1
85 1
86 1
87 1
88 1
89 1
90 1
91 3
92 3
93 3
94 3
95 3
96 3
97 1
98 1
99 1
100 1
101 1
102 1
103 1
104 1
105 1
106 1
107 1
108 1
109 1
110 1
111 1
112 1
113 1
114 1
115 1
116 1
117 1
118 1
119 1
120 1
121 1
122 1
123 3
124 3
125 3
126 3
127 0
Wejścia 11, 12 i 13 odpowiadają znakom, które czasami są uważane za białe znaki, więc ich wyniki mogą być 0
lub, 4
jak chcesz.
Najkrótszy kod w bajtach wygrywa.
źródło
Odpowiedzi:
Haskell 300 bajtów
Ten kod nie powinien mieć końca nowej linii. Funkcja
m1
przyjmuje dane wejściowe jako aChar
i zwraca odpowiedź jakoChar
.Nie mogłem się oprzeć wyzwaniu, które, jak twierdził ktoś, było niemożliwe w przypadku „konwencjonalnych” języków.
Możesz kwestionować, czy Haskell się liczy, ale większość słów kluczowych i identyfikatorów składa się z wielu znaków i nie można ich użyć. Jednak definicje funkcji najwyższego poziomu, listy, literały łańcuchowe, ścisłe porównania, dopasowywanie wzorców i rozgałęzianie ze strażnikami działają, o ile litery występują tuż przed cyframi, a jeśli symbole pojawiają się także przed literami, mamy znaki specjalne, takie jak
\t
i\r
. Niestety permutacje, które działają przy programowaniu ogólnym, nie pozwalają na literały liczbowe, więc nie mogłem uzyskać liczb w żaden użyteczny sposób.Jak to działa:
m1
.x1
jest analizowaną postacią.f1
funkcja dzieli łańcuch z dopasowaniem do wzorca listy i ma trzy gałęzie: gdy granice są symbolami większymi niż spacja, gdy granice są poprzedzane znakami sterującymi mniejszymi niż spacja oraz do obsługi ostatecznego porównania z samą spacją. Nazwy elementów listy są mnemoniczne dla pierwszej gałęzi: Letter, Number, sPace, sYmbol, Remainder.b1
uchwyty funkcyjne rozgałęziające do dwóch znaków granicznychs1 < b1
na raz.Wypróbuj online
źródło
Siatkówka , 113 bajtów
Litera, liczba, spacja, symbol, powtórz
Wypróbuj online!
Przetestuj to na sobie!
Retina wydaje się być dobrym narzędziem do tego zadania: możemy elastycznie używać wszystkich typów znaków w konfiguracji scenicznej i mamy pewne predefiniowane klasy postaci, które mogą być przydatne.
Myślę, że ten problem można rozwiązać za pomocą etapów wymiany lub transliteracji; Wybrałem Transliteracje, ponieważ są one bardziej elastyczne i mają najbardziej przydatne klasy postaci. Jeśli chodzi o wzorzec źródła, musiałem umieścić symbole tuż przed literami, aby użyć ich
\n
dla nowych linii (faktycznie miałem krótsze rozwiązanie, używając bardziej praktycznych ¶ dla nowych linii, ale znaki inne niż ascii są zbanowane).Wyjaśnienie
Pierwsze etapy to transliteracje. Używamy
+
i1
jako opcji, aby utrzymać wzorzec, ale nie wpłyną one na wynik etapu. Składnia polegaT`from`to
na zamapowaniu każdego znakufrom
na znak w tej samej pozycji wto
. Jeślito
jest krótszy niżfrom
, jego końcowy charakter powtarza się tyle, ile potrzeba. Jeślifrom
ma powtarzające się znaki, brane jest pod uwagę tylko pierwsze wystąpienie każdego z nich. Niektóre litery odpowiadają klasom znaków, np.d
Jest równoważne0123456789
.Dzięki temu mapujemy niektóre znaki na inne znaki z tej samej klasy, aby „zrobić miejsce” na następujące transliteracje. (
a
->b
,0
->1
,space
->tab
,@
->;
). Finał:D0
to tylko buźka: D0Zaczynamy od cyfr,
d
to klasa znaków0-9
, tutaj przekształcamy0
->a
,1-9
->2
,space
->2
: transliteracje dla0
ispace
są niepoprawne, ale znaki te zostały wyeliminowane przez poprzednią transliterację.Białe znaki, przekształcać
a
->a
(9
,tab
,\n
,space
) ->4
.9
został już usunięty w poprzednim etapie.Litery, tutaj używamy dwóch różnych klas znaków (z powodu braku bardziej kompletnej):
l
dla małych liter iL
dla wielkich liter. Wszystkie zostają zmapowane1
wraz z innymi postaciami, które zostały omówione w poprzednich etapachSymbolika. Ponieważ każda inna klasa została przekształcona w cyfrze, tu odwzorować wszystkie cyfry do siebie z
d
->d
, a następnie do wszystkich znaków drukowanych3
zp
->3
. Cyfry również należą do drukowalnych znaków, ale pierwsza transliteracja wygrywa.Teraz musimy przypisać
0
do kontrolowania znaków, ale nie znalazłem żadnego prawidłowego sposobu na jawne zaadresowanie tej klasy. Zamiast tego przekonwertujemy każdą cyfrę na jednoargumentową: znaki kontrolne nie są cyframi, więc są traktowane jako pusty ciąg znaków, który jest równy0
jedności. Niestety, jednoargumentowe polecenie konwersji w siatkówce to$*
dwa symbole znajdujące się blisko siebie, dlatego zamiast tego dokonamy konwersji „ręcznie” za pomocą podstawień.Naszą jedyną cyfrą jest
$n
wzór zastępczy dla nowych linii.\b
dopasowuje „granicę”, w której słowo alfanumeryczne zaczyna się lub kończy: w naszym przypadku będzie to zawsze pasować przed dowolną liczbą. Zasadniczo zastępujemy każdy numern
nowym znakiem plusn-1
.Na koniec zliczamy liczbę nowych linii i uzyskujemy pożądany wynik.
źródło
Kardynał
22402224 bajtówUżywany szablon LSNW
Kod ma końcowy znak nowej linii.
Jak to działa:
Ten kod ma wiele znaków, które nie są używane.
% zwalnia wskaźnik we wszystkich kierunkach. 3 z nich właśnie uderzyło w koniec linii i zginęło.
Ostatni wskaźnik przyjmuje dane wejściowe w: Dane te
są następnie porównywane z każdą wartością od 0 do 127.
Wydruki:
0 dla 0-8
4 dla 9-12
0 dla 13-31
4 dla 32
3 dla 33-47
2 dla 48-57
3 dla 58-64
1 dla 65-90
3 dla 91-96
1 dla 97-122
3 dla 123-126
0 dla 127
Zastosowane operacje:
J = Pomiń następną operację, jeśli niezerowa
^ = Zmień kierunek w górę
> = Zmień kierunek w lewo
- = Zmniejszenie
+ = Przyrost
: = Wprowadź dane wejściowe
% = Utwórz wskaźniki na początku programu
x = Usuń wskaźnik
0 = Ustaw jako aktywny wartość wskaźnika na 0
Wypróbuj online
źródło
Perl 5 , 293 bajtów
291 bajtów kod + 2 dla
-0p
.Powiedziano mi, że flagi wiersza poleceń są bezpłatne, ale dodałem je tutaj, aby były widoczne, ponieważ łącze TIO nie zawiera
-0
, dla łatwiejszego testowania.Wypróbuj online!
Jest to szczególnie trudne wyzwanie do rozwiązania w prawie każdym języku, więc jestem bardzo szczęśliwy, że udało mi się (w końcu wiele majsterkowania włączać i wyłączać przez dłuższy czas), aby działało w Perlu. Mamy nadzieję, że dodatkowe białe znaki przed i po numerze nie stanowią problemu.
Wybór kolejności sekwencji był szczególnie trudny, ale na szczęście
s///
iy///
można zaakceptować dowolny inny znak jako separator, więc można było użyć litery, spacji, liczby, symbolu, co pozwala nas 0...0...0;
iy 0...0...0;
.Pierwszą rzeczą wymaganą do oszacowania było zastąpienie
_
go!
tak,\w
aby pasowało tylko[0-9a-zA-Z]
, a następnie zastąpienie wszystkich białych znaków (\s
)\t
, wszystkimi cyframi\r
i wszystkimi pozostałymi znakami słów (\w
)\n
dla łatwego dopasowania później. Następnie za pomocąy///
operatora wszystkie pozostałe symbole są konwertowane na znaki słowne!
na,_
a wszystkie inne znaki (między9
ia
) są przesuwane w dół o 9 miejsc, zamieniając je w litery lub cyfry. Są one następnie zastępowane za\w
pomocą przez,3
a inne, wcześniej wykonane podstawienia są zastępowane ich numerowanymi wartościami.źródło
Biała spacja , 1332 bajty
Zamówienie to
1234
/LNSW
(litera, cyfra, symbol, spacja).Wypróbuj online (wprowadź jako liczbę całkowitą reprezentującą kod Unicode znaku).
Wyjaśnienie:
Białe znaki to język oparty na stosie, w którym każdy znak oprócz spacji, tabulatorów i nowych wierszy jest ignorowany. Oto ten sam program bez
YO!
( 333 bajtów ):Litery
S
(spacja),T
(tab) iN
(nowa linia) dodane tylko jako wyróżnienia.[..._some_action]
dodano tylko jako wyjaśnienie.Wypróbuj online.
Program w pseudokodzie:
źródło