Seu objetivo é escrever um programa ou função que receba como entrada uma string que representa o caminho para um arquivo e emita um valor verdadeiro se esse arquivo não estiver vazio e não contiver bytes não nulos - ou seja, todos os bits são 0 - - e um valor falsey caso contrário.
Percebo que é um problema muito simples e acho que poderia hackear alguma coisa, mas suspeito que deve haver uma maneira curta e elegante de fazer isso, e isso me deu a ideia de desafiá-lo.
Isso é código-golfe , então o código mais curto em bytes vence. (Minha própria preferência iria para a solução mais rápida, mas isso depende muito da implementação ...)
Questões relacionadas : Proteger um arquivo com zeros
Motivação : é apenas para dizer de onde vem o problema, caso você esteja interessado. Você não precisa lê-lo.
Imagens ISO de CDs e DVDs, copiadas com "dd" ou outros meios, geralmente terminam com uma sequência de blocos inúteis contendo apenas bytes nulos. As técnicas padrão para remover esses blocos são conhecidas e simples (consulte /unix/74827/ ), mas às vezes podem remover dados úteis não nulos porque a mídia pode ter seu próprio tamanho. Então, eu quero verificar se os blocos removidos contêm apenas bytes nulos. A remoção desses blocos é importante para definir uma versão normalizada de imagens ISO.
fonte
'
.GNU sed -zn , 5 bytes
O arquivo de entrada é passado para sed como um parâmetro da linha de comandos. Saída como um código de retorno padrão do shell - ou seja, 0 é TRUE, 1 é FALSE.
Normalmente
sed
funciona em registros de entrada delimitados por nova linha ("linhas" AKA).-z
altera isso para registros de entrada delimitados por nulos. Se algum registro de entrada corresponder ao.
regex,q
use o código de saída 1.Experimente online!
fonte
DOS, 37 bytes
Ele abre o arquivo nomeado na linha de comando, retorna 0 se vazio ou contém um valor diferente de zero, caso contrário, retorna 1.
fonte
Anexo , 24 bytes
Experimente online!
Explicação
Esta é uma composição de 4 funções, executadas uma após a outra:
FileRead
- pega um nome de arquivo como entrada, retorna o conteúdo desse arquivoOrds
- retorna os pontos de código ASCII de cada caractere em uma listaMax&0
- isto é equivalente a, por argumentox
,Max[x, 0]
; por sua vez, calcula o máximo de todas as entradas emx
e0
(produzindo0
a lista vazia)Zero
- este é um predicado que verifica se esse número é realmente 0 e retorna esse booleano.fonte
@_@
)C (plataforma de 32 bits), 65 bytes
Assume que os tamanhos dos ponteiros são iguais, o que quase sempre é verdade. Retorna com um
0
código de saída em caso de sucesso (o arquivo contém apenasNUL
caracteres), algum outro valor caso contrário.O comportamento é indefinido se o argumento da linha de comando não for o caminho para um arquivo legível.
fonte
int**v
? Não consigo encontrar um compilador em que isso não ocorra sem fazer isso. Além disso, você pode economizar um erro intencionalmente , mas não sei se essa é a melhor abordagem.sizeof(void*) == sizeof(int)
(ou mais geralmente "plataforma de 32 bits"), então ... em umaamd64
plataforma, tentar compilar com-m32
;)-m32
): Experimente online!Utilitários Bash + GNU, 26 bytes
O nome do arquivo de entrada é fornecido como um parâmetro da linha de comando. Saída como um código de retorno padrão do shell - ou seja, 0 é TRUE, 1 é FALSE.
Experimente online!
fonte
Wolfram Language (Mathematica) , 30 bytes
Experimente online!
Explicação
Solução alternativa, 22 bytes
Se arquivos vazios devem passar, isso pode ser reduzido para:
Experimente online!
fonte
Java, 149 bytes
fonte
Perl 5, 20 bytes
$\=0;exit<>=~/^\0+$/
Pega um nome de arquivo na linha de comando args e retorna a resposta no código de saída do programa
fonte
Python 3, 59 bytes
Retorna 0 para o sucesso (todos os bytes zero).
Retorna 1 para falha (pelo menos um byte diferente de zero ou arquivo de tamanho zero).
fonte
APL (Dyalog Unicode) , 14 bytes
Programa completo. Solicita o nome do arquivo de stdin.
Experimente online!
⍞
prompt para nome do arquivo11 ¯1⎕MAP
mapear esse arquivo para uma matriz de bits compactada⌈/
máximo (redução); menor flutuador se vazio, caso contrário, 0 ou 10=
é zero igual a isso?fonte
Haskell, 49 bytes
Obviamente, se a importação não estiver incluída, serão 26 bytes.
fonte
readFile
vez degetContets
. Eu acho que você pode ler o arquivo como uma seqüência normal, comparar com=='\0'
(ou melhor<'\1'
) e se livrar doimport
. Como você pode usar uma função anônima, você pode soltar of x=
e ir pointfree:(all(<'\1')<$>).readFile
.readFile
, o que gerará uma exceção ao encontrar uma sequência Unicode inválida. Bom ponto em relação ao pointfree.JavaScript (ES8), 52 bytes
Aceita um URL como argumento e retorna uma promessa que é resolvida
true
se o arquivo não estiver vazio e não contiver bytes nulos.fonte
Zsh , 35 bytes
Experimente online! Saídas via código de saída.
Leia, divida em caracteres e bit a bit - ou cada ponto de código juntos.
Se o arquivo estiver vazio, o corpo do loop nunca será executado e, portanto, o loop retornará verdade. Se os valores de verdade e falsidade puderem ser trocados, o líder
!
poderá ser removido para um salvamento de 2 bytes.fonte