Este é um desafio de policiais e ladrões . O tópico dos policiais para esse desafio está aqui
Uma pergunta interessante a se pensar é a seguinte:
Se eu tiver uma sequência de números, quantos deles eu tenho que fornecer antes que fique claro de que sequência estou falando?
Por exemplo, se eu quiser falar sobre os números inteiros positivos em ordem a partir de , eu poderia dizer , mas isso é realmente suficiente?1 , 2 , 3 , …
Eu tenho uma maneira de responder a essa pergunta e ser um jogador de código envolve código de golfe. Você forneceu termos suficientes de uma sequência se o código mais curto que produz esses termos produzir todos os termos da sequência. Se pensarmos sobre isso em termos de código-golfe, isso significa que você forneceu casos de teste suficientes para que o código mais curto que passe nos casos de teste realize a tarefa desejada.
Desafio
Esse desafio é um desafio de policiais e ladrões . Nos quais os policiais apresentarão casos de teste e os ladrões terão que encontrar uma maneira mais curta de falsificar os casos de teste, além da sequência pretendida. A polícia apresentará o seguinte:
Um pedaço de código que recebe um número inteiro positivo como entrada e produz um número inteiro como saída. Esse código pode ser zero ou um indexado, mas deve ficar claro qual é a indexação. Este código definirá sua sequência.
Quaisquer requisitos relevantes de plataforma ou idioma que possam afetar a saída, por exemplo, o tamanho de longint.
Um número , juntamente com os primeiros termos da sequência, calculados pelo código. Eles atuarão como "casos de teste".n
Os ladrões encontrarão um programa no mesmo idioma que seja mais curto que o apresentado e passará em todos os casos de teste (produz a mesma saída para as primeiras entradas do código do policial). O código do ladrão também deve diferir na saída do programa do policial para um número maior que .n
Pontuação
Os ladrões serão pontuados no número de rachaduras que encontrarem, com mais rachaduras sendo melhores. Uma resposta pode ser quebrada novamente, encontrando uma resposta válida menor que o crack original. Se uma resposta for quebrada uma segunda vez, o ponto é dado ao segundo cracker e não ao primeiro.
fonte
Respostas:
cQuents , resposta de Stephen , 3 bytes
Experimente online!
Como funciona
Looks como as seqüências devem ser idênticos, mas isso dá
12345678910
paran = 10
enquanto"::$
dá1234567891
.fonte
JavaScript, resposta de fəˈnɛtɪk (17 bytes)
Bem, foi fácil codificar para obter uma pontuação muito menor ... Difere da implementação de referência para qualquer entrada , indexada 0. Isso usa um truque de golfe JS muito conhecido: a indexação em uma sequência com um número inteiro que excede os limites retorna um valor falso ( ), para que possa ser simplesmente coagido a um valor padrão usando OR lógico , neste Nesse caso , manipular o último termo da sequência, mas também os seguintes.x ≥ 6
undefined
||
22
Teste
Como alternativa, experimente online!
fonte
Haskell , resposta de Laikoni , 15 bytes
Experimente online!
Normalmente, eu apontaria algo assim em um comentário, mas depois pensei que policiais e ladrões são um pouco mais agressivos.
Esta é apenas a resposta da BMO menos o caso especial
b 42
. Como o original de Laikoni passa por ponto flutuante, não é necessário: basta encontrar um número grande o suficiente para gerar erros de arredondamento nisso, mas não naInteger
aritmética exata . Por exemplo:fonte
Python 2 , resposta do xnor , 43 bytes
Experimente online!
Créditos
Grande parte do crédito por esse crack deve ser atribuída ao @ Mr.Xcoder, que primeiro postou um comentário sobre um possível ataque usando esse método, e ao @PoonLevi, que encontrou uma solução de 44 bytes.
Quão?
Teoria
Em particular, para :a = 2
Portanto, existe algum número inteiro positivo tal que:k
O que leva a:
Essa última fórmula é aquela da qual o código Python é derivado e agora vale para , mesmo que não seja relativamente primo consigo mesmo.p=2 2
Agora, para a parte mais importante: o inverso do pequeno teorema de Fermat não é verdadeiro. Podemos ter para algum número composto . Tais números são chamados pseudoprimes de Fermat para basear . Os pseudoprimes de Fermat para a base 2 também são conhecidos como números de Poulet .an−1≡1(modn) n a
O primeiro pseudoprime de Fermat para a base (ou o primeiro número de Poulet) é , para o qual temos:2 n=341=11×31
2 341 - 1 ≡ 1
Isto significa que o nosso algoritmo vai retornar em vez dos 69 esperados th nobre .347341 347
Implementação
O @PoonLevi encontrou a seguinte solução de 44 bytes, baseada diretamente em :(2)
Usando em1 21−1≡0(mod1)
<2
vez de==1
, salvamos 1 byte, mas introduzimos na sequência, porque :2 1 - 1 ≡ 0Experimente online!
Começando com , obtemos os termos esperados em 1 porque fazemos uma iteração a menos:p=2
Experimente online!
O último truque é usar em
n<1or
vez den and
. Isso é tão longo, mas faz com que a última iteração retorne True em vez de 0 , adicionando o deslocamento ausente a cada termo.fonte
Python 3 , crashoz , 45 bytes
Experimente online!
A expressãosin(x) x7
x*60-x**3*10+x**5/2-x**7/84
é a série de Taylor para até o termo , multiplicado por 60. Isso é preciso o suficiente nas entradas usadas, mas para valores mais altos, os dois divergem à medida que os termos truncados se tornam mais relevantes.x 7fonte
JavaScript (ES6), resposta de Arnauld (10 bytes)
Experimente online!
fonte
Haskell , resposta de Laikoni ,
2622 bytes-4 bytes por não usar infix
div
, graças ao Laikoni !Experimente online!
Explicação
Para o termo pode ser reescrito, o que nos fornece bytes suficientes para a correspondência de padrões em um que leva a uma rachadura em 28 bytes:n > 200≤n≤20 n>20
ceiling(realToFrac n/2)
div(n+1)2
fonte
((n+1)`div`2)
->div(n+1)2
.> <> , resposta de crashoz 203 bytes
Experimente online!
Eu ia fazer algo inteligente com o fato de que os números pares / ímpares acima
n=20
eram os mesmos, exceto por um elemento repetido no centro, mas era mais fácil codificar todos os elementos.A entrada é via
-v
bandeira. Não imprime nada para elementos acima de 34.fonte
Pascal (FPC) , resposta de AlexRacer , 80 bytes
Experimente online!
Quando as saídas são idênticas, mas quando o código acima gera , enquanto o código de AlexRacer gera .n = 128 127 1260≤n≤120 n=128 127 126
Parece uma resposta tardia, mas de qualquer maneira agradeça ao @AlexRacer por um bom quebra-cabeça!
fonte
JavaScript, resposta de fəˈnɛtɪk (12 bytes)
Isso funciona para os valores fornecidos, mas falha em muitos outros valores (por exemplo, ) devido a erros de precisão.x=6
Teste
Como alternativa, experimente online!
fonte
JavaScript, resposta de fəˈnɛtɪk (17 bytes)
Você pode ver no link TIO ou no resultado do Snippet de pilha que falha nas entradas maiores que .15
Se a precisão fosse necessária apenas para (os primeiros valores), também funcionaria para 16 bytes.15n≤14 15
x=>Math.exp(x)|1
Teste
Como alternativa, experimente online!
fonte
Husk , quebrando 5 byter do BMO com
32 bytes-1 graças ao BMO (
LdΣ
->LΣ
desde que, quando dado aTnum
,L
executa "comprimento da representação de string")Experimente online!
O comprimento digital dos números triangulares * corresponde e difere a ... quando produz enquanto produz .a ( 24 ) 3 4a(0)⋯a(23) a(24)
3 4
LΣ
←d+16
* Onde tem um comprimento digital de (não )1 0T(0)=0 1 0
fonte
L
eLd
são equivalentes, você economiza um byte;) #L
substituições como "comprimento da representação de string"Tnum
.> <> , Resposta de Aiden F. Pierce , 36 bytes
Experimente online!
Outra solução com cada valor codificado por linha. Como a resposta original também era principalmente codificada, não me sinto muito culpado por isso.
fonte
JavaScript, resposta de fəˈnɛtɪk , 23 bytes
Experimente online!
Quão?
A expressão se
`${73211e9}`
expande para a cadeia de caracteres"73211000000000"
, fornecendo uma tabela de pesquisa de 14 valores subtraídos de 14, que fornece a sequência esperada.21 bytes
NaN
Experimente online!
fonte