Kare olmak Hip


44

Meydan okuma

Öyleyse, görünen o ki, kare sayılarla veya başka şekillerle çalışan birçok zorluğumuz varken, basitçe şunu soran bir şeye sahip değiliz:

Girilen bir tamsayı n(burada n>=0) verilirse n, eğer mükemmel bir kare ise gerçek bir değer, eğer değilse bir falsey değeri verir .


kurallar

  • Standart G / Ç kurallarının izin verdiği sürece herhangi bir makul, uygun yoldan girdi alabilirsiniz .
  • Seçtiğiniz dilin doğal olarak idare edebileceğinden veya kayan nokta yanlışlıklarına yol açacak olandan daha büyük girdilerle uğraşmanıza gerek yok.
  • Çıktı iki tutarlı truthy / Falsey değerlerine (örneğin, biri olmalıdır trueveya false, 1ya 0girdi mükemmel bir kare eğer değilse Falsey, truthy -).
  • Bu yani en düşük bayt sayısı kazanır.

Test Kılıfları

Input:  0
Output: true

Input:  1
Output: true

Input:  64
Output: true

Input:  88
Output: false

Input:  2147483647
Output: false

@ Neil Hatamı farkettim. O öneriyi geri çekin ve yerine teklif 18014398509481982( 2**54-2ki) olduğu bir çift ile gösterilebilen ve kullanımı bu cevapları neden sqrtbaşarısız.
Mego

@Mego Muhtemelen yanlıştım ya da sadece söylediklerinizi yanlış anlıyorum, ama eminim 2**54-2hala bir çiftin güvenle kullanabileceğinden daha büyük, en azından JavaScript'te18014398509481982 > 9007199254740991
Tom

@Mego sınır değerinin 9007199515875288 olduğunu düşünüyorum.
Neil

@Tom 2**54-2Bir JS konsoluna yazın ve ne ile karşılaştığınızı karşılaştırın 18014398509481982(kesin değer). JS, tam değeri verir, bu nedenle 2**54-2bir çift ile temsil edilebilir. Bu sizi hala ikna edemiyorsa, ikili verileri alın 0100001101001111111111111111111111111111111111111111111111111111, bir IEEE-754 çift duyarlıklı şamandıra olarak yorumlayın ve hangi değeri aldığınızı görün.
Mego

3
Üzgünüm beyler, öğle yemeği için ayrıldılar ve ... peki, bu tırmandı! Ve orada bunun basit ve basit bir meydan okuma olacağını düşündüm! Seçtiğiniz dilde kayan nokta yanlışlıklarına yol açan girdilerle başa çıkmanız gerekmeyen bir kural eklemek onu kapsar mı?
Shaggy

Yanıtlar:


27

Neim , 2 bayt

q𝕚

Açıklama:

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

'Sonsuz' derken, maksimum değere (2 ^ 63-1) ulaşana kadar demek istiyorum. Ancak, Neim (yavaşça) teorik olarak sonsuz büyük BigIntegers'a geçiş yapıyor.

Dene!


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Dennis,

İlginç. Öyleyse, bu liste ön tamponlama yapıyor mu yoksa sona erene kadar girişin varlığını kontrol etmeye devam eden bir jeneratör / yineleyici mi?
Patrick Roberts

@PatrickRoberts Sohbette konuşabilir miyiz?
Okx,

Tabii, sadece On Dokuzuncu Bayt'ta bana ping atıyorum . Bazen oradayım.
Patrick Roberts

Peki, bu ... GERÇEKTEN FONKSİYONEL
Chromium


8

TI-Basic, 4 bayt

