Hip to be Square


44

Wyzwanie

Wydaje się, że chociaż mamy wiele wyzwań, które działają z liczbami kwadratowymi lub liczbami innych kształtów, nie mamy takiego, który po prostu pyta:

Podanie liczby całkowitej n(gdzie n>=0) jako wartości wejściowej zwraca prawdziwą wartość, jeśli njest to idealny kwadrat lub wartość falsey, jeśli nie.


Zasady

  • Możesz przyjmować dane za pomocą dowolnych rozsądnych i wygodnych środków, o ile pozwalają na to standardowe reguły we / wy .
  • Nie musisz obsługiwać danych wejściowych większych niż Twój wybrany język może natywnie obsługiwać, ani które prowadziłyby do niedokładności zmiennoprzecinkowych.
  • Wynik powinien być jedną z dwóch spójnych wartości prawda / falsey (np. trueLub false, 1lub 0) - prawda, jeśli wejście jest idealnym kwadratem, falsey, jeśli nie jest.
  • To jest więc wygrywa najmniej bajtów.

Przypadki testowe

Input:  0
Output: true

Input:  1
Output: true

Input:  64
Output: true

Input:  88
Output: false

Input:  2147483647
Output: false

@ Nee zdałem sobie sprawę z mojego błędu. Wycofuję tę sugestię, a zamiast tego oferuję 18014398509481982( 2**54-2), która jest reprezentowana przez podwójną, i powoduje, że odpowiedzi, które są używane, sqrtzawodzą.
Mego

@Mego Prawdopodobnie się mylę lub po prostu źle rozumiem, co mówisz, ale jestem pewien, że 2**54-2wciąż jest większy niż podwójny może bezpiecznie sobie poradzić, przynajmniej w JavaScript18014398509481982 > 9007199254740991
Tom

@Mego Myślę, że wartość graniczna to 9007199515875288. To nie jest kwadrat z 94906267, ponieważ nie jest to reprezentowalne w podwójnym, ale jeśli weźmiesz jego pierwiastek kwadratowy, to otrzymasz tę liczbę całkowitą.
Neil

@ Tom Wpisz 2**54-2do konsoli JS i porównaj to, co otrzymujesz 18014398509481982(dokładna wartość). JS generuje dokładną wartość, dlatego 2**54-2można ją przedstawić za pomocą podwójnej. Jeśli nadal Cię to nie przekonuje, weź dane binarne 0100001101001111111111111111111111111111111111111111111111111111, zinterpretuj je jako zmiennoprzecinkowe podwójnej precyzji IEEE-754 i zobacz, jaką wartość uzyskasz.
Mego

3
Przepraszam chłopaki, wyszedłem na lunch i ... no cóż, to się nasiliło! I pomyślałem, że będzie to miłe, proste wyzwanie! Czy dodanie reguły, że nie musisz obsługiwać danych wejściowych, które prowadzą do niedokładności zmiennoprzecinkowych w wybranym języku?
Shaggy

Odpowiedzi:


27

Neim , 2 bajty

q𝕚

Wyjaśnienie:

q      Push an infinite list of squares
 𝕚     Is the input in that list?

Kiedy mówię „nieskończony”, mam na myśli, aż osiągniemy maksymalną wartość długich (2 ^ 63-1). Jednak Neim (powoli) przechodzi do teoretycznie nieskończenie dużych BigIntegers.

Spróbuj!


Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Dennis

Ciekawy. Czy to buforuje wstępnie listę, czy jest to generator / iterator, który kontynuuje sprawdzanie istnienia danych wejściowych, dopóki się nie zakończy?
Patrick Roberts,

@PatrickRoberts Czy możemy rozmawiać na czacie?
Okx,

Jasne, po prostu pinguj mnie w The Nineteenth Byte . Czasami tam jestem.
Patrick Roberts,

Cóż, to jest ... NAPRAWDĘ FUNKCJONALNE
Chromium


8

TI-Basic, 4 bajty

