¿Cómo termina el cuadrado?

20

En Base-10, todos los cuadrados perfectos terminan en 0 , 1 , 4 , 5 , 6 o 9 .

En Base-16, todos los cuadrados perfectos terminan en 0 , 1 , 4 o 9 .

Nilknarf describe por qué esto es así y cómo resolverlo muy bien en esta respuesta, pero también daré una breve descripción aquí:

Al cuadrar un número de Base 10, N , el dígito "unos" no se ve afectado por lo que está en el dígito "decenas" o el dígito "cientos", y así sucesivamente. Solo el dígito "unos" en N afecta el dígito "unos" en N 2 , por lo que una forma fácil (pero quizás no la más elegante) de encontrar todos los últimos dígitos posibles para N 2 es encontrar n 2 mod 10 para todos 0 <= n < 10 . Cada resultado es un posible último dígito. Para Base-m, puede encontrar n 2 mod m para todos 0 <= n < m .

Escriba un programa que, cuando recibe la entrada N , emite todos los últimos dígitos posibles para un cuadrado perfecto en Base-N (sin duplicados). Puede suponer que N es mayor que 0 , y que N es lo suficientemente pequeño como para que N 2 no se desborde (si puede probar hasta N 2 , le daré una cantidad finita de puntos de brownie, pero sepa que el tipo de cambio de puntos brownie a puntos reales es infinito a uno).

Pruebas:

 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

Este es el , por lo que se aplican reglas estándar.

(Si considera que esto es demasiado fácil, o si desea una pregunta más detallada sobre el tema, considere esta pregunta: cobertura mínima de las bases para la prueba cuadrática de residuos de la cuadratura ).

Lord Farquaad
fuente
1
¿La matriz de salida necesita ser ordenada?
Shaggy
@Shaggy Nope! Mego, la duplicación no está permitida. Teóricamente, N podría ser enorme, por lo que los duplicados harían que la salida fuera bastante ilegible. Admitiré la pregunta
Lord Farquaad el
¿Es aceptable emitir un conjunto?
totalmente humano
2
@totallyhuman ¿Por qué no sería válido? Los conjuntos son colecciones desordenadas y no deben ser ordenados , así que ...
Sr. Xcoder

Respuestas:

8

Jalea , 5 bytes

R²%³Q

Pruébalo en línea!

Explicación

R²%³Q   Main link, argument: n

R       Range from 1 to n
 ²      Square each
  %³    Mod each by n
    Q   Deduplicate
Gato de negocios
fuente
19

Hojas de cálculo de Google, 52 51 47 bytes

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

Guardado 4 bytes gracias a Taylor Scott

Las hojas agregarán automáticamente 4 paréntesis de cierre al final de la fórmula.

No devuelve los resultados en orden ascendente, pero devuelve los resultados correctos.

Resultados

Tostadas de ingeniero
fuente
¡Santo cielo, hombre que es un asesino! ¿Quien lo hubiera pensado? +1
bearacuda13
1
Esta es definitivamente mi respuesta favorita hasta ahora.
Lord Farquaad
@ LordFarquaad Estoy sorprendido y contento de que haya sido tan bien recibido. He intentado jugar más al golf en Sheets y Excel, aunque, en parte porque tienen rangos tan limitados. Ha llevado a muchas fórmulas de matriz.
Engineer Toast
Debería poder soltar los )s de terminación para -4 bytes
Taylor Scott
@TaylorScott ¡Gracias! Vi ese truco en algún lugar recientemente, probablemente en una de sus respuestas, y necesito recordar comenzar a usarlo.
Engineer Toast
6

05AB1E , 5 bytes

Lns%ê

Pruébalo en línea! o como un conjunto de pruebas

L     # Range 1 .. input
 n    # Square each
  s%  # Mod by input
    ê # Uniquify (also sorts as a bonus)