not(fPart(√(Ans

Basit olmayan bir kesir / ondalık kısmı arayarak kare kök bir tamsayı olup olmadığını kontrol eder.


Bir TIO (veya eşdeğeri) ekleyebilir misiniz?
Shaggy

@Shaggy Herhangi bir şey olduğunu sanmıyorum. TI-Basic tescillidir ve yalnızca TI hesap makinelerinde ve hesap makinesinde ROM çalıştıran öykünücülerinde çalışır; bu nedenle, hesap makineniz yoksa yasal olarak TI-Basic kullanamazsınız.
Adem

1
@Shaggy Herhangi bir ROM'unuz varsa, çevrimiçi olarak denemek için bir emülatör kullanabilirsiniz (benim tercihim jstified).
Timtech

8

C #, 27 bayt

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

Bunu yapmanın daha doğru / doğru bir yolu olacaktır:

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

double.Epsilon bu kontrol için işe yaramaz . tl; dr:> 2 sayılarını karşılaştırırken, Double.Epsilon temelde sıfırla aynıdır. 100 ile çarpmak sadece biraz geciktirir.
Robert Fraser,

@RobertFraser Ben sadece bağlı SO postası tarafından gittim ve içine fazla bir şey okumadım. Her iki durumda da, yüksek sayılarda faydalı olmamak işe yaramaz değildir.
TheLethalCoder

...<int>==0olduğunu ...!<int>düşünüyorum
Stan Strum

@StanStrum C # değil
TheLethalCoder

7

JavaScript (ES6), 13 bayt

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

N'nin karekökü bir tam sayıysa true değerini döndürür.

Parça, parçacık:

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

Truthy için 1 ve falsey için 0 çıktılar.

Çevrimiçi deneyin .

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.

Not dc'un ^üsteleme komutu 0 0 = 1 ve 0 n = 0 verir, burada n> 0 olur.


Güzel! dcBöyle ustaca kullanmak için +1 .
Joker

6

Retina , 18 bayt

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

Çevrimiçi deneyin! @ MartinEnder'in cevabından utanmadan adapte edildi Bu sayı üçgen mi? ancak temel dönüşüm 6 baytlık bir fiyata dahildir.

Not: Bu sayı üçgen mi? sıfırı üçgen bir sayı olarak desteklemek için gerekli olan açıklanamaz bir sebep değildi, bu yüzden uyarlamanın bir kısmı ?öncü 1'i isteğe bağlı kılmak, grubun boş dize ile eşleşmesini sağlamak ve böylece sıfır girişini sağlamaktı. Bununla birlikte, şimdi boş dizgiyi eşleştirdikten sonra, +operatör boş bir şekilde eşleştirmeye devam ederse gerçekleşecek olan sonsuz döngüyü önlemek için tekrar etmeyi durdurur (sonuçta ^1?kesinlikle eşleşir ). Bu, gruptaki diğer alternatifi eşleştirmeye bile çalışmadığı anlamına gelir, böylece 2, 6, 12 vb. Karşılaşmadan kaçınır. @MartinEnder'in işaret ettiği gibi, boş dizgeyi eşleştirmeye devam ederken bundan kaçınmanın daha basit bir yolu aynı bayt sayım için grup isteğe yaparken başlangıcında maçı demirlemek: ^(^1|11\1)*$.


Senin açıklama bekliyorum neden bu uymuyor 2, 6ya formunun diğer numaralar n^2-n. ;) (Aynı bayt sayısı için bu açıklamayı engellemenin bir yolu olacaktır ^(^1|11\1)*$.)
Martin Ender

@MartinEnder Kullanamamanızın aynı nedeni, (^|1\1)+$sanırım?
Neil

Evet bu doğru. Söylemenin iyi olacağını düşündüm, çünkü çoğu insan üçgen cevap hakkında yorumumu okumamış olabilir (ve bu durumda, çözümün neden doğru olduğu ile ilgili, sadece neden daha fazla golf oynayamayacağı ile ilgili). ).
Martin Ender

Kayıt için, +artık boş bir alternatif olmasaydı, örneğin döngüyü durdururdu ((?(1)11\1|1?))+. Boş bir yineleme gerçekleştiğinde, boş olsun ya da olmasın, başka bir şey denemez.
Martin Ender

@MartinEnder Gerçekten, "hemen eşleşmek" yerine "şimdi eşleştiriliyor" demek istedim. Sabit.
Neil


6

MATL , 5 4 bayt

Bir bayt daha uzun kodumu iki bayt azalttığım için Luis'e teşekkürler, en kısa şifresini verdim.

t:Um

Çevrimiçi deneyin

Açıklama:

         % 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

Eski cevap:

X^1\~

Çevrimiçi deneyin!

        % 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 katılmıyorum. MATL bile yapamıyor mod(2**127-, 1000). Son dört rakam 0 olmadıkça ....
Stewie Griffin 12

Ayrıca kullanabilirsiniz t:Um. Bu , kayan nokta sınırlı hassasiyetinden kaynaklanan girişler için2^53 çalışır
Luis Mendo

Bunun düzenlemenize benzer olduğunu şimdi anlıyorum, sadece biraz daha kısa :-)
Luis Mendo

Peki gizli kare komutu! U: str2num / string to array / square. Kare bir fonksiyon olması gerektiğini biliyordum, ama bulamadım ...
Stewie Griffin