not(fPart(√(Ans

Po prostu sprawdza, czy pierwiastek kwadratowy jest liczbą całkowitą, szukając niezerowej części ułamkowej / dziesiętnej.


Czy możesz dodać TIO (lub równoważny)?
Kudłaty

@Shaggy Nie sądzę, że są. TI-Basic jest zastrzeżony i będzie działał tylko na kalkulatorach TI i emulatorach uruchamiających ROM z kalkulatora, więc nie możesz legalnie używać TI-Basic, jeśli nie posiadasz kalkulatora.
Adám

1
@Shaggy Jeśli masz jakieś ROM-y, możesz użyć emulatora (moje preferencje to jstified), aby wypróbować to online.
Timtech

8

C #, 27 bajtów

n=>System.Math.Sqrt(n)%1==0

Bardziej poprawnym / dokładnym sposobem na to byłoby:

n=>System.Math.Sqrt(n)%1<=double.Epsilon*100

double.Epsilon jest bezużyteczny dla tego rodzaju kontroli . tl; dr: Porównując liczby> 2, Double.Epsilon jest zasadniczo taki sam jak zero. Mnożenie przez 100 tylko trochę to opóźni.
Robert Fraser

@RobertFraser Przeszedłem tylko przez połączony post SO i nie przeczytałem w nim zbyt wiele. Tak czy inaczej, nie jest to bezużyteczne po prostu nieużyteczne przy wyższych liczbach.
TheLethalCoder

...<int>==0jest ...!<int>myślę
Stan Strum

@StanStrum Not in C #
TheLethalCoder

7

JavaScript (ES6), 13 bajtów

n=>!(n**.5%1)

Zwraca wartość true, jeśli pierwiastek kwadratowy z n jest liczbą całkowitą.

Skrawek:

f=
n=>!(n**.5%1)

console.log(f(0));
console.log(f(1));
console.log(f(2));
console.log(f(4));
console.log(f(8));
console.log(f(16));
console.log(f(88));
console.log(f(2147483647));


7

dc, 9

0?dvd*-^p

Wyjście 1 dla prawdy i 0 dla falsey.

Wypróbuj online .

0            # Push zero.  Stack: [ 0 ]
 ?           # Push input.  Stack: [ n, 0 ]
  dv         # duplicate and take integer square root.  Stack: [ ⌊√n⌋, n, 0 ]
    d        # duplicate.  Stack: [ ⌊√n⌋, ⌊√n⌋, n, 0 ]
     *       # multiply.  Stack: [ ⌊√n⌋², n, 0 ]
      -      # take difference. Stack: [ n-⌊√n⌋², 0 ]
       ^     # 0 to power of the result.  Stack: [ 0^(n-⌊√n⌋²) ]
        p    # print.

Nuty dc„s ^polecenia potęgowanie daje 0 0 = 1 i 0 n = 0, gdzie n> 0.


Piękny! +1 za użycie dcw tak genialny sposób.
Wildcard,

6

Siatkówka , 18 bajtów

.+
$*
(^1?|11\1)+$

Wypróbuj online! Bezwstydnie zaadaptowano z odpowiedzi @ MartinEnder na: Czy ta liczba jest trójkątna? ale z podstawową konwersją zawartą w cenie 6 bajtów.

Zauważ, że Czy ta liczba jest trójkątna? nie było z jakiegoś niewytłumaczalnego powodu wymaganego do obsługi zera jako liczby trójkątnej, więc częścią adaptacji było dodanie a, ?aby wiodący 1 był opcjonalny, pozwalając grupie dopasować pusty ciąg, a zatem zero danych wejściowych. Jednak po dopasowaniu pustego łańcucha +operator przestaje powtarzać, aby uniknąć nieskończonej pętli, która miałaby miejsce, gdyby zachłannie pasował do pustego łańcucha (w końcu ^1?z pewnością nadal pasowałby). Oznacza to, że nawet nie próbuje dopasować innej alternatywy w grupie, unikając w ten sposób dopasowania 2, 6, 12 itd. Jak wskazuje @MartinEnder, prostszym sposobem uniknięcia tego, wciąż dopasowując pusty ciąg, jest: zakotwiczyć meczu na początku robiąc ewentualną grupę o tej samej liczbie bajtów: ^(^1|11\1)*$.


Czekamy na wyjaśnienie, dlaczego to nie pasuje 2, 6lub inne numery formularza n^2-n. ;) (Sposobem na uniknięcie tego wyjaśnienia dla tej samej liczby bajtów byłoby ^(^1|11\1)*$.)
Martin Ender

@MartinEnder samego powodu, że nie można wykorzystać (^|1\1)+$, jak sądzę?
Neil

Tak to prawda. Pomyślałem, że prawdopodobnie warto o tym wspomnieć, ponieważ większość ludzi prawdopodobnie nie przeczytała mojego komentarza do trójkątnej odpowiedzi (i w tym przypadku jest to istotne, dlaczego rozwiązanie jest prawidłowe, a nie tylko dlatego, że nie można dalej grać w golfa ).
Martin Ender

Dla przypomnienia, +przestałby również zapętlać się, gdyby nie było już pustej alternatywy, np. W przypadku ((?(1)11\1|1?))+. Gdy pojawi się pusta iteracja, nie będzie próbowała żadnych dalszych, niezależnie od tego, czy mogą być puste.
Martin Ender

@MartinEnder Rzeczywiście, miałem na myśli „teraz dopasowałem” zamiast „od razu dopasowałem”. Naprawiony.
Neil


6

MATL , 5 4 bajtów

Dzięki Luisowi za skrócenie mojego jednego bajtu dłuższego kodu o dwa bajty, co czyni go najkrótszym.

t:Um

Wypróbuj online

Wyjaśnienie:

         % Implicit input
t        % Duplicate it
 :       % Range from 1 to input value
  U      % Square the range, to get 1 4 9 ... 
   m     % ismember, Checks if the input is a member of the range of perfect squares

Stara odpowiedź:

X^1\~

Wypróbuj online!

        % Implicit input
X^      % Square root of input
  1\    % Modulus 1. All perfect squares will have 0, the rest will have decimal value
     ~  % Negate, so the 0 becomes 1, and the decimal values become 0

@Mego Nie zgadzam się. MATL nawet nie potrafi mod(2**127-, 1000). Chyba że cztery ostatnie cyfry to 0 ....
Stewie Griffin

Możesz także użyć t:Um. Działa to dla danych wejściowych do2^53 , ze względu na ograniczoną precyzję zmiennoprzecinkową
Luis Mendo

Widzę teraz, że jest to podobne do twojej edycji, tylko trochę krótsze :-)
Luis Mendo

Dobrze ukryte kwadratowe polecenie! U: str2num / string to array / square. Wiedziałem, że musi być funkcja kwadratowa, ale nie mogłem jej znaleźć ...
Stewie Griffin

1
@cairdcoinheringaahing, który był częściowo celowy. Miałem dwa rozwiązania, jedno miało 5 bajtów, drugie 6 bajtów. Luis grał w golfa dwa bajty od jednego z 6. Więc dzięki niemu zaoszczędziłem dwa bajty, ale zapisałem tylko bajt na wynik ...
Stewie Griffin

6

Python 3 , 40 38 bajtów

Dzięki kałamarnicy za oszczędność 2 bajtów!

lambda n:n in(i*i for i in range(n+1))

Wypróbuj online!

Zbyt wolno, aby odpowiedzieć 2147483647w rozsądnym czasie. (Ale napisane przy użyciu generatora do oszczędzania pamięci, ponieważ nie kosztuje to żadnych bajtów.)

Działa również w Pythonie 2, chociaż OverflowErrorjest to możliwe, ponieważ rangejeśli wypróbujesz go z dużymi wejściami. (A MemoryErrorbyłoby również prawdopodobne w Pythonie 2, również z powodu range.)


5

Perl 5 , 14 bajtów

13 bajtów kodu + -pflaga.

$_=sqrt!~/\./

Wypróbuj online!

Oblicza pierwiastek kwadratowy i sprawdza, czy jest to liczba całkowita (a dokładniej, jeśli nie zawiera kropki ( /\./).


5

05AB1E , 4 bajty

Ln¹å

Wypróbuj online!


Na przykład nie działa dla dużych liczb4111817668062926054213257208
Emigna

@Emigna Och, bo uważa się to za długi? Myślałem, że 05AB1E używa Pythona 3.
Erik the Outgolfer

Nie działa w przypadku dużych nakładów (podane dane wejściowe są 2**127-1liczbą pierwszą Mersenne).
Mego

Wykorzystuje Python 3. Problem polega na tym, że pierwiastek kwadratowy powoduje błędy zaokrąglania dla dużych liczb.
Emigna

@Emigna Oh ... Chyba będę musiał wymyślić inny sposób, to nie powinno być trudne.
Erik the Outgolfer

5

Python 3 , 19 bajtów

lambda n:n**.5%1==0

Wypróbuj online!


Nie działa w przypadku dużych nakładów, np 4111817668062926054213257208.
L3viathan

Naprawiono w 25 bajtach:lambda n:int(n**.5)**2==n
L3viathan

4
@ L3viathan That (wraz z jakimkolwiek rozwiązaniem z tym związanym sqrt) zawodzi w przypadku wartości, które są poza zakresem podwójnego, na przykład 2**4253-1.
Mego

@ totalniehuman pływak po %1jest zdecydowanie <1, więc twoja propozycja zwróci prawdę dla wszystkich danych wejściowych. Zauważ, że n**.5jest to liczba zmiennoprzecinkowa.
Leaky Nun

5

SageMath , 9 bajtów

is_square

Wypróbuj online

Wbudowana funkcja robi dokładnie to, co mówi na puszce. Ponieważ Sage wykorzystuje obliczenia symboliczne, jest wolny od błędów dokładności obliczeniowej, które nękają IEEE-754.


5

Japt , 3 bajty

¬v1

Wypróbuj online!

Wygląda na to, że dobrze działa 2**54-2w Japt Interpreter, ale z jakiegoś powodu zawodzi w TIO ...


Nie działa w przypadku dużych nakładów (wejście jest 2**127-1liczbą pierwszą Mersenne).
Mego

@Mego, czy nie jest normą, że rozwiązania nie muszą obsługiwać liczb większych niż język jest w stanie obsłużyć?
Kudłaty

@Shaggy Japt jest oparty na JavaScript, który wykorzystuje zmiennoprzecinkowe podwójnej precyzji. 2**127-1jest w zakresie podwójnej.
Mego

2
@Mego Czy maksymalna bezpieczna int dla JavaScript 2**53-1?
Tom

3
@Mego Ale liczby JavaScript mają tylko 53 bity dokładności, więc JS nie może dokładnie przedstawić wartości 2**127-1jako liczby. Najbliżej może to zrobić 2**127.
ETHproductions

5

Haskell, 26 24 bajtów

f n=elem n$map(^2)[0..n]

Wypróbuj online!

Sprawdza, czy n znajduje się na liście wszystkich kwadratów od 0do n.


1
ta sama liczba bajtów: f n=or[i*i==n|i<-[0..n]]:)
vroomfondel


5

MathGolf , 1 bajt

°

Wypróbuj online!

Nie sądzę, żeby potrzebne było wyjaśnienie. Zanim zobaczyłem to wyzwanie, widziałem potrzebę operatora „jest to idealny kwadrat”, ponieważ język jest zaprojektowany do rozwiązywania problemów matematycznych związanych z golfem. Zwraca 0 lub 1, ponieważ MathGolf używa liczb całkowitych do reprezentowania wartości logicznych.


4

PHP, 21 bajtów

<?=(-1)**$argn**.5<2;

Jeśli pierwiastek kwadratowy nie jest liczbą całkowitą, (-1)**$argn**.5to NAN.


Jak to uruchomić?
Titus

@Titus Z -Fflagą i rurociągu: echo 144 | php -F script.php.
user63956,

Ach, fzapomniałem tego listu. Dzięki.
Titus

4

Rubin, 25 bajtów

Math.sqrt(gets.to_i)%1==0

Prawdopodobnie jest krótsza droga, ale to wszystko, co znalazłem.

Wypróbuj online!


Witamy w PPCG :) Czy możesz dodać do tego TIO (lub odpowiednik)?
Shaggy