Riley
fuente
¿Cómo sfunciona aquí? ¿Se repite la entrada?
Luis Mendo
@LuisMendo ses pop a,b; push b,a. Cuando un comando intenta extraer algo de la pila y no queda nada, se utiliza la siguiente entrada. Si no hay más entradas, se usa la última entrada ( aquí hay un ejemplo ). En este caso, podría haber utilizado el ¹que empuja la primera entrada, pero sfunciona mejor para el conjunto de pruebas.
Riley
Gracias. ¿Tiene más información sobre el criterio para el cual se reutiliza la entrada? (si ha habido tres entradas e intenta extraer dos valores de una pila vacía)?
Luis Mendo
1
La entrada @LuisMendo se usa en orden hasta que se agota, luego continúa usando el último elemento. Podrías imaginarlo como si la pila estuviera rellenada con cada entrada en orden y un número infinito del último elemento.
Riley
@LuisMendo Ln¹%êes equivalente aquí. s.
Magic Octopus Urn
6

Swift , 47 35 32 * bytes

* -3 gracias a @Alexander.

Posiblemente la primera vez en la historia ¿Los lazos rápidos vencen a Python?

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

Pruébalo en línea!


Explicación

  • (0..<m).map{}- Itera a través del rango [0...m)y mapea los siguientes resultados:

  • $0*$0%m- El cuadrado de cada número entero módulo la base m.

  • Set(...) - Elimina los duplicados.

  • m in - Asigna la base a una variable m

Sr. Xcoder
fuente
El nombre de usuario se retira ... espera un segundo.
Rohan Jhunjhunwala
1
Más como vence a Python. Eso es impresionante ! Pensé que nunca vería el día que sucedería.
Caleb Kleveter
@CalebKleveter ¡Gracias! Me alegra que lo hayas encontrado impresionante :)
Sr. Xcoder
3

JavaScript (ES6), 52 bytes

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

Casos de prueba


Versión no recursiva, 60 58 bytes

Guardado 2 bytes gracias a @ThePirateBay

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

Casos de prueba

Arnauld
fuente
58 bytes no recursivos:m=>(a=[...Array(m).keys()]).filter(v=>a.some(n=>n*n%m==v))
@ThePirateBay Buena captura. Gracias.
Arnauld
3

Pyth, 6 bytes

{%RQ*R

Pruébalo en línea

Cómo funciona

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

Brachylog , 10 9 bytes

>ℕ^₂;?%≜ᶠ

Pruébalo en línea!

Explicación

       ≜ᶠ       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]
Fatalizar
fuente
Estaba a punto de sugerir {>≜^₂;?%}ᵘcomo alternativa ... luego me di cuenta de que también hay números negativos. > _ <
Erik the Outgolfer
1
@EriktheOutgolfer Una vez que una confirmación se extrae a TIO, puedo reducir esta respuesta a 9 bytes usando .
Fatalize
OK ... ¿cómo funcionaría cuando también hay números negativos? ¿Simplemente los ignoraría o algo así?
Erik the Outgolfer
El mod @EriktheOutgolfer se puede definir como el resto de la división, lo que sería positivo (el cociente toma el signo). EDITAR: también, los cuadrados son positivos.
jaxad0127
@ jaxad0127 No creo que ese sea el caso aquí, ya >que aún explicaría los números negativos afaik.
Erik the Outgolfer
3

Japt , 7 6 bytes

Dz%UÃâ

Pruébalo

1 byte guardado gracias a Oliver


Explicación

Entrada implícita de entero U.

Ç   Ã

Cree una matriz de enteros desde 0hasta U-1, inclusive y pase cada uno a través de una función.

²

Cuadrado.

%U

Módulo U.

â

Obtenga todos los elementos únicos en la matriz y genere implícitamente el resultado.

Lanudo
fuente
1
No creo que la gama deba ser inclusiva. Dz%UÃâParece funcionar bien.
Oliver
2

Python 3 , 40 39 37 bytes

-1 byte gracias al Sr. Xcoder. -2 bytes gracias a Business Cat.

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

Pruébalo en línea!

