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.