Dzięki za dodanie TIO, nie wydaje się, aby zwróciło to jakiekolwiek wyjście.
Kudłaty

Mój zły, zaktualizowałem to.
Gregory

Nie, wciąż nie działa.
Kudłaty

3

CJam , 8 bajtów

ri_mQ2#=

Wypróbuj online!

Wyjaśnienie

Liczba całkowita pierwiastek kwadratowy, kwadrat, porównaj z oryginalnym numerem.


Myślę, że zgodnie z tym , nie potrzebujesz pierwszych 2 bajtów
Chromium

I alternatywnie, korzystając z idei tej odpowiedzi , możesz zrobić mq1%0=, która ma również 6 bajtów
Chromium

@Chromium Dzięki, ale w takim przypadku muszę {... }aby kod działał, więc liczy się ten sam bajt
Luis Mendo

Właściwie jestem trochę zdezorientowany, czy dodać nawiasy klamrowe, czy nie. Ponieważ jeśli ich nie dodasz, jest to program, który jest dozwolony.
Chromium

@Chromium Program musi wziąć swój wkład, więc rijest to wymagane w tym przypadku
Luis Mendo



3

AWK , 27 + 2 bajty

{x=int($0^0.5);$0=x*x==$1}1

Wypróbuj online!

Dodaj +2bajty dla użycia -Mflagi dla dowolnej precyzji. Pierwotnie użyłem porównania ciągów, ponieważ duża liczba była równa, mimo że nie były, ale sqrtzwracała również nieprecyzyjne wartości. 2^127-2nie powinien być idealnym kwadratem.