totalmente humano
fuente
1
¿No puedes reemplazar n**2con n*n?
Sr. Xcoder
Sí, siempre olvídalo. > <¡Gracias!
totalmente humano
2
Además, solo range(m)es suficiente
Business Cat
1
Puede usar conjuntos de 34 bytes
Sr. Xcoder
2

En realidad , 11 bytes

;╗r⌠²╜@%⌡M╔

Pruébalo en línea!

Explicación:

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

CJam , 12 bytes

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

Bloqueo anónimo que acepta un número y devuelve una lista.

Pruébalo en línea!

Explicación

_,          Copy n and get the range [0 .. n-1]
  _.*       Multiply each element by itself (square each)
     \f%    Mod each by n
        _&  Deduplicate
Gato de negocios
fuente
¡Agradable! Tenía {:X{_*X%}%_&}para 13 bytes
Luis Mendo
2

Haskell , 45 bytes

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

-4 bytes de Anders Kaseorg

Pruébalo en línea!

Mego
fuente
Lamentablemente, la versión sin puntos f m=nub$map((`mod`m).(^2))[0..m]es igual de larga, a menos que haya una sintaxis furtiva para deshacerse de los paréntesis adicionales.
shooqie
2

MATL , 6 5 bytes

-1 byte gracias a @LuisMendo

:UG\u

Pruébalo en línea!

Cinaski
fuente
¡Gracias! Miré a través del documento buscando esa función, pero no pude encontrarla.
Cinaski
Por cierto, este intérprete creado por Suever tiene búsqueda de documentación, puede que le resulte útil
Luis Mendo
1

JavaScript (ES6), 48 bytes

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 si devolver un en Setlugar de una matriz es aceptable.

Neil
fuente
1

Scala , 32 30 bytes

Uso simple de la sugerencia fácil de OP.

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

Pruébalo en línea!

-2 bytes gracias a @MrXcoder, con prioridades (sin necesidad de ()alrededor* operación)

Preguntándose: ¿es posible decirle al compilador implícitamente que comprenda cosas como (0 to n-1)map(x=>x*x%n)toSet(sin tener que hacerlo import scala.language.postfixOps)?

V. Courtois
fuente
1
(0 to n-1).map(x=>x*x%n).toSetpor 30 bytes. La exponenciación tiene mayor precedencia que el módulo.
Sr. Xcoder
@ Mr.Xcoder ooh ~ gracias :)
V. Courtois
0

Retina , 70 bytes

.+
$*

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

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

Pruébalo en línea! Advertencia: lento para entradas grandes. Versión de 72 bytes ligeramente más rápida:

.+
$*

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

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

Pruébalo en línea!

Neil
fuente
0

Clojure, 40 bytes

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

Perl 6 , 19 bytes

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

Pruébalo

Expandido:

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

Pyth , 13 bytes

VQ aY.^N2Q){Y

Probar en línea

Cojo intento de explicar:

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

Para ordenar la salida, inserte un S en cualquier lado del{

Creo que debería haber un camino más corto ...

callejones
fuente
1
Sí, el estilo funcional de Pyth tiende a ser mucho más conciso . map¡es tu amigo!
Anders Kaseorg
0

PHP , 53 bytes

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

Pase de 0 al número de entrada, usando la n^2 mod basefórmula para marcar los números que se han usado. Va a esa posición en una matriz, verificando si se ha incrementado y emitiéndola si no lo ha hecho. Luego lo incrementa para que no se impriman valores duplicados.

Pruébalo en línea!

Xanderhall
fuente
0

8 ° , 138 131 bytes

Código

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

Explicación

[] - Crear matriz de salida

swap dup >r - Guardar entrada para uso posterior

( 2 ^ r@ n:mod a:push ) 1 rot loop - Calcular extremo cuadrado

rdrop - Limpiar r-stack

' n:cmp a:sort - Ordenar matriz de salida

' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip - Deshágase de los duplicados consecutivos de la matriz

SED (Diagrama de efecto de pila) es:a -- a

Uso y ejemplo

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