Comment se termine le carré?


20

En Base-10, tous les carrés parfaits se terminent par 0 , 1 , 4 , 5 , 6 ou 9 .

En Base-16, tous les carrés parfaits se terminent par 0 , 1 , 4 ou 9 .

Nilknarf décrit pourquoi c'est et comment cela fonctionne très bien dans cette réponse, mais je vais également donner une brève description ici:

Lors de la mise au carré d'un nombre Base-10, N , le chiffre "un" n'est pas affecté par ce qui est dans le chiffre "dizaines" ou le chiffre "centaines", et ainsi de suite. Seul le chiffre "uns" dans N affecte le chiffre "uns" dans N 2 , donc un moyen facile (mais peut-être pas le plus golfique) de trouver tous les derniers chiffres possibles pour N 2 est de trouver n 2 mod 10 pour tous 0 <= n < 10 . Chaque résultat est un dernier chiffre possible. Pour Base-m, vous pouvez trouver n 2 mod m pour tous les 0 <= n < m .

Écrivez un programme qui, quand on lui donne l'entrée N , sort tous les derniers chiffres possibles pour un carré parfait en Base-N (sans doublons). Vous pouvez supposer que N est supérieur à 0 et que N est suffisamment petit pour que N 2 ne déborde pas (si vous pouvez tester jusqu'à N 2 , je vous donnerai une quantité finie de points brownie, mais sachez que le taux de change des points brownie en points réels est de l'infini à un).

Tests:

 Input -> Output
 1     -> 0
 2     -> 0,1
 10    -> 0,1,5,6,4,9
 16    -> 0,1,4,9
 31    -> 0,1,2,4,5,7,8,9,10,14,16,18,19,20,25,28
 120   -> 0,1,4,9,16,24,25,36,40,49,60,64,76,81,84,96,100,105

c'est du , donc des règles standards s'appliquent!

