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


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:



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


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)

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


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


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

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]

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.


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


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

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

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!


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




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.


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 ?


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

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
}

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


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!


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]

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.