Come finisce il quadrato?


20

In Base-10, tutti i quadrati perfetti terminano con 0 , 1 , 4 , 5 , 6 o 9 .

Nella Base-16, tutti i quadrati perfetti terminano con 0 , 1 , 4 o 9 .

Nilknarf descrive perché questo è e come risolverlo molto bene in questa risposta, ma darò anche una breve descrizione qui:

Quando si quadrano un numero Base-10, N , la cifra "uni" non è influenzata da ciò che è nella cifra "decine" o dalla cifra "centinaia" e così via. Solo la cifra "one" in N influenza la cifra " one " in N 2 , quindi un modo semplice (ma forse non più golfistico) per trovare tutte le ultime cifre possibili per N 2 è trovare n 2 mod 10 per tutti 0 <= n < 10 . Ogni risultato è un'ultima cifra possibile. Per Base-m, puoi trovare n 2 mod m per tutti 0 <= n < m .

Scrivi un programma che, quando viene dato l'ingresso N , emette tutte le ultime cifre possibili per un quadrato perfetto in Base-N (senza duplicati). Puoi presumere che N sia maggiore di 0 e che N sia abbastanza piccolo da non far traboccare N 2 (se riesci a testare fino a N 2 , ti darò una quantità finita di punti brownie, ma sappi che il tasso di cambio dei punti brownie in punti reali è infinito a uno).

test:

 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

questo è , quindi si applicano le regole standard!

(Se lo trovi troppo facile o vuoi una domanda più approfondita sull'argomento, considera questa domanda: Copertura minima delle basi per il test quadratico dei residui della quadratura ).


1
L'array di output deve essere ordinato?
Shaggy,

@Shaggy Nope! Mego, la duplicazione non è consentita. Teoricamente, N potrebbe essere enorme, quindi i duplicati renderebbero il risultato piuttosto illeggibile. Devo rispondere alla domanda
Lord Farquaad,

L'output di un set è accettabile?
totalmente umano il

2
@totallyhuman Perché non dovrebbe essere valido? I set sono raccolte non ordinate e non devono essere ordinati , quindi ...
Mr. Xcoder,

Risposte:



19

Fogli Google, 52 51 47 byte

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

Risparmiato 4 byte grazie a Taylor Scott

Fogli aggiungerà automaticamente 4 parentesi di chiusura alla fine della formula.

Non restituisce i risultati in ordine crescente ma restituisce i risultati corretti.

Results


Santa mucca, uomo che è un assassino spaventato! Chi avrebbe mai pensato? +1
bearacuda13,

1
Questa è sicuramente la mia risposta preferita finora.
Lord Farquaad,

@LordFarquaad Sono sorpreso e contento che questo sia stato così ben accolto. Ho cercato di giocare a golf di più in Fogli ed Excel anche se - e in parte perché - hanno range così limitati. Ha portato a molte formule di array.
Ingegnere Toast,

Dovresti essere in grado di eliminare le )s di terminazione per -4 byte
Taylor Scott,

@TaylorScott Grazie! Ho visto quel trucco da qualche parte di recente - probabilmente su una delle tue risposte - e devo ricordare di iniziare a usarlo.
Ingegnere Toast,

6

05AB1E , 5 byte

Lns%ê

Provalo online! o come una suite di test

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

Come sfunziona qui? L'ingresso è ripetuto?
Luis Mendo,

@LuisMendo sè pop a,b; push b,a. Quando un comando tenta di estrarre qualcosa dallo stack e non viene lasciato nulla, viene utilizzato l'input successivo. Se non ci sono altri input, viene utilizzato l'ultimo input ( ecco un esempio ). In questo caso avrei potuto usare ciò ¹che spinge il primo input, ma sfunziona meglio per la suite di test.
Riley,

Grazie. Hai altre informazioni sul criterio per il quale l'input viene riutilizzato? (se sono stati pronunciati tre input e si tenta di estrarre due valori da uno stack vuoto)?
Luis Mendo,

1
@LuisMendo L'input viene utilizzato nell'ordine in cui si esaurisce, quindi continua a utilizzare l'ultimo elemento. Puoi immaginarlo come se lo stack fosse riempito con ogni input in ordine e un numero infinito dell'ultimo elemento.
Riley,

@LuisMendo Ln¹%êè equivalente qui. s.
Magic Octopus Urn,

6

Rapido , 47 35 32 * byte

* -3 grazie a @Alexander.

Forse la prima volta nella storia i legami di Swift battono Python?

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

Provalo online!


Spiegazione

  • (0..<m).map{}- Scorre la gamma [0...m)e mappa i seguenti risultati:

  • $0*$0%m- Il quadrato di ogni numero intero modulo la base m.

  • Set(...) - Rimuove i duplicati.

  • m in - Assegna la base a una variabile m


Nome utente verificato ... aspetta un secondo.
Rohan Jhunjhunwala,

