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 ).

Lord Farquaad
la source
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:

8

Gelée , 5 octets

R²%³Q

Essayez-le en ligne!

Explication

R²%³Q   Main link, argument: n

R       Range from 1 to n
 ²      Square each
  %³    Mod each by n
    Q   Deduplicate
Chat d'affaires
la source
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

Ingénieur Toast
la source
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)
Riley
la source
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

M. Xcoder
la source
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

Arnauld
la source
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
Anders Kaseorg
la source
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]
Fatalize
la source
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.

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

Python 3 , 40 39 37 octets

-1 octet merci à M. Xcoder. -2 octets grâce à Business Cat.

lambda m:[*{n*n%m for n in range(m)}]

Essayez-le en ligne!

totalement humain
la source
1
Vous ne pouvez pas remplacer n**2par n*n?
M. Xcoder
Ouais, oublie toujours ça. > <Merci!
2017 totalement humain
2
Aussi, c'est juste range(m)suffisant
Business Cat
1
Vous pouvez utiliser des ensembles pour 34 octets
M. Xcoder
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
Mego
la source
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
Chat d'affaires
la source
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!

Mego
la source
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
2

MATL , 6 5 octets

-1 octet grâce à @LuisMendo

:UG\u

Essayez-le en ligne!

Cinaski
la source
Merci! J'ai parcouru le document à la recherche de cette fonction mais je n'ai pas pu la trouver.
Cinaski
BTW cet interprète créé par Suever a une recherche de documentation, vous pouvez le trouver utile
Luis Mendo
1

Mathematica, 30 octets

Union@Table[Mod[i^2,#],{i,#}]&

Essayez-le en ligne!

J42161217
la source
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.

Neil
la source
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)?

V. Courtois
la source
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!

Neil
la source
0

Clojure, 40 octets

#(set(map(fn[x](mod(* x x)%))(range %)))
MattPutnam
la source
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
}
Brad Gilbert b2gills
la source
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 ...

allégations
la source
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!

Xanderhall
la source
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]
Manoir du Chaos
la source