Okno to kwadrat ASCII-art o nieparzystej długości co najmniej 3, z pojedynczą obwódką wokół krawędzi oraz pionowymi i poziomymi pociągnięciami na środku:
#######
# # #
# # #
#######
# # #
# # #
#######
Okno MS to okno, w którym ramka składa się tylko z znaków M
i S
. Twoim zadaniem jest napisanie programu (lub funkcji), który pobierze ciąg znaków i wyświetli prawdziwą wartość, jeśli dane wejściowe są poprawnym MS Window, i wartością falsey, jeśli nie jest.
Dane techniczne
- Możesz wziąć dane wejściowe jako ciąg oddzielony znakiem nowej linii lub tablicę ciągów reprezentujących każdą linię.
- Obramowanie okna MS może zawierać mieszankę znaków M i S, ale wnętrze zawsze będzie składać się ze spacji.
- Możesz wybrać wykrywanie tylko okien z końcowymi znakami nowej linii lub tylko okien bez końcowych znaków nowej linii, ale nie obu.
Przypadki testowe
Prawda:
MMM
MMM
MMM
SMSMS
M M S
SMSMM
S S M
SMSMS
MMMMMMM
M S M
M S M
MSSSSSM
M S M
M S M
MMMMMMM
Falsey:
Hello, World!
MMMM
MSSM
MS M
MMMM
MMSMM
M S.M
sSSSS
M S M
MMSMM
MMMMMMM
M M M
MMMMMMM
M M M
MMMMMMM
MMMMMMM
M M M M
MMMMMMM
M M M M
MMMMMMM
M M M M
MMMMMMM
MMSSMSSMM
M M M
S S S
S S S
MMSSMSSMM
S S S
S S S
M M M
MMSSMSSMM
code-golf
string
ascii-art
decision-problem
Esolanging Fruit
źródło
źródło
Odpowiedzi:
Pyke,
3431 bajtówWypróbuj tutaj!
źródło
Siatkówka ,
6867 bajtówLiczba bajtów zakłada kodowanie ISO 8859-1.
Wypróbuj online!
źródło
Grime ,
3938 bajtówDzięki Zgarbowi za uratowanie 1 bajtu.
Wypróbuj online!
Nie jestem pewien, czy istnieje prostszy sposób narzucenia kwadratowego współczynnika kształtu poszczególnych komponentów okna niż użycie rekurencyjnego nieterminala, ale wydaje się, że działa to całkiem dobrze.
Wyjaśnienie
Najlepiej przeczytać program od podstaw.
Definiuje to po prostu nieterminal (który można traktować jako podprogram pasujący do prostokąta),
W
który pasuje albo doM
alboS
(jest ukryty]
na końcu linii).Definiuje to terminal,
B
który pasuje do około jednej czwartej wyniku, tj. Jeden panel okna z lewą i górną ramką. Coś takiego:Aby upewnić się, że ten panel okna jest kwadratowy, definiujemy
B
rekurencyjnie. To albo znak oknaW
, albo ten,B/W\ * W/\ /*
który dodaje jedną warstwę po prawej i na dole. Aby zobaczyć, jak to robi, usuńmy cukier syntaktyczny:To jest to samo, ponieważ konkatenację poziomą można zapisać albo,
AB
alboA B
ta druga ma niższy priorytet niż konkatenacja pionowa,/
podczas gdy dla pierwszej ma wyższą. PodobnieB/W[ ]*
jestB
ze znakiem okna i rzędem spacji poniżej. A następnie dołączamy poziomo,W/[ ]/*
który jest znakiem okna z kolumną spacji.Na koniec montujemy te nieterminale w końcowym kształcie okna:
To cztery panele okien,
B
po których następuje rząd znaków okna i kolumna znaków okna. Zauważ, że nie twierdzimy wprost, że cztery panele okien mają ten sam rozmiar, ale jeśli nie są, niemożliwe jest połączenie ich w prostokąt.Wreszcie,
e`
na początku jest po prostu konfiguracja, która każe Grime'owi sprawdzić, czy cały sygnał wejściowy może być dopasowany do tego wzorca (i drukuje0
lub1
odpowiednio).źródło
JavaScript (ES6),
115113 bajtówPobiera dane wejściowe jako tablicę tablic znaków (dodaj 5 bajtów dla tablicy ciągów znaków) i zwraca
1
lub0
. Po sprawdzeniu, że wysokość jest nieparzysta, każdy wiersz jest sprawdzany, aby upewnić się, że tablica jest kwadratowa, i każdy znak jest weryfikowany jako jeden z znaków, których oczekujemy na tej konkretnej pozycji. Edycja: Zapisano 2 bajty dzięki @PatrickRoberts.źródło
(...).includes(c)
aby~(...).search(c)
zapisać 1 bajt(...?/ /:/[MS]/).test(c)
zapisać 2 bajty zamiast tylko 1.Perl,
124123119959384Poniższy skrypt Perla czyta jednego kandydata MS Window ze standardowego wejścia. Następnie kończy pracę z zerowym statusem wyjścia, jeśli kandydat jest oknem MS i z niezerowym statusem wyjścia, jeśli nie jest.
Działa poprzez generowanie dwóch wyrażeń regularnych, jednego dla górnej, środkowej i dolnej linii oraz jednego dla każdej innej linii i sprawdzanie danych wejściowych względem nich.
Dzięki, @Dada. I jeszcze raz.
źródło
@a=<>;$s=$"x(($.-3)/2);$m="[MS]";map{$a[$_]!~($_%($./2)?"$m$s$m$s$m":"$m${m}{$.}")&&die}0..--$.
$.
na koniec, aby uniknąć stosując dwukrotnie$.-1
(zwłaszcza, że pierwszy raz było($.-1)/2
tak potrzebne dodatkowe nawias), więc$m
w$m${m}{$.}
nie jest błędem. Poza tym właśnie sobie uświadomiłem, ale wyrażenia regularne powinny być otoczone^...$
(tak, że dodatkowe znaki na końcu lub na początku powodują, że się nie udają), lub krócej: użyjne
zamiast!~
.ne
zamiast tego!~
(nie powinienem pisać wiadomości, gdy nie śpię przez zaledwie 15 minut!).^...$
Obawiam się, że będziesz musiał użyć obu wyrażeń regularnych.Mathematica, 166 bajtów
Nienazwana funkcja przyjmująca listę znaków jako dane wejściowe i zwracające
True
lubFalse
. Oto mniej golfowa wersja:Pierwszy wiersz definiuje funkcję
t
, która dzieli listę długościd
na dwie części, z których pierwsza to pierwsza, środkowa i ostatnia pozycja listy, a druga to cała reszta. Drugi wiersz sprawdza, czy dane wejściowe są kwadratową tablicą. Czwarta linia używat
dwa razy, raz na samym wejściu i raz na wszystkich * ciągach na wejściu, aby oddzielić znaki, które powinny być"M"
lub"S"
od znaków, które powinny być spacjami; następnie piąta i siódma linia sprawdzają, czy naprawdę są tym, czym powinny być.źródło
JavaScript (ES6),
108106 bajtówDane wejściowe: tablica ciągów / Dane wyjściowe:
0
lub1
Przypadki testowe
Pokaż fragment kodu
źródło
JavaScript (ES6),
140138141140 bajtówWiem, że to nie jest zwycięska liczba bajtów (chociaż dzięki Patrickowi Robertsowi za -3 i zdałem sobie sprawę, że rzuciło fałszywe trafienia na 1 zamiast M / S: +3), ale zrobiłem to nieco inaczej, jestem nowy i było fajnie ...
Akceptuje tablicę ciągów, po jednej dla każdej linii i zwraca wartość true lub false. Dodano nową linię dla zachowania przejrzystości (nieuwzględnione w liczbie bajtów).
Zamiast sprawdzać dane wejściowe względem uogólnionego wzorca, buduję okno „M” o tym samym rozmiarze, zastępuję S literą M na wejściu i porównuję oba.
Nie golfił
Przypadki testowe
źródło
f=
nie musi być uwzględniana w liczbie bajtów, więc w rzeczywistości jest to przesłanie 138 bajtów.z=-1+s/2|0
zez=(s-3)/2
aby zapisać 1 bajte.replace(/S/g,'M')==...
sięe.split`S`.join`M`==...
zapisać kolejny bajtz=-1+s/2|0
jest tam, aby zwrócić dodatnią liczbę całkowitą dla s == 1, a nawet s, tzn. funkcja zwraca wartość false bez awarii Array (). W przeciwnym razie niezbędna logika wydłużyła go. Świetna wskazówka dotycząca podziału / dołączenia, dziękis=1
przypadku, ponieważ moje nieprawidłowe wyrażenie regularne po prostu cicho kończy się niepowodzeniem.JavaScript (ES6),
10910710610599 bajtówEdycja : Whoa, Arnauld oszczędził mi 6 bajtów, zmieniając
s.split`\n`.length
nas.search`\n`
! Dzięki!Pobiera to pojedynczy ciąg wielowierszowy i konstruuje
RegExp
sprawdzanie poprawności na podstawie długości ciągu wejściowego. Zwracatrue
lubfalse
. Zakłada prawidłowe oknomanie ma końcowego znaku nowej linii.Próbny
źródło
r=s.search('\n')
zamiastsplit / length
?s=>!s.split`S`.join`M`.search([...])
można usunąć bez powodowania błędów składniowych.RegExp