1
Più come se batte Python. È impressionante ! Pensavo che non avrei mai visto il giorno che sarebbe successo.
Caleb Kleveter,

@CalebKleveter Grazie! Sono contento che l'abbia trovato impressionante :)
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)

Casi test


Versione non ricorsiva, 60 58 byte

Salvato 2 byte grazie a @ThePirateBay

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

Casi test


58 byte non ricorsivi:m=>(a=[...Array(m).keys()]).filter(v=>a.some(n=>n*n%m==v))

@ThePirateBay Buona cattura. Grazie.
Arnauld,

3

Pyth, 6 byte

{%RQ*R

Provalo online

Come funziona

{%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 byte

>ℕ^₂;?%≜ᶠ

Provalo online!

Spiegazione

       ≜ᶠ       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]

Stavo per suggerire {>≜^₂;?%}ᵘcome alternativa ... poi mi sono reso conto che ci sono anche numeri negativi. > _ <
Erik the Outgolfer,

1
@EriktheOutgolfer Una volta che un commit viene portato a TIO, posso effettivamente ridurre questa risposta a 9 byte effettivamente usando .
Fatalizza il

OK ... come funzionerebbe quando ci sono anche numeri negativi? Li ignorerebbe semplicemente o qualcosa del genere?
Erik the Outgolfer,

La mod @EriktheOutgolfer può essere definita come resto della divisione, il che sarebbe positivo (il quoziente prende il segno). EDIT: inoltre, i quadrati sono positivi.
jaxad0127,

@Jaxad0127 Non penso che sia il caso qui, dato >che spiegherebbe comunque numeri negativi dopo.
Erik the Outgolfer,

3

Japt , 7 6 byte

Dz%UÃâ

Provalo

1 byte salvato grazie a Oliver


Spiegazione

Input implicito di numero intero U.

Ç   Ã

Crea un array di numeri interi da 0a U-1, incluso e passa ciascuno attraverso una funzione.

²

Piazza.

%U

Modulo U.

â

Ottieni tutti gli elementi univoci nella matrice e genera implicitamente il risultato.


1
Non credo che l'intervallo debba essere inclusivo. Dz%UÃâsembra funzionare bene.
Oliver,


2

In realtà , 11 byte

;╗r⌠²╜@%⌡M╔

Provalo online!

Spiegazione:

;╗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 byte

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

Blocco anonimo che accetta un numero e restituisce un elenco.

Provalo online!

Spiegazione

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

Bello! Ho avuto {:X{_*X%}%_&}per 13 byte
Luis Mendo il

2

Haskell , 45 byte

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

-4 byte da Anders Kaseorg

Provalo online!


La versione purtroppo senza punti f m=nub$map((`mod`m).(^2))[0..m]è altrettanto lunga, a meno che non ci sia una sintassi subdola per sbarazzarsi di parentesi extra.
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 byte se Setè accettabile la restituzione di un array anziché di un array.


1

Scala , 32 30 byte

Semplice utilizzo della punta facile da OP.

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

Provalo online!

-2 byte grazie a @MrXcoder, con priorità (non è necessario il funzionamento in ()giro *)

Chiedendosi: è possibile dire implicitamente al compilatore di capire cose come (0 to n-1)map(x=>x*x%n)toSet(senza dovere import scala.language.postfixOps)?


1
(0 to n-1).map(x=>x*x%n).toSetper 30 byte. L'esponenziazione ha una precedenza maggiore rispetto al modulo.
Mr. Xcoder,

@ Mr.Xcoder ooh ~ grazie :)
V. Courtois,


0

Retina , 70 byte

.+
$*

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

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

Provalo online! Avviso: lento per ingressi di grandi dimensioni. Versione a 72 byte leggermente più veloce:

.+
$*

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

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

Provalo online!



0

Perl 6 , 19 byte

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

Provalo

Allargato:

{ # 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 byte

VQ aY.^N2Q){Y

Prova online.

Tentativo tentativo di spiegare:

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

Per ordinare l'output, inserire un Sda qualsiasi lato del{

Penso che dovrebbe esserci un modo più breve ...


1
Sì, lo stile funzionale di Pyth tende ad essere molto più conciso . mapÈ tuo amico!
Anders Kaseorg,





0

PHP , 53 byte

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

Passa da 0 al numero di input, usando la n^2 mod baseformula per contrassegnare i numeri che sono stati utilizzati. Va in quella posizione in un array, controllando se è stato incrementato e emettendolo se non lo è. Successivamente lo incrementa in modo che i valori duplicati non vengano stampati.

Provalo online!


0

8 ° , 138 131 byte

Codice

[] 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

Spiegazione

[] - Crea array di output

swap dup >r - Salva input per un uso successivo

( 2 ^ r@ n:mod a:push ) 1 rot loop - Calcola l'estremità quadrata

rdrop - Pulisci r-stack

' n:cmp a:sort - Ordina array di output

' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip - Elimina i duplicati consecutivi dall'array

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

Uso ed esempio

: 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]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.