Wie endet das Quadrat?

20

In der Basis 10 enden alle perfekten Quadrate auf 0 , 1 , 4 , 5 , 6 oder 9 .

In Basis 16 enden alle perfekten Quadrate mit 0 , 1 , 4 oder 9 .

Nilknarf beschreibt in dieser Antwort, warum dies so ist und wie dies sehr gut funktioniert , aber ich werde hier auch eine kurze Beschreibung geben:

Beim Quadrieren einer Basis-10-Zahl, N , wird die Einerstelle nicht durch die Zehner- oder Hunderter-Stelle usw. beeinflusst. Nur die Einerstelle in N wirkt sich auf die Einerstelle in N 2 aus . Ein einfacher (aber möglicherweise nicht der erfolgreichste) Weg, alle möglichen letzten Stellen für N 2 zu finden, besteht darin, n 2 mod 10 für alle 0 <= n zu finden < 10 . Jedes Ergebnis ist eine mögliche letzte Ziffer. Für Base-m könnte man n 2 mod m für alle 0 <= n < m finden .

Schreiben Sie ein Programm, das bei Eingabe von N alle möglichen letzten Ziffern für ein perfektes Quadrat in Base-N ausgibt (ohne Duplikate). Sie können davon ausgehen , N größer ist 0 , und das N ist klein genug , dass N 2 nicht Überlauf (Wenn Sie den ganzen Weg bis testen N 2 , gebe ich Ihnen eine endliche Menge Pluspunkte, aber wissen , dass Der Wechselkurs von Brownie-Punkten zu echten Punkten ist unendlich zu eins.

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

Das ist , also gelten die Standardregeln!

(Wenn Ihnen dies zu leicht fällt oder Sie eine ausführlichere Frage zum Thema wünschen, sollten Sie sich diese Frage überlegen: Minimale Abdeckung der Basen für die quadratische Prüfung der Rechtwinkligkeit nach Restwerten ).

Lord Farquaad
quelle
1
Muss das Ausgabearray sortiert werden?
Shaggy
@ Shaggy Nope! Mega, Vervielfältigung ist nicht erlaubt. Theoretisch könnte N enorm sein, so dass Duplikate die Ausgabe ziemlich unlesbar machen würden. Ich werde die Frage
zulassen
Ist die Ausgabe eines Satzes akzeptabel?
Totalhuman
2
@totallyhuman Warum wäre es nicht gültig? Sets sind ungeordnete Sammlungen und müssen nicht sortiert werden , also ...
Mr. Xcoder

Antworten:

8

Gelee , 5 Bytes

R²%³Q

Probieren Sie es online!

Erläuterung

R²%³Q   Main link, argument: n

R       Range from 1 to n
 ²      Square each
  %³    Mod each by n
    Q   Deduplicate
Geschäfts-Katze
quelle
19

Google Sheets, 52 51 47 Bytes

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

4 Bytes gespart dank Taylor Scott

Sheets fügt am Ende der Formel automatisch 4 schließende Klammern hinzu.

Es gibt die Ergebnisse nicht in aufsteigender Reihenfolge zurück, aber es gibt die richtigen Ergebnisse zurück.

Ergebnisse

Ingenieur Toast
quelle
Heilige Kuh, Mann, der Mörder ist verdammt! Wer hätte gedacht? +1
bearacuda13
1
Dies ist definitiv meine bisherige Lieblingsantwort.
Lord Farquaad
@ LordFarquaad Ich bin überrascht und erfreut, dass dies so gut aufgenommen wurde. Ich habe versucht, mehr in Sheets und Excel zu golfen, obwohl - und zum Teil, weil - sie so begrenzte Reichweiten haben. Es hat zu vielen Array-Formeln geführt.
Ingenieur Toast
Sie sollten in der Lage sein, das abschließende )s für -4 Bytes fallen zu lassen
Taylor Scott
@ TaylorScott Vielen Dank! Ich habe diesen Trick kürzlich irgendwo gesehen - wahrscheinlich auf einer Ihrer Antworten - und muss daran denken, ihn zu benutzen.
Ingenieur Toast
6

05AB1E , 5 Bytes

Lns%ê

Probieren Sie es online! oder als Test Suite

L     # Range 1 .. input
 n    # Square each
  s%  # Mod by input
    ê # Uniquify (also sorts as a bonus)
