Zostało to zainspirowane częścią konkursu ARML 2016 Problem zespołu nr 6.
Oto wyzwanie:
Otrzymujesz „sekwencję symboli zastępczych”, która jest sekwencją cyfr i innego znaku. Ciąg pasuje do tej sekwencji symboli wieloznacznych według następującego pseudokodu:
w = wildcard
s = string
# s matches w iff
for all 0 >= i > wildcard.length, w[i] == '?' or s[i] == w[i]
Gdzie '?' jest postacią twojego wyboru.
Jeśli chodzi o wyrażenia regularne, wyobraź sobie, że '?'
jest '.'
.
Wyzwanie polega na znalezieniu wszystkich liczb kwadratowych (wymaganie to do 1 miliona), których ciąg dziesiętny odpowiada ciągowi symboli zastępczych. „Znak wieloznaczny” może być dowolnym wybranym przez ciebie znakiem ASCII, o ile oczywiście nie jest cyfrą.
Na przykład, 4096
mecze 4**6
i 4*9*
ale 4114
nie pasuje albo.
Wejście
Dane wejściowe zostaną podane jako sekwencja pasująca do wyrażenia regularnego [0-9?]+
. Może to być ciąg znaków, tablica znaków lub tablica bajtów znaków w ASCII.
Wynik
Wynikiem będzie dowolna lista / zestaw / tablica liczb, które są idealnymi kwadratami i pasują do sekwencji symboli wieloznacznych.
Przykłady prawidłowych danych wejściowych:
1234567*90
1234567?90
1234567u90
['1', '2', '3', '4', '5', '6', '7', '*', '9', '0']
[49, 50, 51, 52, 53, 54, 55, 42, 57, 48]
[1, 2, 3, 4, 5, 6, 7, '*', 9, 0]
Przykłady prawidłowych wyników:
[1, 4, 9]
1 4 9
1, 4, 9
1-4-9
itp.
Dane techniczne
- Nie można używać wbudowanych funkcji do znajdowania listy kwadratów w określonym zakresie
- Obowiązują standardowe luki
- Musisz być w stanie obsłużyć do 1 000 000 (1 milion)
- Jeśli jest wyposażony w dane wejściowe
1******
, drukowanie jest prawidłowe[1000000]
. Prawidłowe jest również drukowanie[1000000, 1002001, 1004004, 1006009, 1008016, 1010025, ...]
- Sekwencje symboli wieloznacznych nigdy nie zaczynają się od znaku wieloznacznego; oznacza to, że zawsze będą pasować do ciągów o tej samej długości.
Przypadki testowe
4**6 -> [4096, 4356]
1**1 -> [1521, 1681]
1** -> [100, 121, 144, 169, 196]
9****9 -> [908209, 915849, 927369, 935089, 946729, 954529, 966289, 974169, 986049, 994009]
9*9*** -> [919681, 929296]
1**0* -> [10000, 10201, 10404, 10609, 12100, 14400, 16900, 19600]
9***4 -> [91204, 94864, 97344]
Zwycięski
Najkrótsze (ważne) (działające) zgłoszenie do 14 lutego, rozstrzygnięcie po wygraniu najwcześniejszego zgłoszenia.
?
ma wybrać osoba odpowiadająca.25
ważna jest odpowiedź na,***
ale nie na*2*
?{4, "w", "w", 6}
(lub jeszcze lepiej{4, w, w, 6}
), a nie tablica znaków, na przykład{"4", "w", "w", "6"}
?Odpowiedzi:
05AB1E , 22 bajty
Prawdopodobnie jest tu dużo miejsca na ulepszenia.
Każda cyfra nie będąca cyfrą jest odpowiednia jako symbol wieloznaczny.
Wypróbuj online!
Wyjaśnienie, które nastąpi po dalszej grze w golfa.
źródło
Mathematica, 44 bajty
Dane wejściowe to lista cyfr z
_
symbolem wieloznacznym (bez cudzysłowów). na przykład{4, _, _, 6}
Wyjaśnienie
Wygeneruj listę
{1, 2, 3, ... , 1000}
Wyprostuj to. (lista wszystkich kwadratów od 1 do 1 000 000)
Podziel każdy kwadrat na listę cyfr.
Znajdź te, które pasują do wzorca określonego przez dane wejściowe.
Wydrukuj je.
źródło
Brachylog , 23 bajty
Wypróbuj online!
Wyjaśnienie
Inny format wejściowy, 13 bajtów
W zależności od tego, co uważasz za ważne jako dane wejściowe, możesz to zrobić:
Wypróbuj online!
który jest w zasadzie drugą częścią powyższej odpowiedzi, z listą jako danymi wejściowymi zawierającymi cyfry i zmienne, w których znajdują się symbole wieloznaczne.
Nie uważam tego za ważne, ponieważ w Brachylog jest tylko 26 nazw zmiennych (wielkie litery), więc nie zadziałałoby, gdybyś miał więcej niż 26 wilcards.
źródło
true.
), ale wcześniej nie używałem języków, które tego wymagają. Spróbuję znaleźć jakieś odniesienie, aby ustalić, jak powinienem to zdobyć, ale sensowne byłoby przyznanie go jako 23, więc zachowam to.Perl 6 ,
3026 bajtówDzięki @ b2gills za -4 bajty!
Używa kropki jako znaku wieloznacznego, dzięki czemu dane wejściowe można wykorzystać jako wyrażenie regularne:
Wypróbuj online .
Wariant, który akceptuje gwiazdkę jako symbol wieloznaczny (jak sugerowano w poprzedniej wersji opisu zadania), miałby 42 bajty:
źródło
{ ... }("9*9***")
) lub przypisać do zmiennej / symbolu do późniejszego wykorzystania. Zauważ, że Perl 6 jest językiem innym niż Perl, więc nie będzie działał z interpretatorem Perla.sudo apt-get install rakudo
dostawałem rzekomy interpreter Perl6 ... Kiedy wstawiamperl6
jako polecenie do mojego terminala, zaczyna się coś, co wydaje się być interpreterem Perl6, ale nie wiem, jak go używać. Wiem, że to lambda, ale nie wiem jak to nazwać.perl6 foo.p6
. Możesz również przetestować go w skorupie oneliner, na przykładperl6 -e 'say {grep /^<$_>$/,map * **2,^1e4}( "9.9..." )'
Rubinowy, 54 bajty
Funkcja, która pobiera argument ciągu. Wypróbuj online.
źródło
#
powoduje, że reszta linii jest komentarzem.Partia, 109 bajtów
Używa
?
jako symbolu wieloznacznego. Działa, tworząc 1000 plików. Nazwa pliku to liczba kwadratowa, a rozszerzenie pliku to liczba kwadratowa z$
sufiksem. Wynika to z faktu, że dopasowanie wzorca Batch liczy końcowe?
s jako opcjonalne, więc1?
dopasuje oba1
i16
;$
dlatego zmusza mecz mają być dokładne. Jednak nie chcemy$
wyprowadzać pliku, więc po prostu wypisujemy nazwę pliku tylko bez rozszerzenia.źródło
JavaScript (ES6),
6866 bajtówEDYCJA: Zaktualizowałem moje rozwiązanie poniżej po zainspirowaniu odpowiedzią JungHwan Min . Jest teraz zgodny z ES6.
Pobiera dane wejściowe w formacie, w
'1..4'
którym.
znajduje się symbol wieloznaczny.Zamiast iteracji do 1e6 i kwadratowego zrootowania ten iteruje do 1e3 i kwadratów.
Pokaż fragment kodu
JavaScript (ES7),
7169 bajtówTworzy tablicę liczb od 0 do 1e6, a następnie filtruje ją według liczb, które są kwadratowe i pasują do wzorca.
Jest strasznie powolny, ponieważ zawsze iteruje do 1e6.
Pokaż fragment kodu
źródło
**
działa, ponieważ daje mi to"SyntaxError: expected expression, got '*'"
.1e6
...**
operator nie istnieje, przynajmniej nie w moim systemie.**
. Tak, to ES7. Zaktualizuję tytuł. Oto lista obecnie obsługiwanych przeglądarek developer.mozilla.org/en/docs/Web/JavaScript/Reference/...Perl,
424538 bajtówEDYCJA: wyjaśnienie Alexa, możemy użyć kropki jako znaku wieloznacznego, który goli operację y //.
EDYCJA: rozwiązanie wykorzystujące gwiazdkę jako znak wieloznaczny i oczekuje sekwencji symboli wieloznacznych na STDIN
Ten pozostawia niewątpliwie dużo miejsca na ulepszenia, jest całkiem prosty. Wyrażenie symbolu wieloznacznego jest oczekiwane jako argument wiersza polecenia, z kropkowym znakiem wieloznacznym okresu (co jeszcze?).
źródło
Python 3 -
9897 bajtówWymaga danych wejściowych takich jak „4..6”.
źródło
import re
ire.findall
;from...import *
w tym przypadku optymalizacja za pomocą parametru faktycznie nie jest optymalizowana.1....
, to daje1 4 9
i16 25
jak poprawnych odpowiedzi, która nie jest poprawna. Popraw swój program.1......
. Wraca[]
, ale powinien dać[1000000]
. Można to naprawić kosztem 0 bajtów za pomocąrange(0, 1001)
zamiastrange(0, 1000)
.k - 28 znaków
Używa
?
jako znaku wieloznacznego. Dolike
zastosowania funkcyjne?
jak maska, a funkcja ta tworzy listę pierwszych 1001 kwadratów (być inclusive do 1M), rzuca je wszystkie do ciągów, a następnie sprawdza, gdzie oni pasują do wzorca.źródło
type error {s(&:)($:s:s*s:!1001)like x} "1" at execution instance 2 of ":"
. Czy możesz podać link do działającego zestawu testów lub sprawdzić, czy występuje problem?narzędzia bash + Unix, 33 bajty
To używa „.” jako znak wieloznaczny.
Program DC drukuje liczby kwadratowe w nieskończonej pętli:
Wyjście prądu stałego jest przesyłane w potoku do grep, który drukuje tylko kwadraty pasujące do wymaganego wzorca.
Działa to, gdy uruchamiam go na rzeczywistym systemie Linux lub OS X (ale to nie działa w TIO, prawdopodobnie dlatego, że program dc próbuje powtarzać się w nieskończoność, i podejrzewam, że TIO zabrakło miejsca na stos dla rekurencji i / lub ma problem z niekończącą się rurą).
źródło
dc
poleceniu.--line-buffered
po obu stronach^$1$
, ale to nie działa w żaden sposób.sed s/./0/g<<<$1
| grep ^ $ 1 $ Używa długości wzorzec, aby ograniczyć liczbę testowanych liczb (wzorce 4-znakowe sprawdzają tylko do 9999 itd.). Oto link do TIO: tio.run/nexus/…grep
. Ponieważ jednak nie jest to obecnie najkrótsze rozwiązanie, zachowam 33 bajty do oceny. Wygląda na to, że działa dla wszystkich wejść, więc dobra robota!