A sua tarefa é escrever um programa / função não-vazia de contagem de bytes G , que, quando utilizadas M vezes, verifica se um determinado número inteiro positivo N é igual a L x M .
Em teoria, você deve suportar um número arbitrário de repetições (um valor inteiro positivo arbitrário de M ), mas tudo bem se, devido a limitações de idioma, ele não puder funcionar acima de um determinado limite. É estritamente proibido ler o código fonte do seu programa ou acessar informações sobre ele .
Para fornecer saída, você deve escolher um valor consistente para um dos estados (verdadeiro ou falso) e usar qualquer outra saída possível (não necessariamente consistente) para o outro estado ( Discussão ).
Suas respostas serão pontuadas pelo comprimento L do seu programa inicial (em bytes), com menos bytes sendo melhores.
Exemplo
Digamos que seu programa (inicial) seja ABCDE
. Então:
ABCDE
(1 repetição) deve verificar se a entrada é igual a 5 .ABCDEABCDE
(2 repetições) deve verificar se a entrada é igual a 10 .ABCDEABCDEABCDE
(3 repetições) deve verificar se a entrada é igual a 15 . Etc ...
A pontuação desse código de exemplo seria 5 , pois a fonte inicial tem 5 bytes.
fonte
L
concatenado após oM
tempo deve retornar se sua entradaN
é igual aL*M
?Respostas:
Geléia , 1 byte
A saída é 0 para uma correspondência, diferente de zero para uma não correspondência.
Experimente online!
Como funciona
Isso tira proveito do formato de saída excessivamente liberal. A repetição de tempos
’
M simplesmente diminui os tempos M de entrada , de modo que o resultado será zero se e somente se a entrada for LM , onde L = 1 .fonte
Haskell, 8 bytes
Experimente online!
Como muitas outras respostas, ele retorna 0 para verdade e não 0 para falsidade, subtraindo repetidamente o comprimento do código do número de entrada.
fonte
Retina ,
2120 bytesExperimente online! Apenas repita a parte na janela Código para ver como ela lida com os múltiplos.
Fornece
0
os inteiros múltiplos e positivos corretos para todo o resto.Explicação
Vamos dar uma olhada no programa único primeiro:
Isso converte um número decimal em unário (usando
_
como dígito unário).Se a sequência estiver vazia (o que não pode acontecer neste momento, porque a entrada é garantida como positiva), substituímos por uma única
_
.Agora nos livramos dos 20 primeiros sublinhados. Se a entrada foi
20
, isso resulta em uma sequência vazia.E, finalmente, contamos o número de sublinhados no resultado, que é zero se a entrada foi
20
.Agora, o que acontece quando repetimos o código fonte. Como não inserimos um avanço de linha ao ingressar nos programas, a primeira linha irá para o final da última linha, obtemos isso quando o dobro do programa:
Agora, em vez de contar os sublinhados, terminamos com o seguinte estágio:
Esse estágio não faz nada, porque não há mais dígitos na cadeia de trabalho nesse momento, portanto, a regex não pode corresponder.
Agora, esse estágio se torna relevante. Se a entrada tiver um múltiplo menor de 20, a sequência será esvaziada pela cópia anterior do código-fonte. Nesse caso, nós o transformamos em um único sublinhado, que sabemos que nunca poderá ser transformado em uma sequência vazia novamente pelo nosso programa. Dessa forma, garantimos que apenas o M- múltiplo seja aceito (e nem todos os múltiplos até o M- ésimo).
Removemos os 20 primeiros sublinhados mais uma vez. Portanto, M repetições do código-fonte removerão 20 M de sublinhados da string, se possível.
E quando chegamos ao final do programa, ainda contamos sublinhados para que as entradas válidas dêem zero.
fonte
fragmento de código de máquina x86 de 32 bits, 1 byte
Entrada no EAX, saída no EAX: 0 para true, diferente de zero para false. (Também deixa o sinalizador ZF definido como verdadeiro, não definido como falso, para que você possa
je was_equal
). Como um "bônus", você não precisa se preocupar com a embalagem; O x86 de 32 bits pode endereçar apenas 4GiB de memória, então você não pode fazer M grande o suficiente para envolver e encontrar1 == 2**32 + 1
algo assim.Para criar uma função que pode ser chamada, anexe um
0xC3
ret
instrução após repetir0x48
M vezes. (Não é contado na contagem total, porque muitas linguagens precisam repetir apenas o corpo da função, ou uma expressão, para poder competir).Pode ser chamado do GNU C com o atributo de função x86 do protótipo
__attribute__((regparm(1))) int checkeqM(int eax);
GNU Cregparm
, como-mregparm
, usa EAX para passar o primeiro argumento inteiro.Por exemplo, este programa completo leva 2 args e JITs M copia a instrução + a
ret
em um buffer e a chama como uma função. (Requer heap executável; compile comgcc -O3 -m32 -z execstack
)os executáveis não PIE são carregados mais baixo na memória virtual; pode fazer um malloc contíguo maior.
Note-se que GNU C não suporta objeto tamanhos maiores do que
ptrdiff_t
(assinado de 32 bits), masmalloc
ememset
fazer ainda trabalho, então este programa bem-sucedido.Fragmento de código de máquina ARM Thumb, 2 bytes
O primeiro argumento de entrada
r0
e o valor de retornor0
é a convenção de chamada padrão do ARM. Isso também define sinalizadores (os
sufixo). Fato engraçado; o não versão de definição de -flag desub
uma instrução de largura de 32 bits.A instrução de retorno que você precisa anexar é
bx lr
.Fragmento de código de máquina AArch64, 4 bytes
Funciona para números inteiros de 64 bits. Entrada / saída em
x0
, conforme a convenção de chamada padrão.int64_t foo(uint64_t);
O AArch64 ainda não possui o modo Thumb, portanto, 1 instrução é a melhor que podemos fazer.
fonte
__builtin___clear_cache
é necessária apenas porque você está executando a memória da qual obtevemalloc
. Se você obteve a memóriammap
, a otimização não acontece.V , 16 (ou 1) bytes
Resposta chata:
um byte.
Resposta menos chata:
Experimente online!
Hexdump:
Na verdade, eu escrevi isso cerca de 5 minutos após o desafio. Levei 30 minutos para consertar essa pilha horrível de código de espaguete que eu chamo de linguagem .
fonte
Perl 5
-p
, 6 bytesExperimente online!
usa
0
para igualfonte
-p
solução Perl 6 válida .Braquilog , 2 bytes
Experimente online!
fonte
Python 3 , 27 bytes
Experimente online!
Código repetido duas vezes:
Experimente online!
fonte
Flak cerebral , 24 bytes
Experimente online!
Retorna
0
para igual e outra coisa para não igual.Como funciona:
Esse
n
tempo de execução do código subtrairán * 24
da entrada, fornecendo 0 somente quando a entrada =n*24
.fonte
Stax , 1 byte
Experimente online!
fonte
TI-Basic (série 83), 4 bytes
Recebe entrada
Ans
: por exemplo, você pode digitar17:prgmCODEGOLF
para executá-lo com uma entrada de17
. Imprime (e retornaAns
) o valor0
se a entrada for igual a L × M e, caso contrário, um valor diferente de zero.Observe que isso
:
faz parte do código; portanto, se você estiver inserindo isso no editor de programas, deverá verse você digitar uma vez e
se você digitar três vezes.
fonte
Haskell , 12 bytes
Experimente online!
Saídas
0
para verdade e algum número inteiro diferente de zero para falsidade.Solução alternativa, 12 bytes
Experimente online!
fonte
Befunge-98 , 15 bytes
Experimente online!
Experimente dobrou!
Usa 0 para igual e qualquer outra coisa para desigual.
Explicação:
Este código repetido várias vezes será algo como isto:
]
vire à direita. Envia o IP para baixo.>
mude para o leste. Envia o IP certo.f
pressione 16.v
mude para o sul. Envia o IP para baixo. Se for a última vez, vá para a etapa 8.]
vire à direita. Envia o IP para a esquerda.+
adicionar. Adiciona os 16 ao topo da pilha.v
mude para o sul. Envia o IP para baixo. Vá para a etapa 2.<
mude para o oeste. Envie o IP para a esquerda.#
pular. pule por cima]
e enrole até o fim.+
adicionar. Adiciona os 16 ao topo da pilha.&
entrada. Empurre um número do usuário.-
subtrair. obtenha a diferença de soma em que estávamos trabalhando e a entrada..
impressão. Imprima o resultado.@
fim.fonte
Pure Bash , 15
Entrada fornecida como um parâmetro da linha de comandos. Saída como um código de saída do shell -
1
para TRUE e0
FALSE.fonte
Carvão vegetal , 13 bytes
Experimente online!Com base na minha resposta para eu dobrar a fonte, você dobra a saída! Explicação:
Gerencia a saída
1
para verdade e0
falsidade. Repetições subsequentes comparar a contra a entrada13
,26
,39
,52
etc., mas cada vez que a resposta é sobreposta de modo somente a resposta final é visto.fonte
JavaScript ES6, 32 bytes
se verdadeiro for 0 e falso como outros, 31 bytes
fonte
MIPS, 4 bytes
Usa
$a0
como argumento e valor de retorno.MIPS, 8 bytes (usando a convenção de chamada MIPS)
x86, 5 bytes
Esta é a minha primeira resposta x86, por isso é bem-vindo. Usa a convenção _fastcall com ecx como primeiro argumento.
Peter Cordes tem uma solução de 1 byte nos comentários.
Comentário de Brainfuck : A parte difícil é fazer com que o cérebro retorne um único valor. Caso contrário, algo assim seria fácil.
fonte
sub $4, %al
/mov %al, %dl
. Ou ainda retorne no AL / EAX e você terá a solução de Dennis comdec %eax
(1 byte no modo de 32 bits). E sim, convenções de chamada personalizadas são adequadas para asm. É asm, não apenas "asm fácil de chamar de C"; O código real escrito em asm usa convenções de chamada personalizadas onde ajuda, portanto, isso é totalmente justificável.r0
que também é o retval; portanto, Thumbsub r0, #2
tem 2 bytes.ret
no final do bloco de repetição antes que você possa chamá-las. Normalmente, incluo aret
contagem de bytes em minhas respostas x86 asm. Mas acho que fazer sentido dobrar as regras aqui apenas para o corpo da função faz sentido; caso contrário, muitas linguagens não podem competir.xchg %eax, %ecx
/sub $4, %al
/xchg %eax, %ecx
tem 4 bytes e segue a convenção _fastcall. Usando o AL, as codificações curtas imm8 e xchg-with-eax geralmente são úteis para o código de golfe.objdump -drwC -Mintel
para obter um hexdump dos bytes de código de máquina.add r32, imm8
também é de 3 bytes: opcode + ModR / M + imm8. Todas as instruções que podem receber um imm32 possuem um código de operação alternativo que aceita um imm8 com extensão de sinal. Veja felixcloutier.com/x86/ADD.html por exemplo; todas as instruções ALU "clássicas" (mas não MOV) que datam de 8086 têm todas essas codificações, incluindo as AL / AX / EAX especiais sem modr / m, apenas op + imm8 / 16/32. Esta resposta tem exemplosOitava: 23 bytes
Se N = L * M, a expressão retorna
0+i
(ou seja, um número puramente imaginário), caso contrário, a expressão resulta em um número complexo com um componente real.Para um resultado um pouco melhor, com o custo de um byte extra:
Se N = L * M, a expressão retornará
-1
, caso contrário, um número positivo.Demo:
PS, você pode obter o mesmo resultado,
+24;if N==ans;-1;end;ans
mas o número de bytes é o mesmofonte
Lua,
5646 bytesEmite um 0 (sem uma nova linha à direita) se for igual e nada ou uma série de números negativos (com zero precedente em alguns casos) se não for igual.
Sozinho: Experimente online!
Repetidas várias vezes: Experimente online!
Explicação
Na primeira iteração (quando
a
ainda não foi definido e, portantonil
, é ), definea
como um número obtido da entrada, caso contrário, para si próprio. Nos dois casos, 46 é subtraído dea
.Isso apenas imprime
a
se for menor que (para cuidar de casos em que a entrada foi maior que o comprimento total) ou igual a zero e a string vazia, caso contrário.-10 bytes para lembrar que Lua faz conversões entre números e seqüências de caracteres automaticamente. Ops.
fonte
JavaScript (ES6), 47 bytes
Esta é usando a mesma técnica que Benoit Esnard em esta resposta (de I dobrar a fonte, você dobrar a produção! ).
Imprime 0 se n = 47 * M , ou um valor diferente de zero.
Demonstração para M = 1
Demonstração para M = 2
fonte
Flak cerebral , 24 bytes
Experimente online!
Apenas subtrai 24 da entrada. Saídas
0
para true e qualquer outra coisa para false.Flak cerebral , 68 bytes
Experimente online!
Este é mais sofisticado que gera
1
para verdadeiro e0
para falso.fonte