Riley
quelle
Wie sarbeitet man hier? Wird die Eingabe wiederholt?
Luis Mendo
@ LuisMendo sist pop a,b; push b,a. Wenn ein Befehl versucht, etwas aus dem Stapel zu entfernen und nichts mehr übrig ist, wird die nächste Eingabe verwendet. Wenn keine Eingabe mehr vorhanden ist, wird die letzte Eingabe verwendet ( hier ein Beispiel ). In diesem Fall hätte ich verwenden können, ¹was den ersten Eingang drückt, aber sbesser für die Testsuite funktioniert.
Riley
Vielen Dank. Haben Sie weitere Informationen zu dem Kriterium, für das die Eingabe wiederverwendet wird? (Wenn es drei Eingaben gegeben hat und Sie versuchen, zwei Werte aus einem leeren Stapel zu entfernen)?
Luis Mendo
1
@LuisMendo Input wird in der Reihenfolge verwendet, bis es leer ist, und verwendet dann weiterhin das letzte Element. Sie können sich vorstellen, dass der Stapel mit jeder Eingabe in der angegebenen Reihenfolge und einer unendlichen Anzahl des letzten Elements aufgefüllt wurde.
Riley
@ LuisMendo Ln¹%êist hier gleichwertig. s.
Magic Octopus Urn
6

Swift , 47 35 32 * Bytes

* -3 danke an @Alexander.

Möglicherweise das erste Mal in der Geschichte. Schnelle Verbindungen schlagen Python?

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

Probieren Sie es online!


Erläuterung

  • (0..<m).map{}- Durchläuft den Bereich [0...m)und ordnet die folgenden Ergebnisse zu:

  • $0*$0%m- Das Quadrat jeder Ganzzahl modulo der Basis m.

  • Set(...) - Entfernt die Duplikate.

  • m in - Weist die Basis einer Variablen zu m

Mr. Xcoder
quelle
Benutzername checkt aus ... warte eine Sekunde.
Rohan Jhunjhunwala
1
Mehr als Python. Das ist beeindruckend ! Ich dachte, ich würde nie den Tag sehen, der passieren würde.
Caleb Kleveter
@CalebKleveter Danke! Ich bin froh, dass Sie es beeindruckend fanden :)
Mr. Xcoder
3

JavaScript (ES6), 52 Byte

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

Testfälle


Nicht-rekursive Version, 60 58 Bytes

2 Bytes dank @ThePirateBay gespart

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

Testfälle

Arnauld
quelle
Nicht rekursive 58 Bytes:m=>(a=[...Array(m).keys()]).filter(v=>a.some(n=>n*n%m==v))
@ThePirateBay Guter Fang. Vielen Dank.
Arnauld
3

Pyth, 6 Bytes

