Como termina o quadrado?


20

Na Base-10, todos os quadrados perfeitos terminam em 0 , 1 , 4 , 5 , 6 ou 9 .

Na Base-16, todos os quadrados perfeitos terminam em 0 , 1 , 4 ou 9 .

Nilknarf descreve por que isso é e como resolver isso muito bem nesta resposta, mas também darei uma breve descrição aqui:

Ao quadrado um número da Base 10, N , o dígito "ones" não é afetado pelo que está no dígito "dezenas", ou no dígito "centenas", e assim por diante. Somente o dígito "uns" em N afeta o dígito "uns" em N 2 , portanto, uma maneira fácil (mas talvez não a mais divertida) de encontrar todos os últimos dígitos possíveis para N 2 é encontrar n 2 mod 10 para todos os 0 <= n < 10 . Cada resultado é um último dígito possível. Para Base-m, você pode encontrar n 2 mod m para todos os 0 <= n < m .

Escreva um programa que, quando recebida a entrada N , produz todos os últimos dígitos possíveis para um quadrado perfeito na Base-N (sem duplicatas). Você pode assumir que N é maior que 0 e que N é pequeno o suficiente para que N 2 não transborde (se você puder testar até N 2 , darei a você uma quantidade finita de pontos de brownie, mas saiba que a taxa de câmbio de pontos brownie para pontos reais é infinito para um).

Testes:

 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

isso é , então as regras padrão se aplicam!

(Se você acha isso muito fácil ou deseja uma pergunta mais aprofundada sobre o assunto, considere esta pergunta: Cobertura mínima de bases para teste de quadrática de resíduos de esquadria ).


1
A matriz de saída precisa ser classificada?
Shaggy

@Shaggy Nope! Mego, duplicação não é permitida. Teoricamente, N poderia ser enorme, portanto duplicatas tornariam a saída bastante ilegível. Vou ADIT a questão
Lord Farquaad

A saída de um conjunto é aceitável?
totallyhuman

2
@totallyhuman Por que não seria válido? Conjuntos são coleções desordenadas e não deve ser ordenada , por isso ...
O Sr. Xcoder

Respostas:



19

Planilhas Google, 52 51 47 bytes

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

Guardado 4 bytes graças a Taylor Scott

As folhas adicionam automaticamente 4 parênteses de fechamento ao final da fórmula.

Ele não retorna os resultados em ordem crescente, mas retorna os resultados corretos.

Resultados


Vaca sagrada, homem que é assassino! Quem teria pensado? +1
bearacuda13

1
Esta é definitivamente a minha resposta favorita até agora.
Lord Farquaad

@LordFarquaad Estou surpreso e satisfeito por ter sido tão bem recebido. Eu tenho tentado jogar mais golfe no Planilhas e no Excel, embora - e em parte porque - eles tenham intervalos tão limitados. Isso levou a muitas fórmulas de matriz.
Engenheiro Toast

Você deve ser capaz de largar a terminação )é de -4 bytes
Taylor Scott

@TaylorScott Thanks! Vi esse truque em algum lugar recentemente - provavelmente em uma de suas respostas - e preciso lembrar de começar a usá-lo.
Engenheiro brinde

6

05AB1E , 5 bytes

Lns%ê

Experimente online! ou como um conjunto de testes

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

Como sfunciona aqui? A entrada é repetida?
Luis Mendo

@LuisMendo sé pop a,b; push b,a. Quando um comando tenta tirar algo da pilha e não resta mais nada, a próxima entrada é usada. Se não houver mais nenhuma entrada, a última entrada será usada ( aqui está um exemplo ). Nesse caso, eu poderia ter usado o ¹que pressiona a primeira entrada, mas sfunciona melhor para o conjunto de testes.
Riley

Obrigado. Você tem mais informações sobre o critério para o qual a entrada é reutilizada? (se houver, digamos, três entradas e você tentar exibir dois valores de uma pilha vazia)?
Luis Mendo

1
A entrada @LuisMendo é usada em ordem até acabar, e continua a usar o último elemento. Você pode imaginar como se a pilha fosse preenchida com cada entrada em ordem e um número infinito do último elemento.
Riley

@LuisMendo Ln¹%êé equivalente aqui. s.
Magic Octopus Urn

6

Rápido , 47 35 32 * bytes

* -3 graças a @Alexander.

Possivelmente a primeira vez na história, os laços Swift superam o Python?

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

Experimente online!


Explicação

  • (0..<m).map{}- Repete o intervalo [0...m)e mapeia os seguintes resultados:

  • $0*$0%m- O quadrado de cada número inteiro modulo a base m.

  • Set(...) - Remove as duplicatas.

  • m in - Atribui a base a uma variável m