3

T-SQL, 38 bajtów

SELECT IIF(SQRT(a)LIKE'%.%',0,1)FROM t

Szuka kropki dziesiętnej w pierwiastku kwadratowym. IIFjest specyficzny dla MS SQL, przetestowany i działa w MS SQL Server 2012.

Dane wejściowe znajdują się w kolumnie a istniejącej tabeli t , zgodnie z naszymi regułami wprowadzania danych .


3

Ohm , 2 bajty

Ʋ

Używa CP-437kodowania.

Wyjaśnienie

Implikowane dane wejściowe -> Idealny wbudowany kwadrat -> Implikowane dane wyjściowe ...


3

Java 8, 20 bajtów

n->Math.sqrt(n)%1==0

Dane wejściowe to int.

Wypróbuj tutaj.


Nie podlega dyskusji: pytanie wyraźnie mówi „Biorąc pod uwagę liczbę całkowitą n (gdzie n> = 0)”. Najkrótsza odpowiedź jest najlepsza. Edycja: nie daje +1, dopóki najkrótsza odpowiedź nie będzie pierwsza: p
Olivier Grégoire

@ OlivierGrégoire Hmm, to dobry sposób, aby na to spojrzeć. Ale nadal nie wiem, czy to jest int, long, short. W przypadku pytań, w których pytają o liczbę całkowitą, ale format wejściowy jest elastyczny, czasami używam danych wejściowych String, aby zapisać niektóre bajty. Osobiście uważam, że używanie n->jest w porządku i powinieneś po prostu określić, jaki jest typ, ale najwyraźniej nie wszyscy się z tym zgadzają. Z drugiej strony, pochodzące z historii odpowiedzi Java 7, począwszy odint c(int n){return ...;} do (int n)->...ma więcej sensu niż n->...(chociaż osobiście wolę drugą, ponieważ krótsza oczywiście).
Kevin Cruijssen