(Si vous trouvez cela trop facile, ou si vous voulez une question plus approfondie sur le sujet, considérez cette question: Couverture minimale des bases pour les tests de résidus quadratiques de l'équerrage ).


1
Le tableau de sortie doit-il être trié?
Shaggy

@Shaggy Nope! Mego, la duplication n'est pas autorisée. Théoriquement, N pourrait être énorme, donc les doublons rendraient la sortie assez illisible. Je vais ajouter la question
Lord Farquaad

La sortie d'un ensemble est-elle acceptable?
2017 totalement humain

2
@totallyhuman Pourquoi ne serait-il pas valable? Les ensembles sont des collections non ordonnées et il ne faut pas les trier , alors ...
M. Xcoder

Réponses:



19

Google Sheets, 52 51 47 octets

=ArrayFormula(Join(",",Unique(Mod(Row(A:A)^2,A1

Enregistré 4 octets grâce à Taylor Scott

Les feuilles ajouteront automatiquement 4 parenthèses fermantes à la fin de la formule.

Il ne renvoie pas les résultats dans l'ordre croissant, mais il renvoie les résultats corrects.

Results


Sainte vache, l'homme qui est un tueur de poulet! Qui aurait pensé? +1
bearacuda13

1
C'est certainement ma réponse préférée jusqu'à présent.
Lord Farquaad

@LordFarquaad Je suis surpris et heureux que cela ait été si bien reçu. J'ai essayé de jouer davantage au golf dans Sheets et Excel même si - et en partie parce que - ils ont des gammes si limitées. Cela a conduit à de nombreuses formules matricielles.
Engineer Toast

Vous devriez pouvoir supprimer les )s de terminaison pendant -4 octets
Taylor Scott

@TaylorScott Merci! J'ai vu cette astuce quelque part récemment - probablement sur l'une de vos réponses - et je dois me souvenir de commencer à l'utiliser.
Engineer Toast

6

05AB1E , 5 octets

Lns%ê

Essayez-le en ligne! ou comme suite de tests

L     # Range 1 .. input
 n    # Square each
  s%  # Mod by input
    ê # Uniquify (also sorts as a bonus)

Comment ça smarche ici? L'entrée est-elle répétée?
Luis Mendo

@LuisMendo sest pop a,b; push b,a. Lorsqu'une commande essaie de faire sauter quelque chose de la pile et qu'il n'y a plus rien, la prochaine entrée est utilisée. S'il n'y a plus d'entrée, la dernière entrée est utilisée ( voici un exemple ). Dans ce cas, j'aurais pu utiliser ¹ce qui pousse la première entrée, mais sfonctionne mieux pour la suite de tests.
Riley

Merci. Avez-vous plus d'informations concernant le critère pour lequel les entrées sont réutilisées? (s'il y a eu par exemple trois entrées et que vous essayez de faire apparaître deux valeurs d'une pile vide)?
Luis Mendo

1
L'entrée @LuisMendo est utilisée dans l'ordre jusqu'à ce qu'elle s'épuise, puis elle continue à utiliser le dernier élément. Vous pouvez l'imaginer comme si la pile était remplie avec chaque entrée dans l'ordre et un nombre infini du dernier élément.
Riley

@LuisMendo Ln¹%êest équivalent ici. s.
Magic Octopus Urn

6

Swift , 47 35 32 * octets

* -3 grâce à @Alexander.

Peut - être la première fois dans l' histoire Swift liens bat Python?

{m in Set((0..<m).map{$0*$0%m})}

Essayez-le en ligne!


Explication

  • (0..<m).map{}- Itère à travers la plage [0...m)et mappe les résultats suivants:

  • $0*$0%m- Le carré de chaque entier modulo la base m.

  • Set(...) - Supprime les doublons.

  • m in - Attribue la base à une variable m


Le nom d'utilisateur est extrait ... attendez une seconde.
Rohan Jhunjhunwala

1
Plus comme il bat Python. C'est impressionnant ! Je pensais que je ne verrais jamais le jour qui se passerait.
Caleb Kleveter

@CalebKleveter Merci! Je suis content que vous l'ayez trouvé impressionnant :)
M. Xcoder


3

JavaScript (ES6), 52 octets

f=(m,k=m,x={})=>k?f(x[k*k%m]=m,k-1,x):Object.keys(x)

Cas de test


Version non récursive, 60 58 octets

Enregistré 2 octets grâce à @ThePirateBay

m=>(a=[...Array(m).keys()]).filter(v=>a.some(n=>n*n%m==v))

Cas de test


Non récursif 58 octets:m=>(a=[...Array(m).keys()]).filter(v=>a.some(n=>n*n%m==v))

@ThePirateBay Bonne prise. Merci.
Arnauld

3

Pyth, 6 octets

{%RQ*R

Essayez-le en ligne

Comment ça fonctionne

{%RQ*RdQ    implicit variables
       Q    autoinitialized to eval(input())
    *R      over [0, …, Q-1], map d ↦ d times
      d         d
 %R         map d ↦ d modulo
   Q            Q
{           deduplicate

3

Brachylog , 10 9 octets

>ℕ^₂;?%≜ᶠ

Essayez-le en ligne!

Explication

       ≜ᶠ       Find all numbers satisfying those constraints:
    ;?%           It must be the result of X mod Input where X…
  ^₂              …is a square…
>ℕ                …of an integer in [0, …, Input - 1]

J'étais sur le point de suggérer {>≜^₂;?%}ᵘune alternative ... puis j'ai réalisé qu'il y avait aussi des chiffres négatifs. > _ <
Erik the Outgolfer

1
@EriktheOutgolfer Une fois qu'un commit est tiré vers TIO, je peux effectivement réduire cette réponse à 9 octets en utilisant .
Fatalize

OK ... comment cela fonctionnerait-il quand il y a aussi des nombres négatifs? Serait-ce simplement les ignorer ou quelque chose?
Erik the Outgolfer

@EriktheOutgolfer mod peut être défini comme le reste de la division, ce qui serait positif (le quotient prend le signe). EDIT: aussi, les carrés sont positifs.
jaxad0127

@ jaxad0127 Je ne pense pas que ce soit le cas ici, car >cela représenterait toujours des nombres négatifs afaik.
Erik the Outgolfer le

3

Japt , 7 6 octets

Dz%UÃâ

Essaye-le

1 octet sauvé grâce à Oliver


Explication

Saisie implicite d'entier U.

Ç   Ã

Créez un tableau d'entiers de 0à U-1, inclus et passez chacun par une fonction.

²

Carré.

%U

Modulo U.

â

Récupère tous les éléments uniques du tableau et affiche implicitement le résultat.


1
Je ne pense pas que la gamme doive être inclusive. Dz%UÃâsemble fonctionner très bien.
Oliver


2

En fait , 11 octets

;╗r⌠²╜@%⌡M╔

Essayez-le en ligne!

Explication:

;╗r⌠²╜@%⌡M╔
;╗           store a copy of m in register 0
  r          range(m)
   ⌠²╜@%⌡M   for n in range:
    ²          n**2
     ╜@%       mod m
          ╔  remove duplicates

2

CJam , 12 octets

{_,_.*\f%_&}

Bloc anonyme acceptant un numéro et renvoyant une liste.

Essayez-le en ligne!

Explication

_,          Copy n and get the range [0 .. n-1]
  _.*       Multiply each element by itself (square each)
     \f%    Mod each by n
        _&  Deduplicate

Agréable! J'avais {:X{_*X%}%_&}pour 13 octets
Luis Mendo

2

Haskell , 45 octets

import Data.List
f m=nub[n^2`mod`m|n<-[0..m]]

-4 octets d'Anders Kaseorg

Essayez-le en ligne!


Malheureusement, la version sans point f m=nub$map((`mod`m).(^2))[0..m]est tout aussi longue, sauf s'il existe une syntaxe sournoise pour se débarrasser des parenthèses supplémentaires.
shooqie




1

JavaScript (ES6), 48 octets

f=
n=>[...new Set([...Array(n)].map((_,i)=>i*i%n))]
<input type=number min=0 oninput=o.textContent=f(+this.value)><pre id=o>

43 octets si le renvoi d'un Setau lieu d'un tableau est acceptable.


1

Scala , 32 30 octets

Utilisation simple de la pointe facile d'OP.

(0 to n-1).map(x=>x*x%n).toSet

Essayez-le en ligne!

-2 octets grâce à @MrXcoder, avec des priorités (pas besoin d' ()environ* fonctionnement )

Vous vous demandez: est-ce possible de dire implicitement au compilateur de comprendre des choses comme (0 to n-1)map(x=>x*x%n)toSet(sans avoir à le faire import scala.language.postfixOps)?


1
(0 to n-1).map(x=>x*x%n).toSetpour 30 octets. L'exponentiation a une priorité plus élevée que le modulo.
M. Xcoder

@ Mr.Xcoder ooh ~ merci :)
V. Courtois


0

Rétine , 70 octets

.+
$*

;$`¶$`
1(?=.*;(.*))|;1*
$1
(1+)(?=((.*¶)+\1)?$)

D`1*¶
^|1+
$.&

Essayez-le en ligne! Avertissement: lent pour les grandes entrées. Version 72 octets légèrement plus rapide:

.+
$*

$'¶$';
1(?=.*;(.*))|;1*
$1
+s`^((1+)¶.*)\2
$1
^1+

D`1*¶
^|1+
$.&

Essayez-le en ligne!



0

Perl 6 , 19 octets

{set (^$_)»²X%$_}

Essaye-le

Étendu:

{ # bare block lambda with implicit param 「$_」

  set        # turn the following into a Set (shorter than 「unique」)

      (
        ^$_  # a Range upto (and excluding) 「$_」
      )»²    # square each of them (possibly in parallel)

    X%       # cross modulus the squared values by

      $_     # the input
}

0

Pyth , 13 octets

VQ aY.^N2Q){Y

Essayez en ligne.

Lame tentative d'expliquer:

VQ               for N in [0 .. input-1]
                   blank space to supress implicit print inside the loop
     .^N2Q         N ^ 2 % input
   aY              append that to Y, which is initially an empty list
          )      end for
           {Y    deduplicate and implicit print

Pour trier la sortie, insérez un Ssur n'importe quel côté du{

Je pense qu'il devrait y avoir un chemin plus court ...


1
Oui, le style fonctionnel de Pyth a tendance à être beaucoup plus concis . mapest votre ami!
Anders Kaseorg





0

PHP , 53 octets

for(;$i<$t=$argv[1];)$a[$z=$i++**2%$t]++?:print"$z
";

Boucle de 0 au numéro d'entrée, en utilisant la n^2 mod baseformule pour marquer les numéros qui ont été utilisés. Il va à cette position dans un tableau, vérifiant s'il a été incrémenté et le sortant s'il ne l'a pas été. Il l'incrémente ensuite pour que les valeurs en double ne soient pas imprimées.

Essayez-le en ligne!


0

8ème , 138 131 octets

Code

[] swap dup >r ( 2 ^ r@ n:mod a:push ) 1 rot loop rdrop ' n:cmp a:sort ' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip

Explication

[] - Créer un tableau de sortie

swap dup >r - Enregistrer l'entrée pour une utilisation ultérieure

( 2 ^ r@ n:mod a:push ) 1 rot loop - Calculer l'extrémité carrée

rdrop - R-stack propre

' n:cmp a:sort - Trier le tableau de sortie

' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip - Débarrassez-vous des doublons consécutifs du tableau

SED (Stack Effect Diagram) est:a -- a

Utilisation et exemple

: f [] swap dup >r ( 2 n:^ r@ n:mod a:push ) 1 rot loop rdrop ' n:cmp a:sort ' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip ;

ok> 120 f .
[0,1,4,9,16,24,25,36,40,49,60,64,76,81,84,96,100,105]

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.