Wprowadzenie i zaliczenie
Wszyscy znamy i kochamy nasze niesamowite zasady sprawdzania, czy liczbę można podzielić przez 11 lub 3, co jest po prostu sprytną sumą nad cyframi liczby. Teraz to wyzwanie przenosi to na nowy poziom, wymagając obliczenia sumy cyfr, a następnie sprawdzenia, czy wynikiem jest idealny kwadrat całkowity, przy czym żadnej z tych operacji zwykle nie można wykonać bardzo krótko. Ponieważ ta właściwość jest również bardzo trudna do zauważenia, gdy patrzymy na liczbę, chcemy, aby zrobiono to dla całych list liczb, abyśmy mogli uratować ludzką pracę. To jest teraz twoje wyzwanie!
To było zadanie na moim uniwersyteckim kursie programowania funkcjonalnego. To zadanie jest teraz zamknięte i zostało omówione na zajęciach i mam pozwolenie mojego profesora na opublikowanie go tutaj (wyraźnie poprosiłem).
Specyfikacja
Wkład
Twoje dane wejściowe to lista liczb całkowitych nieujemnych, w dowolnym standardowym formacie We / Wy.
Możesz wybrać format listy w zależności od potrzeb
Wydajność
Dane wyjściowe to lista liczb całkowitych w dowolnym standardowym formacie we / wy.
Co robić?
Odfiltruj każdą liczbę całkowitą z listy wejściowej, dla której suma cyfr nie jest kwadratem (liczby całkowitej).
Kolejność elementów nie może zostać zmieniona, np. Jeśli otrzymasz [1,5,9]
, możesz nie wrócić[9,1]
Potencjalne narożne skrzynki
0 jest nieujemną liczbą całkowitą, a zatem prawidłowym wejściem, a 0 jest również prawidłowym pierwiastkiem całkowitym, np. 0 liczy się jako liczba całkowita w kwadracie.
Pusta lista to także prawidłowe dane wejściowe i wyjściowe.
Kto wygrywa?
To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach!
Oczywiście obowiązują standardowe zasady.
Przypadki testowe
[1,4,9,16,25,1111] -> [1,4,9,1111]
[1431,2,0,22,999999999] -> [1431,0,22,999999999]
[22228,4,113125,22345] -> [22228,4,22345]
[] -> []
[421337,99,123456789,1133557799] -> []
Przykład krok po kroku
Example input: [1337,4444]
Handling first number:
Sum of the digits of 1337: 1+3+3+7=14
14 is not an integer square, thus will be dropped!
Handling second number:
Sum of the digits of 4444: 4+4+4+4=16
16 is an integer square because 4*4=16, can get into the output list!
Example output: [4444]
Odpowiedzi:
Pyke, 6 bajtów
Wypróbuj tutaj!
źródło
Mathematica,
3936 bajtówAnonimowa funkcja:
LLlAMnYP zapisał bajt. Dziękuję Ci!
Martin Ender uratował jeszcze trzy, zastępując
IntegerQ
jeAtomQ
. Sprytny! (Wynik√
będzie dokładny, więc zwraca wyrażenie złożone, takSqrt[5]
jakby jego argument nie był kwadratem).źródło
...Digits@#&
zamiast...Digits[#]&
Galaretka,
87 bajtów1 bajt dzięki @ Sp3000 .
Zestaw testowy.
Wyjaśnienie
źródło
Brachylog v2, 8 bajtów
Wypróbuj online!
Wyjaśnienie
Te
&
środki, które wyjście elementy są takie same jak te z listy wejściowej, aleℤ
będzie błędów, czy wejście bloku nie jest liczbą kwadratowy, więc otrzymujemy listę wejściowy z elementami z non-kwadrat sumy cyfr wyrzucić.Zauważ, że na początku może się wydawać, że występuje tutaj problem niedokładności zmiennoprzecinkowej (niektóre bardzo duże liczby całkowite inne niż kwadratowe mają pierwiastki całkowite z powodu zaokrąglenia). Jednak Brachylog obsługuje arytmetykę bignum i faktycznie zachowuje to zachowanie w swojej implementacji
√
: liczba, która jest idealnym kwadratem, będzie miała pierwiastek kwadratowy zgłoszony jako liczba całkowita, podczas gdy liczba, która nie jest kwadratem idealnym (ale wystarczająco blisko, aby jego pierwiastek kwadratowy jest całką), pierwiastek kwadratowy zostanie zgłoszony jako liczba zmiennoprzecinkowa o wartości całkowitej. Dogodnieℤ
zezwala tylko na poprzedni rodzaj wartości zwracanej, co powoduje brak potwierdzenia dla drugiej.źródło
Pyth, 10 bajtów
Zestaw testowy.
Wyjaśnienie
źródło
CJam, 14 bajtów
Dzięki @FryAmTheEggman za uratowanie jednego bajtu!
Wypróbuj online!
Jest to nienazwany blok, który oczekuje na liście wejściowej stosu i pozostawia na nim listę filtrowaną.
Wyjaśnienie
źródło
Haskell -
706059 bajtówStosowanie:
Całkiem proste; oblicza sumę cyfr i sprawdza, czy floor (sqrt (y)) ^ 2 == y
Edycja: Ukradnij pomysł sprawdzenia listy kwadratów z C. Quilley
źródło
f=
jest wymagana.05AB1E,
1910 bajtówWyjaśnienie
Wypróbuj online
Edycja: Zapisano 9 bajtów dzięki @Adnan
źródło
vySO
i od razu sprawdzić, czy jest kwadratowa, czy nie. Mam to do 5:tDï->
. Istnieje również specjalne wbudowane narzędzie, które drukuje,y
gdy jest równe1
, czyli (—
). Tak byłobyvySOtDï->—
.R ,
5755 bajtówUżyj
Filter
na wektorze. Zakłada 32-bitowe liczby całkowite, więc maksymalnie 10 cyfr.Przypadki narożne: zwraca
NULL
pusty wektor inumeric(0)
wektor bez prawidłowych liczb. Oba mają długość zerową, więc powinno być do zaakceptowania.-2 dzięki @Giuseppe
Wypróbuj online!
źródło
PowerShell ,
6454 bajtówWypróbuj online!
-10 bajtów dzięki mazzy
Pobiera dane wejściowe jako argumenty wiersza polecenia (patrz przykłady poniżej), które są przetwarzane w programie PowerShell do tablicy
$args
. Przesuwamy to do?
aliasu dlaWhere-Object
(funkcje podobne dofilter
), aby wybrać nasze wyjście. Nasz wybór opiera się na wywołaniu .NET[math]::Sqrt()
z cyfrową sumą liczby z liczbą całkowitą!(...%1)
. Liczby całkowite spowodują 0, które gdynot
ed staje się,True
gdy pierwiastki niecałkowite stają sięFalse
.Jak wspomniano w innym miejscu, „zwracanie” pustej tablicy jest bez znaczenia, ponieważ jest konwertowane,
$null
gdy tylko opuści zakres, więc dane wyjściowe dla pustego wejścia są niczym.Przykłady
źródło
$n%1
sprawdza, czy tylko int$args|?{!([math]::Sqrt(([char[]]"$_"-join'+'|iex))%1)}
Python 2, 76 bajtów
Wypróbuj tutaj!
Niektóre nadużycia eval, aby sprawdzić liczbę kwadratową, reszta jest dość nieefektywna.
Instrukcja eval ma wartość
sum(map(int,
n))**.5==int(sum(map(int,
n))**.5)
źródło
Oracle SQL 11.2, 213 bajtów
Bez golfa
źródło
Brachylog , 26 bajtów
Przykład:
Wyjaśnienie
Jest to sytuacja, w której coś działa trochę zbyt dobrze ... ta
~^[X:2]
część jest prawdziwa zarówno dla pozytywnych, jak i negatywnychX
, więc aby uniknąć duplikatów, muszę to określićX > 0
.;.0
Część jest tu z powodu błędu (enumerate nie działa na całkowitą 0).Główny predykat
Predykat 1
źródło
Python 2, 53 bajty
Przetestuj na Ideone .
źródło
f([1111111111111111])
to wyglądarepr(n)
zawiera'L'
iint('L')
rzucaValueError
. Czuję, że potrzebujeszstr(n)
tutaj?J,
3327 bajtów6 bajtów dzięki @miles .
W tłumaczach internetowych
inv
nie jest wprowadzany. Zmień to na^:_1
.Stosowanie
Gdzie
>>
jest STDIN i<<
STDOUT.Nieco golfa
Poprzednia 33-bajtowa wersja
Stosowanie
Gdzie
>>
jest STDIN i<<
STDOUT.Nieco golfa
źródło
f&.g
aby zastosowaćg
,f
a następnie odwrotnie,g
aby skrócić*:@<.@%:
do<.&.%:
zapisania 2 bajtów. Możesz go zmienić i użyć tylko parametru floor, aby uzyskać#~[:(=<.)@%:+/"1@(10&#.inv)
27 bajtów gdzieinv
jest^:_1
i jest już zdefiniowane.Javascript 66 bajtów
Dzięki za SergioFC za oszczędność 7 bajtów
źródło
c+d
zamiastc-+-d
? Ponadto możesz użyćn%1==0
do sprawdzenia, czy wynik jest liczbą całkowitą, więc może możesz zapisać niektóre bajty, używającb=>!(Math.sqrt((b+"").split``.reduce((c,d)=>c-+-d))%1)
do filtrowaniaPerl 5, 42 bajtów
41, plus 1 za
-pe
zamiast-e
Wyjaśnienie:
-p
pobiera każdą liczbę całkowitą wejściową w nowym wierszu i przypisuje$_
do tego ciągu.my$s
inicjuje zmienną$s
do zera, na nowo dla każdej liczby całkowitej wejściowej.map$s+=$_,/./g
pobiera każdy znak numeryczny i dodaje go liczbowo$s
. (Nowy wiersz staje się 0, gdy jest numerowany).sqrt$s==~~sqrt$s
sprawdza czy$s
posiada nonintegral pierwiastkowania, a$_ x=
marki$_
w siebie lub pusty ciąg w zależności od tego testu.-p
odbitki$_
Dzięki Brad Gilbert b2gills za oszczędność trzech bajtów.
Również 41 plus 1:
s/./$s+=$&/ger
dodaje każdy znak numeryczny do$s
(a nowa linia to 0 jak wyżej)źródło
JavaScript (Node.js) , 48 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
MATL,
161413 bajtówWypróbuj online!
Wyjaśnienie
źródło
Julia - 38 bajtów
Łatwo jest zobaczyć, co to robi.
digits
konwertuje liczbę na listę jej cyfr, wsum
ten sposób oblicza sumę cyfr,√
a następnie generuje liczbę całkowitą, jeśli liczba jest kwadratem, w przeciwnym razie będzie część ułamkowa.%1
zwróci tylko część ułamkową, a jeśli jest zero (==0
),filter
pozostanie na liście, w przeciwnym razie zostanie odfiltrowana.Użyty jako
![22228,4,113125,22345]
źródło
Jolf, 8 bajtów
Wypróbuj tutaj!
Wyjaśnienie
źródło
MATLAB,
524342 bajtyTworzy anonimowa funkcja o nazwie
ans
, która może być wywołana z tablicy jako dane wejściowe:ans([22228,4,113125,22345])
.Demo online . Demo online jest w Octave, które nie działa dla pustych danych wejściowych, ale MATLAB działa.
Wyjaśnienie
Konwertujemy każdy element w tablicy wejściowej na podstawę 10, co da tablicę znaków 2D, w której każdy wiersz zawiera cyfry liczby w tablicy. Aby przekonwertować te znaki na liczby, odejmujemy 48 (ASCII dla
'0'
). Następnie sumujemy w poprzek rzędów, pobieramy pierwiastek kwadratowy i ustalamy, czy każda wartość jest kwadratem idealnym~mod 1
. Następnie używamy tej wartości logicznej do filtrowania tablicy wejściowej.źródło
Clojure, 110 bajtów
Oblicza sumę cyfr liczbowych, a następnie odfiltrowuje te, dla których nie istnieje liczba, której kwadrat jest równy sumie.
Możesz zobaczyć wynik tutaj - https://ideone.com/ciKOje
źródło
Perl 6 ,
3835 bajtówTest:
źródło
C,
143141 bajtówUngolfed spróbuj online
źródło
Retina , 69
Ponieważ testowanie idealnych kwadratów w siatkówce. Można to zmodyfikować w celu uogólnionego obliczenia pierwiastka kwadratowego z liczby całkowitej .
Dane wejściowe to lista rozdzielona znakiem nowej linii.
Wypróbuj online.
a
a
unarną wyrażoną jakob
s, oddzieloną spacjamiźródło
%
konfiguracja\G
i przekazywanie referencji. Zapraszam do wzięcia: retina.tryitonline.net/… :)Python, 50 bajtów
Jeśli n jest wprowadzoną listą liczb
źródło
Rubinowy , 39 bajtów
Wypróbuj online!
źródło
K (oK) ,
191713 bajtówRozwiązanie:
Wypróbuj online!
Wyjaśnienie:
Uwagi:
źródło
func#list
) ?MathGolf ,
54 bajtówWypróbuj online!
Wyjaśnienie:
MathGolf jest wciąż w fazie rozwoju,
więc zakładam, że wkrótce pojawi się domniemany wkład, aby zgolić ten pierwszy bajt.Tak!źródło