1
@cairdcoinheringaahing kısmen bilerek yaptı. İki çözümüm vardı, biri 5 bayt, diğeri 6 bayt. Luis, 6'dan biri ile iki baytlık golf attı. Bu yüzden onun sayesinde iki bayt kurtardım, ancak sadece skorda bir bayt biriktirdim ...
Stewie Griffin 20

6

Python 3 , 40 38 bayt

2 bayt kaydettiğiniz için kalamar teşekkürler!

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

Çevrimiçi deneyin!

2147483647Makul bir sürede yanıtı geri göndermek için çok yavaş . (Ancak herhangi bir byte'a mal olmadığından hafıza tasarrufu için bir jeneratör kullanarak yazılmıştır.)

Python 2'de de çalışır, ancak büyük girdilerle denediğiniz için OverflowErrorbir olasılık rangeolabilir. (A MemoryErrorayrıca Python 2'de de olabilir range.)


5

Perl 5 , 14 bayt

13 baytlık kod + -p bayrak.

$_=sqrt!~/\./

Çevrimiçi deneyin!

Karekökü hesaplar ve bir tamsayı olup olmadığına bakar (daha doğrusu bir nokta içermiyorsa ( /\./).


5

05AB1E , 4 bayt

Ln¹å

Çevrimiçi deneyin!


Örneğin, büyük sayılar için çalışmıyor4111817668062926054213257208
Emigna

@Emigna Oh, çok uzun olduğu düşünülüyor mu? 05AB1E'nin Python 3 kullandığını düşündüm.
Outgolfer Erik

Büyük girişler için başarısız (verilen giriş 2**127-1Mersenne prime).
Mego

Python 3 kullanıyor. Problem karekökünün büyük sayılar için yuvarlama hataları vermesidir.
Emigna

@Emigna Oh ... Sanırım o zaman başka bir yol bulmam gerekecek, zor olmamalı.
Outgolfer Erik,

5

Python 3 , 19 bayt

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

Çevrimiçi deneyin!


Büyük girişler için başarısız, örn 4111817668062926054213257208.
L3viathan

25 lambda n:int(n**.5)**2==n
baytta

4
@ L3viathan Bu, (dahil olan herhangi bir çözümle birlikte sqrt), çift gibi aralığın dışındaki değerler üzerinde başarısız olur 2**4253-1.
Mego

@totallyhuman sonra bir float %1kesinlikle <1, bu nedenle teklifiniz tüm girdiler için doğru olacaktır. Bunun n**.5bir şamandıra olduğuna dikkat edin .
Leaky Rahibe

5

SageMath , 9 bayt

is_square

Çevrimiçi deneyin

Yerleşik işlevi tam olarak kalayda söylediğini yapar. Sage, sembolik hesaplama kullandığı için, IEEE-754'ü yüzdüren hesaplama doğruluğu hataları ücretsizdir.


5

Japt , 3 bayt

¬v1

Çevrimiçi deneyin!

İçin çalışma cezası gibi görünüyor 2**54-2içinde Japt yorumlayıcı ama nedense TIO üzerinde başarısız ...


Büyük girişler için başarısız (giriş, 2**127-1Mersenne prime).
Mego

@Mego, çözümlerin dilin idare edebileceğinden daha büyük sayılarla başa çıkmasına gerek duymayan norm değil mi?
Shaggy

@Shaggy Japt, çift duyarlıklı kayan nokta kullanan JavaScript'i temel almaktadır. 2**127-1bir çift aralığında iyi.
Mego

2
@Mego JavaScript için maksimum güvenli int değil 2**53-1mi?
Tom

3
@Mego Ancak JavaScript'in sayıları yalnızca 53 bit hassasiyete sahiptir, bu nedenle JS değeri tam olarak sayı olarak gösteremez2**127-1 . Alabileceği en yakın şey 2**127.
ETHproductions



5

MathGolf , 1 bayt

°

Çevrimiçi deneyin!

Bir açıklamanın gerekli olduğunu sanmıyorum. Dil, matematikle ilgili golf zorluklarını ele almak için tasarlandığından, bu zorluğu görmeden önce "mükemmel bir kare" operatörü ihtiyacını gördüm. MathGolf, boole'ları temsil etmek için tamsayılar kullandığından 0 veya 1 değerini döndürür.


4

PHP, 21 bayt

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

Karekök tam sayı değilse, (-1)**$argn**.5bir NAN.


Bunu nasıl çalıştırırım?
Titus

İle @Titus -Fbayrak ve boru hattı: echo 144 | php -F script.php.
user63956

Ah, fo mektubu aldım . Teşekkürler.
Titus

4

Yakut, 25 bayt

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

Muhtemelen daha kısa bir yol var ama tüm bulduğum bu.

Çevrimiçi deneyin!


PPCG'ye Hoşgeldiniz :) Buna bir TIO (veya eşdeğeri) ekleyebilir misiniz lütfen?
Shaggy

Ancak TIO'yu eklediğiniz için teşekkür ederiz, bu herhangi bir çıktı vermedi.
Shaggy

Benim hatam, güncelledim.
Gregory,

Hayır, hala çalışmıyor.
Shaggy,

3

CJam , 8 bayt

ri_mQ2#=

Çevrimiçi deneyin!

açıklama

Tamsayı karekök, kare, orijinal sayı ile karşılaştırın.


Ben göre sanırım bu , ilk 2 bayt gerekmez
Chromium

Ve alternatif olarak, bu cevabın fikrini kullanarak, mq1%0=6 byte olan da yapabilirsiniz
Chromium

@ Kromrom Teşekkürler, ama bu durumda ihtiyacım olan {... }kodu bir fonksiyon haline getirmek için, yani aynı byte sayımı
Luis Mendo

Aslında, kaşlı ayraç eklenip eklenmeyeceği konusunda biraz kafam karıştı. Çünkü onları eklemezseniz, aslında izin verilen bir program.
Chromium

@ Krom Bir programın giriş riyapması gerekiyor, bu durumda gereklidir
Luis Mendo



3

AWK , 27 + 2 bayt

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

Çevrimiçi deneyin!

Bayrağı keyfi bir şekilde +2kullanmak için bayt ekleyin -M. Orijinal olarak string karşılaştırmasını kullandım, çünkü büyük sayı eşit olmasalar bile karşılaştırıldı, fakat sqrtaynı zamanda kesin olmayan değerler de verdi. 2^127-2mükemmel bir kare olmamalıdır.


3

T-SQL, 38 bayt

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

Karekökünde ondalık nokta arar. IIFMS SQL'e özgü, test edilmiş ve MS SQL Server 2012'de çalışıyor.

Giriş kolonu olan a , önceden var olan Tablo t başına eden giriş kuralları .


3

Ohm , 2 bayt

Ʋ

CP-437Kodlamayı kullanır .

açıklama

Örtülü Girdi -> Mükemmel kare yerleşik -> Örtülü Çıktı ...


3

Java 8, 20 bayt

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

Giriş bir int.

Burada dene.


Tartışılmaz: soru açıkça "n bir tamsayı verilir (burada n> = 0)" diyor. En kısa cevap en iyisidir. Düzenleme: en kısa cevap ilk olana kadar +1 olmaz: p
Olivier Grégoire

@ OlivierGrégoire Hmm, ona bakmak için iyi bir yol. Ama hala bir olup olmadığını bilmiyorsunint , long, short. Ve bir tamsayı istedikleri ancak giriş formatının esnek olduğu sorularla bazen bazı baytları kaydetmek için bir String girişi kullanırım. Şahsen ben kullanmanın n->iyi olduğunu düşünüyorum ve sadece türün ne olduğunu belirtmelisiniz, ama görünüşe göre herkes buna katılmıyor. Öte yandan, Java 7'nin yanıtlama geçmişinden int c(int n){return ...;}gelmek (int n)->..., bundan daha mantıklı olmaktan çıkmaktadır n->...(kişisel olarak daha kısa zamandan beri ikinciyi tercih etsem bile).
Kevin Cruijssen

2
@ OlivierGrégoire Tamam, değiştirdim. Bu cevaptaki tartışmayı okuduktan sonra , girişin Java'da bir tamsayı olduğunu belirtmek, girişin CJam'daki iki Dizgenin bir listesi veya MATL'deki bir dizgilerin bir dizisi olduğu sonucuna vardım .
Kevin Cruijssen


3

++ , 24 13 11 bayt ekleyin

+?
S
%1
N
O

Çevrimiçi deneyin!

Tepedeki fonksiyonu kaldırdım ve 11 baytı kaldırmak için soruyu gövdesine yeniden yazdım.

İlk bölüm aşağıda açıklandığı gibi, sadece yeni bölümün nasıl çalıştığını bulalım.

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

Eski versiyon, 24 bayt

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

Çevrimiçi deneyin!

Üstteki işlev ( D,i,@,1@%!) programın ana kısmıdır, bu yüzden daha ayrıntılı olarak ele alalım.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.