O nome de usuário está encerrado ... espere um segundo.
Rohan Jhunjhunwala 28/07

1
É mais parecido com o Python. Isso é impressionante ! Eu pensei que nunca veria o dia que aconteceria.
Caleb Kleveter 28/07

@CalebKleveter Thanks! Fico feliz que você achou impressionante :)
Mr. 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 teste


Versão não recursiva, 60 58 bytes

Guardado 2 bytes graças a @ThePirateBay

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

Casos de teste


Não-recursivo 58 bytes:m=>(a=[...Array(m).keys()]).filter(v=>a.some(n=>n*n%m==v))

@ThePirateBay Good catch. Obrigado.
Arnauld

3

Pitão, 6 bytes

{%RQ*R

Experimente online

Como 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

Braquilog , 10 9 bytes

>ℕ^₂;?%≜ᶠ

Experimente online!

Explicação

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

Eu estava prestes a sugerir {>≜^₂;?%}ᵘcomo uma alternativa ... então percebi que também há números negativos. > _ <
Erik the Outgolfer

1
@EriktheOutgolfer Depois que uma confirmação é solicitada ao TIO, eu posso realmente reduzir essa resposta para 9 bytes usando .
Fatalize 27/07

OK ... como isso funcionaria quando há números negativos também? Simplesmente os ignoraria ou algo assim?
Erik the Outgolfer

O mod @EriktheOutgolfer pode ser definido como o restante da divisão, o que seria positivo (o quociente recebe o sinal). EDIT: também, os quadrados são positivos.
jaxad0127

@ jaxad0127 Acho que não é o caso aqui, pois >ainda seria responsável por números negativos.
Erik the Outgolfer

3

Japonês , 7 6 bytes

Dz%UÃâ

Teste-o

1 byte salvo graças a Oliver


Explicação

Entrada implícita de número inteiro U.

Ç   Ã

Crie uma matriz de números inteiros de 0para U-1, inclusive e passe cada uma por uma função.

²

Quadrado.

%U

Módulo U.

â

Obtenha todos os elementos exclusivos da matriz e produza implicitamente o resultado.


1
Não acho que o alcance precise ser inclusivo. Dz%UÃâParece funcionar bem.
267 Oliver Oliver


2

Na verdade , 11 bytes

;╗r⌠²╜@%⌡M╔

Experimente online!

Explicação:

;╗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%_&}

Bloco anônimo que aceita um número e retorna uma lista.

Experimente online!

Explicação

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

Agradável! Eu tinha {:X{_*X%}%_&}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

Experimente online!


Infelizmente, a versão sem pontos f m=nub$map((`mod`m).(^2))[0..m]é tão longa, a menos que haja uma sintaxe sorrateira para se livrar de parênteses extras.
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 se retornar um Setarray em vez de uma matriz for aceitável.


1

Scala , 32 30 bytes

Uso simples da dica fácil do OP.

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

Experimente online!

-2 bytes graças a @MrXcoder, com prioridades (sem necessidade de ()volta* operação)

Pensando: é possível dizer implicitamente ao compilador para entender coisas como (0 to n-1)map(x=>x*x%n)toSet(sem a necessidade import scala.language.postfixOps)?


1
(0 to n-1).map(x=>x*x%n).toSetpor 30 bytes. A exponenciação tem maior precedência que o módulo.
Mr. Xcoder

@ Mr.Xcoder ooh ~ obrigado :) #
Courtois


0

Retina , 70 bytes

.+
$*

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

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

Experimente online! Aviso: Lento para entradas grandes. Versão um pouco mais rápida de 72 bytes:

.+
$*

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

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

Experimente online!



0

Perl 6 , 19 bytes

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

Teste-o

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

Pitão , 13 bytes

VQ aY.^N2Q){Y

Experimente online.

Esfarrapada tentativa 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 classificar a saída, insira um Sem qualquer lado do{

Eu acho que deveria haver uma maneira mais curta ...


1
Sim, o estilo funcional de Pyth tende a ser muito mais conciso . mapé seu amigo!
Anders Kaseorg





0

PHP , 53 bytes

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

Faça um loop de 0 ao número de entrada, usando a n^2 mod basefórmula para marcar os números que foram usados. Ele vai para essa posição em uma matriz, verificando se foi incrementado e emitindo-o se não tiver. Em seguida, o incrementa para que os valores duplicados não sejam impressos.

Experimente online!


0

8o , 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

Explicação

[] - Criar matriz de saída

swap dup >r - Salvar entrada para uso posterior

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

rdrop - Pilha r limpa

' n:cmp a:sort - Ordenar matriz de saída

' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip - Livre-se de duplicatas consecutivas da matriz

O SED (diagrama de efeito de pilha) é:a -- a

Uso e exemplo

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.