O cenário
Ultimamente você tem notado algum comportamento estranho com seu editor de texto favorito. A princípio, parecia que estava ignorando caracteres aleatórios no seu código ao gravar no disco. Depois de um tempo você notou um padrão; caracteres com valores ASCII ímpares estavam sendo ignorados. Sob uma inspeção mais aprofundada, você descobriu que só pode gravar arquivos corretamente se cada oitavo bit for zero. Agora você precisa saber se seus arquivos valiosos foram afetados por esse bug estranho.
A tarefa
Você deve escrever um programa completo que determine se um arquivo contém bytes ímpares (demonstrando que não está corrompido). Mas, devido ao seu editor de texto, você não pode escrever bytes ímpares no seu código-fonte. Você pode assumir qualquer codificação preexistente para entrada, mas ainda deve verificar cada byte individual, não apenas caracteres.
Entrada
Seu programa pegará o conteúdo ou o caminho para um arquivo a partir do stdin ou da linha de comando.
Resultado
Seu programa produzirá para stdout um valor verdadeiro se o arquivo fornecido contiver um byte ímpar ou um falso se cada oitavo bit for zero.
Critério
Este é o código golf, o programa mais curto que completa a tarefa ganha. Para ser um envio válido, cada oitavo bit no código-fonte dos arquivos deve ser zero. Eu recomendaria incluir uma cópia dos binários do seu código-fonte no seu envio.
Aplicam-se brechas padrão .
Casos de teste
(Na codificação ASCII) Entrada:
"$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
Output:
falsy
Input:
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}
Output:
truthy
Input:
LOREMIPSVMDOLORSITAMETCONSECTETVRADIPISCINGELITSEDDOEIVSMODTEMPORINCIDIDVNTVTLABOREETDOLOREMAGNAALIQVA
VTENIMADMINIMVENIAMQVISNOSTRVDEXERCITATIONVLLAMCOLABORISNISIVTALIQVIPEXEACOMMODOCONSEQVAT
DVISAVTEIRVREDOLORINREPREHENDERITINVOLVPTATEVELITESSECILLVMDOLOREEVFVGIATNVLLAPARIATVR
EXCEPTEVRSINTOCCAECATCVPIDATATNONPROIDENTSVNTINCVLPAQVIOFFICIADESERVNTMOLLITANIMIDESTLABORVM
Output:
truthy
Dicas
Escolha sabiamente o idioma. Esse desafio pode não ser possível em todos os idiomas.
O comando Unix
xxd -b <file name>
imprimirá os binários de um arquivo no console (junto com algumas coisas extras de formatação)Você pode usar outras codificações que não sejam ASCII, como UTF-8, desde que todas as outras regras sejam seguidas
fonte
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}
são os caracteres ASCII imprimíveis proibidos, para quem se importa. Os caracteres ASCII imprimíveis permitidos são" $&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
[CR]
bit será ímpar. Eu esperava que o WhiteSpace estivesse seguro, mas infelizmente[TAB]
. Se você quer ir para a velha escola, o EBCDIC oferece três vogais.Respostas:
GS2 , 4 bytes
Experimente online!
Hexdump
Como funciona
fonte
Befunge, 36 bytes
Sei que essa é uma pergunta antiga, mas queria tentar, porque achei que seria um desafio interessante no Befunge.
Experimente online!
É emitido
1
se a entrada estiver corrompida (ou seja, contiver um byte ímpar) e0
se estiver OK.Explicação
O problema é como determinar bytes ímpares sem ter acesso aos comandos
/
(dividir) ou%
(módulo). A solução foi multiplicar o valor por 128 (a sequência28*8**
) e gravar esse resultado no campo de jogo. Em um intérprete estritamente padrão, as células do campo de jogo são assinadas com valores de 8 bits, portanto, um número ímpar multiplicado por 128 fica truncado para -1 enquanto um número par se torna 0.O outro truque era ler o -1 ou 0 de volta do playfield sem ter acesso ao
g
comando (get). A solução alternativa para isso foi gravar o valor no meio de uma sequência de strings existente (" "
) e, em seguida, executar essa sequência para enviar o valor incluído para a pilha. Nesse ponto, determinar a estranheza do byte é um teste simples menor que zero.Um aspecto final que vale a pena discutir é a saída. No caso falso, alcançamos a
>$.
sequência com apenas um valor na pilha,$
limpando a pilha, tornando a.
saída zero. No caso real, seguimos o caminho20`:>$.
. Como dois é maior que zero, a comparação coloca um na pilha e:
faz uma cópia duplicada para$
que não a solte antes de ser impressa .fonte
CJam (11 bytes)
Demonstração online
Retirando os truques para evitar bytes ímpares, isso reduz a
que lê a entrada, mapeia um AND bit a bit com
1
e executa uma conversão base, fornecendo zero se todos os AND eram zero.fonte
:(
Arquivo .COM imprimível, 100 bytes
Hexdump:
Usando uma definição muito vaga de fonte como algo que pode ser razoavelmente digitado por um humano e inspirado no Arquivo de Teste Antivírus Padrão da EICAR (mais informações em "Vamos nos divertir com o arquivo de teste da EICAR" no Bugtraq).
Usando apenas bytes ASCII não ímpares imprimíveis (observação: opcodes que afetam palavras tendem a ser ímpares, o bit W é o lsb de alguns opcodes), ele constrói um fragmento de código em SP (que convenientemente definimos após o código de geração) , e a execução acaba caindo no código gerado.
Ele usa o fato de que a pilha contém inicialmente um ponteiro próximo ao início do PSP e que o início do PSP contém a
INT 20h
instrução (mais informações sobre isso em https://stackoverflow.com/questions/12591673/ ).Fonte real:
fonte
MATL , 7 bytes
O código fonte usa codificação UTF-8. Portanto, os bytes de origem são (em decimal)
A entrada é um nome de arquivo, tomado como uma cadeia entre aspas simples. A saída é o número de bytes ímpares no arquivo, que é verdadeiro se diferente de zero.
Explicação
fonte
CJam,
181715 bytesSupõe que o código do idioma esteja definido como Latin-1. Experimente online!
Como funciona
A solução direta é a seguinte.
Infelizmente, os caracteres
q
ei
não podem aparecer no código fonte. Para contornar esse problema, criaremos parte do código-fonte acima dinamicamente e depois avaliaremos a string.fonte
Pitão,
2013 bytesOu em binário:
Experimente online
Como funciona
O inteiro resultante é verdade (diferente de zero) se algum dos bytes for ímpar.
fonte
Jelly , 13 bytes
Espera a entrada como um argumento de linha de comando entre aspas. Experimente online!
Hexdump
fonte
O%2¬Ạ¬
.Retina , 106 bytes
Remove todos os caracteres permitidos e corresponde aos caracteres restantes. Os valores reais serão o número de caracteres encontrados. Os valores de Falsey serão
0
.Experimente online
Como
.
não corresponde às novas linhas por padrão, não preciso removê-las.fonte
Perl 5 +
-p0
, 136 bytesSemelhante a outras respostas, isso remove todos os bytes pares e deixa os bytes ímpares (que são verdadeiros).
Experimente online!
fonte
-0
não faz nada para novas linhas. Ele só determina como dividir a entrada, não remove nenhum caractere.-0
, eu queria fazer todo o bloco como um pedaço, mas isso não deveria importar, mas não posso contornar isso ... Que pena! Vou limpar esses comentários. Obrigado pelo alerta!Japonês , 10 bytes
Experimente online!
A página de código de Japt é ISO-8859-1. O código fornece
false
quando ele próprio é inserido como uma sequência, portanto, um envio válido.Descompactado e como funciona
Não ter
String.c
(obter código ou mapear sobre códigos) foi um problema, mas felizmente existeNumber.d
(converter número em char).Acontece que Japt ganha sobre CJam, Pyth e Jelly :)
Sem a restrição, existem algumas maneiras de fazer isso em 6 bytes (parando novamente com CJam e Jelly):
"000..000"
é convertido para o número 0 (falso), independentemente de quanto tempo é. Por outro lado, qualquer coisa que contenha 1 é convertida em um valor diferente de zerodouble
, ouInfinity
se for muito grande (ambos de verdade).Abordagem mais direta que produz diretamente
true
oufalse
.Ou uma solução de 5 bytes é possível com a ajuda do
-d
sinalizador:fonte