Sua tarefa é simples: escreva um programa que receba um número inteiro como entrada e o produza se for ímpar e não faça nada de outra forma (não é permitido interromper). O desafio é que você só pode usar bytes ímpares.
Opcionalmente, você pode anexar uma nova linha à direita na saída.
Isso é código-golfe, a resposta mais curta em bytes (ímpares) vence.
Lacunas padrão são proibidas. Além disso, você não pode usar versões de idiomas mais recentes que a publicação deste desafio.
Exemplo de entrada> saída:
13
> 13
42
>
code-golf
restricted-source
M.Herzkamp
fonte
fonte
does nothing otherwise
significa? No Haskell, uma função com o tipoInt -> Int
retorna um número inteiro ou não interrompe ou gera algum erro. Se a entrada for igual, obviamente não deveria ser retornada, portanto, interromper ou lançar um erro nesse caso seria aceitável?alphabet=new Set(Array(256).fill(0).map((v,i)=>i).filter(v=>v%2).map(String.fromCharCode));
. Verifique se a fonte é válido:[..."SOURCE CODE"].every(v=>alphabet.has(v))
. Veja caracteres inválidos na fonte:[...new Set("SOURCE CODE")].filter(v=>!alphabet.has(v))
. Lembre-se de escapar suas citações,"
=>\"
;)Respostas:
Japt
-f
, 1 byteu
tem um valor de código de char de117
.Tente
fonte
Lenguage ,
645529908926937253684695788965635909332404360034079939415799150094049227072719076304944873511742697489376175615338418980647354995512293382937520069756300171520285993Isso é aproximadamente igual a 2 duodecilhões de bytes.
O arquivo é traduzido para o seguinte programa brainfuck:
Recebe a entrada como um código ASCII, com um valor máximo de 256. Usa quebra automática.
fonte
,[<<+>+>-]<[>>+<<-]+>>[-[->]<]<[<[<]>.<]
?,[[>]++[-<]<+>>]>[<<<.<]
apenas por 3452857532394791089951 bytes?,-[-->++<]>+.
funciona tambémCódigo da máquina x86-64, 8 bytes
Inspirado na solução de Bruce Forte , mas um pouco abaixo do par. :-)
Um único parâmetro inteiro é obtido no
EDI
registro, seguindo a convenção de chamada do System V AMD64.Uma cópia desse valor é feita inicialmente e inserida
EAX
para que possa ser retornada, se apropriado. (LEA
é usado em vez do normalMOV
porque precisamos de uma instrução com bytes ímpares.)Em seguida, o valor in
EDI
é deslocado para a direita por 1, o que coloca o bit deslocado no sinalizador de transporte (CF). Este bit será 0 se o número for par ou 1 se for ímpar.Em seguida, testamos CF usando a
JNC
instrução, que será ramificada apenas se CF for 0 (ou seja, o número foi par). Isso significa que entraremos em um loop infinito para valores pares. Para valores ímpares, nós caímos e o valor original (inEAX
) é retornado.Há um pouco de truque com a
JNC
instrução - ela tem umREP
prefixo! Normalmente, osREP
prefixos são usados apenas com instruções de string, mas como os manuais da Intel e da AMD concordam queREP
prefixos irrelevantes / supérfluos / redundantes são ignorados, lançamos um na instrução de ramificação aqui para torná-lo com 3 bytes de comprimento. Dessa forma, o deslocamento relativo que é codificado na instrução de salto também é ímpar. (E claro,REP
é é um prefixo de bytes ímpares).Graças a Deus
RET
é codificado usando um byte ímpar!Experimente online!
Caso você não pense em retornar o valor se for ímpar ou entrar em um loop infinito se for par (para que você nunca retorne) satisfaça os requisitos de "saída" do desafio, ou apenas deseje algo mais interessante, aqui está uma função que gera o valor para uma porta serial (mas apenas se for ímpar, é claro).
Código da máquina x86-64 (saída para porta serial), 17 bytes
O que torna isso um pouco mais interessante é que o código faz mais , o que significa que foi mais desafiador fazer tudo isso usando instruções que são codificadas usando apenas bytes ímpares. Obviamente, isso também significa que ele falha no código de golfe, então é uma espécie de compensação - você quer ser interessante e desafiador ou quer ser breve?
De qualquer forma, isso usa a
OUT
instrução x86 para gravar na porta de E / S 0x3F8, que é a porta serial COM1 padrão em um PC. A parte divertida, é claro, é que todas as portas de E / S padrão (serial e paralela) têm endereços pares, de modo que não podem simplesmente ser codificadas como imediatas para aOUT
instrução ou movidas diretamente para um registrador. Você precisa inicializar com um a menos que o valor real e depois incrementar o valor no registro. Você também está limitado ao uso de certos registradores para a manipulação, porque precisa de registradores codificados usando bytes ímpares na instrução quando usados como operandos.Além disso, tive que inicializar o
DX
registrador (viaCX
registrador) na parte superior do loop, mesmo que isso seja necessário apenas se o valor for ímpar, para garantir que aJNC
instrução tenha um deslocamento ímpar. No entanto, como o que estamos pulando é aOUT
instrução, todo esse código é desperdício de ciclos e registros de arranhões; Na verdade, não saída de qualquer coisa, para que ele não quebrar as regras.Finalmente, esta função retornará (depois de ter feito ou não a saída para a porta serial) com o valor de entrada deixado em
EAX
. Mas isso realmente não quebra nenhuma regra; todas as funções na linguagem assembly retornam com um valor emEAX
- a questão é apenas se é um valor significativo ou um valor de lixo . Isso é determinado pela documentação da função (essencialmente, ela retorna um valor ou retornavoid
) e, neste caso, estou documentando como não retornando um valor. :-)Nenhum link TIO para este, pois ele não implementa saída para portas seriais. Você precisará de ferro de verdade ou imaginação.
fonte
MOV
instrução, seus operandos também precisam ser codificados em bytes. Nesse caso, esses seriam os registros de origem e destino (embora operandos também possam ser valores imediatos, que são como constantes). Registradores diferentes são mapeados para bytes diferentes, e alguns desses bytes são pares. Então, por exemplo, o que eu gostaria de usar seriamov eax, edi
, mas isso é89 F8
em bytes. Veja muito mais do que você sempre quis saber sobre codificações aqui, na seção "código" . @ M.HerzkampGeléia , 2 bytes
Esses caracteres correspondem aos bytes 0xF7 e 0xBF na página de código do Jelly .
Experimente online!
fonte
05AB1E , 3 bytes
O código corresponde aos valores dos bytes
C9,69,3D
ou201,105,61
que são todos ímpares.Experimente online!
Explicação
fonte
= # print without newline
que é realmente impresso com nova linha sem aparecerÉ×
parece não funcionar):D
na frente, mas é uniforme e não é mais curto. A razão pela qual não funciona é que a entrada implícita repetida é tomada como segundo argumento.MATL , 3 bytes
MATL utiliza caracteres ASCII, de modo que
o?G
corresponde aos bytes (decimais)111
,63
,71
.Experimente online!
Explicação
fonte
Haskell ,
3633 bytesExperimente online!
Uso:
o 7
yiedls7
,o 8
entra em um loop infinito.O algoritmo real é
O primeiro problema que enfrentei foi a falta de espaço e
(
, porque uma funçãoo
que recebe um argumentom
é geralmente definida comoo m=...
ouo(m)=...
. No entanto, descobri que um comentário embutido também{- some comment -}
funciona como delimitador de token, portanto, uma definiçãoo{--}m=...
é possível sob as regras fornecidas. Edit: Ørjan Johansen apontou que é possível usar um caractere de tabulação em vez de um espaço, economizando três bytes:o m=...
O segundo problema foi a chamada recursiva
o(m-2)
.-2
é justo-1-1
, mas aqui o truque de comentário não funciona porque os parênteses são necessários. Corrigi isso deixando a função funcionar em uma lista singleton contendo um número:o[m-2]
no entanto, como essa não é uma maneira padrão de fornecer entrada, terceirizei o cálculo para uma função auxiliarc
que funciona em listas e chamadas ac
partir daso
quais tem o formato correto .fonte
\t
vez de{--}
.Python REPL, 38 bytes
Recebe a entrada como o valor da expressão anterior usando
_
. A saída será uma sequência (a representação da sequência inteira para ímpar ou a sequência vazia para par).Experimente online
Para executá-lo em um shell real, você pode experimentá-lo aqui . Digite a entrada, pressione enter. Cole o código, pressione enter.
Explicação:
Demorou um pouco para descobrir. Não há multiplicação, ramificação, fatias, vírgulas, nem pontos, nem importações, parênteses, não
exec
, nãoeval
, nãoprint
e funções. Eu tenho uma solução trabalhando nessa saída usando stderr, mas então percebi que tínhamos que produzir o número inteiro real, não apenas um valor de verdade / falsey.Eu uso colchetes no lugar de parênteses com
[expression][-1]
. Simplificando que transforma o código acima em'%s'%(['']+[_])[_%(1+1)]
.Como não pode haver vírgulas, usei a adição de lista para criar
['',_]
. Usando a formatação de string, o resultado desejado é obtido.fonte
None
seria uma correspondência ainda melhor do que''
. De qualquer forma, isso ainda é 10000 vezes melhor do que qualquer coisa que eu possa criar.False
. Idk como você poderia conseguirNone
, no entanto.CJam, 6 bytes
113
95
105
89
37
37
Este programa pega o mod 2 da entrada (chame-o de r ) e imprime cada r- ésimo caractere na string de entrada. Se o número de entrada for ímpar, ele imprime toda a string, mas, se solicitado a imprimir todos os caracteres 0, o programa gera um erro.
Experimente aqui
fonte
qi_Y%]W%{}/M?
e depois vi isso.Cubix ,
231917 bytesTente!
@
, que finaliza um programa Cubix, é ascii 64, então, infelizmente, isso realmente entra em um loop infinito após o teste de estranheza. Nenhum link TIO, pois o tempo limite será excedido.=
(ascii 61) é um no-op no Cubix.Essa é uma pequena modificação do algoritmo anterior (mesmo número de bytes) que realmente funciona para números inteiros negativos.
Versão do cubo:
Algoritmo:
I
(73)
: ler na entrada como número1
(49)
: push 1)
(41)
: incremento%
(37)
: pegue o mod/
(47)
: vire a esquerda!
(33)
: pula a próxima instrução se ímpar1;;/;
;
é(59)
: prepara a pilha para saídaO
(79)
: Saída como um número.I
lê um0
para o final da entrada, por isso temos a garantia de inserir o ramo paru
(117)
: inversão de marcha à direita;;;!I
: loop, efetivamente não fazendo nada.fonte
?
Carvão , 9 bytes
Experimente online!
Basicamente, imprime a entrada à direita, se não for um múltiplo de 10/5 (o
²
caractere está na página de código do carvão vegetal ). Os caracteres usados são:¿
: códigoBF
.﹪
: códigoA5
.I
: códigoC9
.θ
: códigoF1
.÷
: códigoAF
.χ
: códigoE3
.⁵
: códigoB5
.→
: código13
.De fato, o
→
fim do fim é redundante, mas então eu vi que a resposta tinha que ter um comprimento estranho ...Explicação:
fonte
→θ
.código de máquina x86_64 (Linux),
1211 bytesInfelizmente
0x80
é par, mas ainda funcionou (supondo que "não faz nada" significa não retornar):-1 byte, obrigado @CodyGray!
Experimente online!
fonte
lea (%edi),%eax
requer um prefixo de substituição de tamanho de endereço (0x67
) quando a origem é um registro de 32 bits. Você pode eliminar isso fazendolea (%rdi),%eax
. Isso economiza um byte e, na verdade, tornaria o código um pouco mais eficiente (prefixos diminuem a decodificação e preenchem o i-cache). Existem outras coisas que você pode fazer para reduzir ainda mais isso, mas isso constitui essencialmente uma reescrita completa, então postarei minha própria resposta. :-) Eu também votei nisso, é claro! (Oh, só percebi que você pode ter usado o prefixo para fazer o deslocamento estranho Bem salto, você vai precisar de mais magia..)F6
) para aJNE
instrução porque ele tem um deslocamento par. Foi isso o que quis dizer com o último parênteses que editei no meu primeiro comentário. Você realmente precisa desse prefixo para criar um alinhamento ímpar. Ou você deve reescrever o código de alguma outra maneira. Eu brinquei com várias variações diferentes. Na verdade, eu olhei para isso ontem à noite e estava tentando descobrir uma boa maneira de usarOUT
para gerar valores ímpares, mas nenhuma solução realmente me ocorreu. O insight aqui para mim é entrar em um loop infinito para valores pares.BT
família de instruções, que ninguém usa nunca (infelizmente, todas as codificações de registro são mesmo bytes). Eu pensei que poderia ser mais interessante escrever código que produza para uma porta serial, em vez de apenas retornar um valor ou qualquer outra coisa, mas isso aumenta a contagem de bytes lá em cima (especialmente porque os endereços de porta serial em hexadecimal são iguais!), Então eu desistiu disso.Mathematica, 20 bytes
Parece ser a primeira solução em linguagem não-golfe.
Na
MacintoshChineseTraditional
codificação de caracteres.\[Divides]
é{161, 253}
(2 bytes)Versão alternativa (23 bytes)
ou (mostrado em Unicode)
na
Symbol
codificação de caracteres. (use apenas caracteres de 1 byte)A solução define uma função
g
(ouΓ
) que é avaliada para entrada quando a entrada é ímpar e literalmente "não faz nada" (não avalia) quando a entrada é par.fonte
;
no final) se o número de bytes precisar ser par; e\[Divides]
também possui um ponto de código Unicode ímpar.I[1+1]
, você pode apenas usar{1+1}
. Além disso, você verificou se os bytes dos colchetes são válidos? Se sim, você pode obter2
de\[LeftFloor]E\[RightFloor]
.Symbol
piso válido, mas não tem nemE
nem\[ExponentialE]
.D
;v
; nemd
, uma vez que têm um valor de byte par .. :(\[Divides]
é um caractere único no Mathematica, representado por 2 bytes{161, 253}
.Perl, 54 bytes
Requer
-E
.Eu realmente gostei desse desafio, acho que gostaria de tentar melhorar essa resposta, mas acho que esse pode ser o mais curto que posso fazer por enquanto. Estou brincando com essas respostas há alguns dias, mas sinto que estou feliz com a solução de 54 bytes!
Experimente online!
Explicação
Por padrão, a maioria das funções de string do Perl funciona
$_
, que está vazia para iniciar.Primeiro,
s//A_=Y[;A_=A_%O?A_W''/
substitui a sequência vazia por$_
eA_=Y[;A_=A_%O?A_W''
, em seguida,y/#A-_/#-A/
substitui os caracteres com base na seguinte lista (o caractere acima se torna o caractere abaixo):quais atualizações
$_
devem conter$_=<>;$_=$_%2?$_:''
. Em seguida,s/[#-}]+/uc/ee
substitui todos os caracteres[#-}]+
poruc
. Sem/ee
isso, seria apenas a stringuc
, mas/ee
avalia o conteúdo da string duas vezes. A primeira avaliação retorna o resultado deuc
, que é uma versão em maiúscula,$_
mas como$_
não contém caracteres alfabéticos, isso retorna a sequência inteira, então a segunda/e
avalia a sequência novamente, que define$_
como$_
(o número de entrada) ou''
depende de se não o número é ímpar ou par.Finalmente, como
$_
agora contém o que queremos, chamamossay
(que é o que requer, em-E
vez de-e
) quais impressões são$_
seguidas por uma nova linha.Perl alternativo, 93 bytes
Código de 92 bytes + 1 para
-p
, o que acho que o tornaria não competitivo.Contém uma guia e uma guia vertical na
y///
, indicada como\x09
e\x0b
.Experimente online!
fonte
LOGO ,
390465250 bytesEssa é uma lista de modelos que retorna a entrada se a entrada for ímpar e causa um erro se a entrada for par.
Uso:
saída
já que 5 é ímpar e
causará um erro porque 6 é par.
fonte
TI-BASIC, 14 bytes
Isso gera um erro de domínio (imprimindo nada na tela inicial) em um número par.
fonte
Pitão ,
1411109 bytesConjunto de teste .
fonte
I%Qy1Q
também não deveria funcionar?y1
... No entanto%
, infelizmente, não é permitido.%
tem valor ASCII 37 e é ímpar.Japonês , 4 bytes
Japt usa ISO / IEC 8859-1 , portanto, isso corresponde a (em decimal)
117 41 231 85
.Teste online!
Explicação
Primeiro tentei soluções usando
p
, que é basicamenteç
com argumentos invertidos. No entanto,p
executa exponenciação se o argumento esquerdo for um número, portanto, precisaríamos convertê-lo explicitamente em uma string. Essa solução acaba sendo um byte mais curto, além de não conter bytes ímpares.fonte
dc , 21 bytes
Decimal:
91 99 93 115 97 63 107 75 75 67 73 45 49 59 49 107 37 49 33 61 97
Conforme esse padrão de E / S, este programa deixa a entrada na pilha principal se for ímpar e esvazia a pilha caso contrário. Isso pode ser confirmado adicionando o
f
comando debug ao final do programa, como é o caso na página do TIO.Experimente online!
Explicação
fonte
TI-Basic, 18 bytes
Economizou 2 bytes graças a lirtosiast
em bytes (+2 novas linhas = 3F)
Consulte http://tibasicdev.wikidot.com/one-byte-tokens
fonte
Input Q[newline]sinֿ¹(gcd(Q²,int(e[newline]Q
(14 bytes). Posso postar como resposta separada?MathGolf , 3 bytes
Experimente online!
Os bytes usados são
157, 123, 107
.Explicação
fonte
Bash , 31 bytes
Experimente online!
Explicação:
fonte
rd $20|h
e nova linha.) #