2
@ OlivierGrégoire Ok, zmieniłem to. Po przeczytaniu dyskusji w tej odpowiedzi doszedłem do wniosku, że stwierdzenie wejścia jest liczbą całkowitą w Javie, nie ma różnicy niż stwierdzenie, że wejście jest listą dwóch ciągów w CJam lub tablicą komórek ciągów w MATL .
Kevin Cruijssen


3

Dodaj ++ , 24 13 11 bajtów

+?
S
%1
N
O

Wypróbuj online!

Usunąłem niezgrabną funkcję u góry i przepisałem ją do treści pytania, aby usunąć 11 bajtów.

Ponieważ pierwsza sekcja została już wyjaśniona poniżej, dowiedzmy się tylko, jak działa nowa część

S   Square root
%1  Modulo by 1. Produced 0 for integers and a decimal for floats
N   Logical NOT

Stara wersja, 24 bajty

D,i,@,1@%!
+?
^.5
$i,x
O

Wypróbuj online!

Funkcja na górze ( D,i,@,1@%!) jest główną częścią programu, więc przejdźmy bardziej szczegółowo.

D,     Create a function...
  i,   ...called i...
  @,   ...that takes 1 argument (for this example, let's say 3.162 (root 10))
    1  push 1 to the stack; STACK = [1, 3.162]
    @  reverse the stack;   STACK = [3.162, 1]
    %  modulo the stack;    STACK = [0.162]
    !  logical NOT;         STACK = [False]

+?     Add the input to accumulator (x)
^.5    Square root (exponent by 0.5)
$i,x   Apply function i to x
O      Output the result

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.