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


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:



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


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

¿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


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


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

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]

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.


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


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

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

¡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!


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




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.


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


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!



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
}

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


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!


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]

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.