Movimentos únicos
O tabuleiro é uma grade quadrada bidimensional infinita, como um tabuleiro de xadrez ilimitado. Uma peça com o valor N (um motor N ) pode mover-se para qualquer quadrado que esteja a uma distância exata da raiz quadrada de N do seu quadrado atual (distância euclidiana medida centro a centro).
Por exemplo:
- Um motor único pode se mover para qualquer quadrado horizontal ou vertical adjacente
- Um motor de dois pode mover-se para qualquer quadrado diagonalmente adjacente
- Um 5-move se move como um cavaleiro de xadrez
Observe que nem todos os N-movers podem se mover. Um motor de três nunca pode deixar seu quadrado atual porque nenhum dos quadrados no quadro está a uma distância exata da raiz 3 do quadrado atual.
Movimentos múltiplos
Se for permitido mover-se repetidamente, algumas peças podem atingir qualquer quadrado no tabuleiro. Por exemplo, um motor e um motor podem fazer isso. Um motor de dois movimentos só pode se mover na diagonal e atingir apenas metade dos quadrados. Uma peça que não pode se mover, como um motor de três, não pode alcançar nenhum quadrado (o quadrado inicial não é contado como "alcançado" se nenhum movimento ocorrer) .
As imagens mostram quais quadrados podem ser alcançados. Mais detalhes ao passar o mouse. Clique para ampliar a imagem.
- Os quadrados alcançáveis em 1 ou mais movimentos estão marcados em preto
- Os quadrados alcançáveis em exatamente 1 movimento são mostrados por peças vermelhas
(além dos 3 motores, que não podem se mover)
Que proporção do quadro um determinado N-motor pode alcançar?
Entrada
- Um número inteiro positivo N
Resultado
- A proporção da placa que um N-motor pode alcançar
- Este é um número de 0 a 1 (inclusive)
- Para esse desafio, a saída como uma fração em termos mais baixos, como 1/4, é permitida
Portanto, para entrada 10
, ambas 1/2
e 0.5
saídas aceitáveis. A saída como numerador e denominador separados também é aceitável, incluindo idiomas que não suportam flutuações nem frações. Por exemplo, 1 2
ou [1, 2]
.
Para as saídas inteiras (0 e 1), qualquer um dos seguintes são formatos aceitáveis:
- Para 0:
0
,0.0
,0/1
,0 1
,[0, 1]
- para 1:
1
,1.0
,1/1
,1 1
,[1, 1]
Pontuação
Isso é código de golfe. A pontuação é o comprimento do código em bytes. Para cada idioma, o código mais curto vence.
Casos de teste
No formato input : output as fraction : output as decimal
1 : 1 : 1
2 : 1/2 : 0.5
3 : 0 : 0
4 : 1/4 : 0.25
5 : 1 : 1
6 : 0 : 0
7 : 0 : 0
8 : 1/8 : 0.125
9 : 1/9 : 0.1111111111111111111111111111
10 : 1/2 : 0.5
13 : 1 : 1
16 : 1/16 : 0.0625
18 : 1/18 : 0.05555555555555555555555555556
20 : 1/4 : 0.25
25 : 1 : 1
26 : 1/2 : 0.5
64 : 1/64 : 0.015625
65 : 1 : 1
72 : 1/72 : 0.01388888888888888888888888889
73 : 1 : 1
74 : 1/2 : 0.5
80 : 1/16 : 0.0625
81 : 1/81 : 0.01234567901234567901234567901
82 : 1/2 : 0.5
144 : 1/144 : 0.006944444444444444444444444444
145 : 1 : 1
146 : 1/2 : 0.5
148 : 1/4 : 0.25
153 : 1/9 : 0.1111111111111111111111111111
160 : 1/32 : 0.03125
161 : 0 : 0
162 : 1/162 : 0.006172839506172839506172839506
163 : 0 : 0
164 : 1/4 : 0.25
241 : 1 : 1
242 : 1/242 : 0.004132231404958677685950413223
244 : 1/4 : 0.25
245 : 1/49 : 0.02040816326530612244897959184
260 : 1/4 : 0.25
261 : 1/9 : 0.1111111111111111111111111111
288 : 1/288 : 0.003472222222222222222222222222
290 : 1/2 : 0.5
292 : 1/4 : 0.25
293 : 1 : 1
324 : 1/324 : 0.003086419753086419753086419753
325 : 1 : 1
326 : 0 : 0
360 : 1/72 : 0.01388888888888888888888888889
361 : 1/361 : 0.002770083102493074792243767313
362 : 1/2 : 0.5
369 : 1/9 : 0.1111111111111111111111111111
370 : 1/2 : 0.5
449 : 1 : 1
450 : 1/18 : 0.05555555555555555555555555556
488 : 1/8 : 0.125
489 : 0 : 0
490 : 1/98 : 0.01020408163265306122448979592
520 : 1/8 : 0.125
521 : 1 : 1
522 : 1/18 : 0.05555555555555555555555555556
544 : 1/32 : 0.03125
548 : 1/4 : 0.25
549 : 1/9 : 0.1111111111111111111111111111
584 : 1/8 : 0.125
585 : 1/9 : 0.1111111111111111111111111111
586 : 1/2 : 0.5
592 : 1/16 : 0.0625
593 : 1 : 1
596 : 1/4 : 0.25
605 : 1/121 : 0.008264462809917355371900826446
610 : 1/2 : 0.5
611 : 0 : 0
612 : 1/36 : 0.02777777777777777777777777778
613 : 1 : 1
624 : 0 : 0
625 : 1 : 1
fonte
Respostas:
JavaScript (Node.js) ,
144138125747370 bytesExperimente online!
-4 byte obrigado @Arnauld!
Abordagem original, 125 bytes
Experimente online!
Inspirado no vídeo Pi escondido em regularidades privilegiadas pela 3Blue1Brown.
Para cada fator primo na fatoração do número, calcule :pn f(pn)
Multiplique todos esses valores de função, aqui estamos.
Atualizar
Graças ao esforço dos colaboradores do Math.SE, o algoritmo agora é apoiado por uma prova
fonte
Mathematica, 80 bytes
Esse código depende principalmente de um teorema matemático. A idéia básica é que o código solicite a densidade de uma rede dada um conjunto de geradores.
Mais precisamente, nos é dada uma coleção de vetores - ou seja, aqueles cujo comprimento ao quadrado é N - e solicitados a calcular a densidade do conjunto de possíveis somas desses vetores, em comparação com todos os vetores inteiros. A matemática em jogo é que sempre podemos encontrar dois vetores (e seu oposto) que "geram" (ou seja, cujas somas são) o mesmo conjunto da coleção original. LatticeReduce faz exatamente isso.
Se você tiver apenas dois vetores, poderá imaginar um paralelogramo idêntico centralizado em cada ponto acessível, mas cujos comprimentos das arestas são os vetores fornecidos, de modo que o plano seja completamente revestido por esses paralelogramos. (Imagine, por exemplo, uma treliça de formas de "diamante" para n = 2). A área de cada paralelogramo é o determinante dos dois vetores geradores. A proporção desejada do plano é a recíproca dessa área, uma vez que cada paralelogramo possui apenas um ponto acessível.
O código é uma implementação bastante direta: gere os vetores, use LatticeReduce, tome o determinante e depois o inverso. (Provavelmente, pode ser melhor jogar golfe)
fonte
d@n_:=Boole[#!={}]/Det@LatticeReduce@#&@Select[Range[-n,n]~Tuples~2,#.#==n&]
Limpo ,
189185172171 bytesExperimente online!
Localiza todas as posições alcançáveis no
n
quadrado ao lado do canto, na origem no primeiro quadrante, e depois dividen^2
para obter a parte de todas as células alcançáveis.Isso funciona porque:
n
quadrado ao lado, cada uma encurralada em um ponto acessível a partir da origem como se fosse a origem.++ +- -+ --
, permitindo que o mosaico sobreposto seja estendido pelos outros três quadrantes através de espelhamento e rotação.fonte
Retina 0.8.2 ,
12682 bytesExperimente online! O link inclui casos de teste. Explicação:
Converta para unário.
Divida repetidamente por fatores primos do formulário
4k+1
.Se o resultado não for quadrado nem duas vezes quadrado, o resultado será zero.
Calcule o recíproco como uma fração decimal.
fonte
Regex (ECMAScript, saída recíproca),
256163157 157948382 bytes-93 bytes graças a Neil
-6 bytes graças novamente a Neil
-63 bytes executando a divisão sem capturar o divisor
-11 bytes graças à divisão opcional simultânea de Grimy por divisão constante por raiz constante e raiz quadrada de
-1 bytes movendo a condição de finalização e devolver a captura de valor ao loop como uma segunda alternativa, graças ao Grimy
Isso usa a mesma matemática que a resposta JavaScript de Shieru Asakoto .
A entrada está em unário. Como um regex puro só pode retornar como saída uma substring da entrada (ou seja, um número natural menor ou igual à entrada) ou "sem correspondência", esse regex retorna o inverso da proporção da placa que um N-motor pode alcançar. Como o recíproco de 0 é infinito, ele retorna "sem correspondência" nesse caso.
AVISO DE SPOILER : Para a raiz quadrada, esse regex usa uma variante do algoritmo de multiplicação generalizada, o que não é óbvio e pode ser um quebra-cabeça gratificante para você resolver sozinho. Para obter mais informações, consulte uma explicação para esta forma do algoritmo em Localizar um número Rocco .
Esse regex primeiro entra em loop identificando todos os fatores primos tais que e divide o número de entrada por cada um quantas vezes for possível. Seja o resultado final disso. Em seguida, ele testa indiretamente para ver se a fatoração primária de (e, portanto, também o número de entrada) inclui primos elevados a uma potência ímpar, testando para ver se ou é um quadrado perfeito. Se não, então incluiu um número primo elevado a uma potência ímpar e o regex retorna "sem correspondência"; caso contrário, ele retornará .p p≡1 (mod 4) m m ≡3 (mod 4) m m/2 m m
(Agora é um pouco mais complicado do que isso. Devido à otimização do golfe na versão de saída recíproca, ele testa não apenas e por ser um quadrado, mas também o resultado intermediário antes da divisão de cada , se o o primeiro teste falha. Isso não altera o resultado final, porque se o primeiro teste do quadrado perfeito falhar, pelo menos uma potência ímpar de um número primo ainda estará presente no número a cada passo, e não pode ser um quadrado.)m m/2 p ≡3 (mod 4)
^(?=((?=(x+)(?!(\2+)(\2\3)+$)((\2{4})+$))\5|((xx?)(\8*))(?=(\7*)\9+$)\7*$\10)+$)\1
Experimente online!
Experimente online! (apenas os casos de teste)
Regex (ECMAScript + (? *), Saída recíproca),
207138132bytesObsoleto ao fazer a divisão sem capturar o divisor (ou seja, agora é idêntico ao acima).
Regex (ECMAScript 2018, saída recíproca),
212140134bytesObsoleto ao fazer a divisão sem capturar o divisor (ou seja, agora é idêntico ao acima).
Regex (ECMAScript, saída de fração), 80 bytes
Nesta versão, o numerador é retornado em
\10
(zero se não definido / NPCG) e o denominador em\7
.Ao contrário da versão de saída recíproca:
A grande desvantagem de uma especificação de saída como essa é que ela não está contida no próprio programa.
((?=(x+)(?!(\2+)(\2\3)+$)((\2{4})+$))\5)*((((x)x?)(\9*))(?=(\8*)\11+$)\8*$\12|x)
Experimente online!
Experimente online! (apenas os casos de teste)
fonte
(((xx?)(\9*))(?=(\8*)\10+$)\8*$\11)
para verificar se N ou N / 2 é um quadrado.Geléia ,
2524 bytesUm link monádico usando a rota de fator principal.
Experimente online!
Quão?
Os 25 anteriores foram:
Programa completo forcer bruto
;códigopossivelmentemais longoque a rota de fator principal (eu poderia tentar isso mais tarde).Experimente online!
Começa por criação de movimentos individuais como coordenadas, em seguida, move-se repetidamente a partir de todos os locais que acumulam alcançados os resultados, tendo modulo
n
de cada coordenada (para restringir a umn
porn
quadrante) e manter aqueles que são distintas, até um ponto fixo é atingido; finalmente divide a contagem porn^2
fonte
05AB1E ,
272625 bytesPorto da resposta JavaScript de @ShieruAsakoto , por isso, certifique-se de que ele também vota !
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
APL (Dyalog Extended) , 21 bytes
Este programa usa a rota de fator principal. Sou grato a Adám, dzaima, H.PWiz, J.Sallé e ngn. O APL Orchard é um ótimo lugar para aprender APL e eles estão sempre dispostos a ajudar
Experimente online!
Ungolfing
A parte 2 deste código é a mesma da versão Dyalog Unicode abaixo e, portanto, nesta explicação, vou me concentrar em
⍭*1≠4|⍭
APL (Dyalog Unicode) ,
41403635 bytes SBCSEste programa usa a rota de fator principal. Aprendi alguns truques ao escrever isso e sou profundamente grato a Adám, dzaima, H.PWiz, J.Sallé e ngn. O APL Orchard é um ótimo lugar para aprender APL e eles estão sempre dispostos a ajudar (ou esse post nunca teria saído do papel :)
Edit: -1 byte de ngn. -2 bytes de Adám e -2 mais de ngn. -1 byte de ngn.
Experimente online!
Ungolfing
Este é um programa em duas partes:
fonte