{%RQ*R

Probieren Sie es online aus

Wie es funktioniert

{%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
quelle
3

Brachylog , 10 9 Bytes

>ℕ^₂;?%≜ᶠ

Probieren Sie es online!

Erläuterung

       ≜ᶠ       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]
Tödlich
quelle
Ich wollte gerade {>≜^₂;?%}ᵘeine Alternative vorschlagen ... dann wurde mir klar, dass es auch negative Zahlen gibt. > _ <
Erik der Outgolfer
1
@EriktheOutgolfer Sobald ein Commit zu TIO gezogen wird, kann ich diese Antwort mithilfe von tatsächlich auf 9 Byte reduzieren .
Fatalize
OK ... wie würde es funktionieren, wenn es auch negative Zahlen gibt? Würde es sie einfach ignorieren oder so?
Erik der Outgolfer
@EriktheOutgolfer mod kann als Rest der Division definiert werden, was positiv wäre (der Quotient nimmt das Vorzeichen). EDIT: auch Quadrate sind positiv.
Jaxad0127
@ jaxad0127 Ich glaube nicht, dass das hier der Fall ist, da >afaik noch negative Zahlen ausmachen würde.
Erik der Outgolfer
3

Japt , 7 6 Bytes

Dz%UÃâ

Probier es aus

Dank Oliver 1 Byte gespart


Erläuterung

Implizite Eingabe einer Ganzzahl U.

Ç   Ã

Erstellen Sie ein Array von ganzen Zahlen von 0bis U-1einschließlich und übergeben Sie jede durch eine Funktion.

²

Platz.

%U

Modulo U.

â

Holen Sie sich alle eindeutigen Elemente im Array und geben Sie das Ergebnis implizit aus.

Zottelig
quelle
1
Ich denke nicht, dass das Sortiment inklusive sein muss. Dz%UÃâscheint gut zu funktionieren.
Oliver
2

Python 3 , 40 39 37 Bytes

-1 Byte danke an Herrn Xcoder. -2 Bytes dank Business Cat.

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

Probieren Sie es online!

total menschlich
quelle
1
Kannst du nicht ersetzen n**2durch n*n?
Mr. Xcoder
Yup, vergiss das immer. > <Danke!
Totalhuman
2
Auch ist gerade range(m)genug
Business Cat
1
Sie können Sätze für 34 Bytes verwenden
Mr. Xcoder
2

Eigentlich 11 Bytes

;╗r⌠²╜@%⌡M╔

Probieren Sie es online!

Erläuterung:

;╗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
quelle
2

CJam , 12 Bytes

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

Anonymer Block, der eine Nummer akzeptiert und eine Liste zurückgibt.

Probieren Sie es online!

Erläuterung

_,          Copy n and get the range [0 .. n-1]
  _.*       Multiply each element by itself (square each)
     \f%    Mod each by n
        _&  Deduplicate
Geschäfts-Katze
quelle
Nett! Ich hatte {:X{_*X%}%_&}für 13 Bytes
Luis Mendo
2

Haskell , 45 Bytes

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

-4 Bytes von Anders Kaseorg

Probieren Sie es online!

Mego
quelle
Leider ist die punktfreie Version f m=nub$map((`mod`m).(^2))[0..m]genauso lang, es sei denn, es gibt eine hinterhältige Syntax, um zusätzliche Klammern loszuwerden.
Shooqie
2

MATL , 6 5 Bytes

-1 Byte dank @LuisMendo

:UG\u

Probieren Sie es online!

Cinaski
quelle
Vielen Dank! Ich habe in der Dokumentation nach dieser Funktion gesucht, sie aber nicht gefunden.
Cinaski
BTW dieser Interpreter von Suever erstellt Dokumentation suchen hat, können Sie es nützlich finden
Luis Mendo
1

JavaScript (ES6), 48 Byte

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 Bytes, wenn die Rückgabe von a Setanstelle eines Arrays zulässig ist.

Neil
quelle
1

Scala , 32 Bytes

Einfache Bedienung mit dem Easy Tip von OP.

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

Probieren Sie es online!

-2 Bytes dank @MrXcoder mit Prioritäten (keine Notwendigkeit für ()um* Operation)

Fragen Sie sich: Ist es möglich , den Compiler implizit anzuweisen, Dinge wie (0 to n-1)map(x=>x*x%n)toSet(ohne dies tun zu müssen import scala.language.postfixOps) zu verstehen ?

V. Courtois
quelle
1
(0 to n-1).map(x=>x*x%n).toSetfür 30 Bytes. Potenzierung hat höhere Priorität als Modulo.
Mr. Xcoder
@ Mr.Xcoder ooh ~ danke :)
V. Courtois
0

Netzhaut , 70 Bytes

.+
$*

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

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

Probieren Sie es online! Warnung: Langsam für große Eingaben. Etwas schnellere 72-Byte-Version:

.+
$*

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

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

Probieren Sie es online!

Neil
quelle
0

Clojure, 40 Bytes

#(set(map(fn[x](mod(* x x)%))(range %)))
MattPutnam
quelle
0

Perl 6 , 19 Bytes

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

Probier es aus

Erweitert:

{ # 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
quelle
0

Pyth , 13 Bytes

VQ aY.^N2Q){Y

Versuchen Sie es online.

Lahmer Erklärungsversuch:

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

Um die Ausgabe zu sortieren, fügen Sie an einer Sbeliebigen Seite des ein{

Ich denke, es sollte einen kürzeren Weg geben ...

Alleks
quelle
1
Ja, der funktionale Stil von Pyth neigt dazu, viel prägnanter zu sein . mapist dein Freund!
Anders Kaseorg
0

PHP , 53 Bytes

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

Gehen Sie mit der Taste von 0 zur Eingangsnummer n^2 mod base markieren Sie die verwendeten Nummern Formel. Es geht zu dieser Position in einem Array, überprüft, ob es erhöht wurde, und gibt es aus, wenn dies nicht der Fall ist. Anschließend wird es inkrementiert, damit keine doppelten Werte gedruckt werden.

Probieren Sie es online!

Xanderhall
quelle
0

8. , 138 131 Bytes

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

Erläuterung

[] - Ausgabe-Array erstellen

swap dup >r - Eingaben zur späteren Verwendung speichern

( 2 ^ r@ n:mod a:push ) 1 rot loop - Quadratisches Ende berechnen

rdrop - R-Stack reinigen

' n:cmp a:sort - Ausgabearray sortieren

' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip - Entfernen Sie aufeinanderfolgende Duplikate aus dem Array

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

Verwendung und Beispiel

: 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]
Chaos Manor
quelle