Dado um arquivo de áudio, determine se ele está codificado em um formato com ou sem perdas. Para os fins deste desafio, apenas os seguintes formatos precisam ser classificados:
Regras
- Se a entrada for feita na forma de um nome de arquivo, nenhuma suposição deve ser feita sobre o nome do arquivo (por exemplo, não é garantido que a extensão esteja correta para o formato ou mesmo presente).
- Não haverá metadados ID3 ou APEv2 presentes nos arquivos de entrada.
- Quaisquer duas saídas únicas e distinguíveis podem ser usadas, como
0
e1
,lossy
elossless
,foo
ebar
, etc.
Casos de teste
Os casos de teste para esse desafio consistem em um arquivo zip localizado aqui, que contém dois diretórios: lossy
e lossless
. Cada diretório contém vários arquivos de áudio que são ondas senoidais de 440 Hz a 0,5 segundo, codificadas em vários formatos. Todos os arquivos de áudio têm extensões correspondentes aos formatos acima, com exceção de A440.m4a
(que é áudio AAC em um contêiner MPEG Layer 4).
Respostas:
Geléia ,
75 bytesFormatos com perdas retornam 0 , formatos sem perdas retornam 1 .
Experimente online! (permalinks em Gist)
fundo
Os formatos que temos que suportar têm os seguintes números mágicos, ou seja, começam com esses bytes.
Entradas recuadas são contêineres para o formato anterior que aparecem nos casos de teste.
?
indica um byte variável..
indica um byte não imprimível. Todos os outros bytes são exibidos como caracteres ISO 8859-1.Observando apenas o segundo byte, podemos determinar o formato de uma maneira fácil:
Formatos sem perdas têm uma letra maiúscula como segundo byte, enquanto formatos com perdas não.
Como funciona
fonte
C,
828032 bytesInspirado na resposta de @Dennis ' , isso pode ser reduzido ainda mais:
Canalize os dados do arquivo para stdin. Retorna 0 para sem perdas ou diferente de zero para perdas.
Ou a verificação mais longa original:
Canalize os dados do arquivo para stdin. Retorna zero (1) para sem perdas ou 0 para perdas.
Pelo que sei, todos os formatos que você listou têm números mágicos separados (exceto AIFF / WAV, mas ambos são sem perdas de qualquer maneira), então isso apenas verifica esse número mágico quanto a um valor sem perdas conhecido. O
*v&&
é apenas para proteger contra arquivos correspondentes que começam com um byte nulo (M4A).Incluí os valores que encontrei nas folhas de especificações (
fLaC
= FLAC,RIFF
= WAV / AIFF,TTA1
= TTA) eFORM
= AIFF eFFM2
= TTA são dos arquivos de amostra fornecidos (só posso supor que sejam formatos de invólucro ou versões posteriores).Ou uma alternativa mais curta, como se estivesse enganando:
Bash + arquivo, 61 bytes
Leva o nome do arquivo como argumento. Retorna 0 para sem perdas ou diferente de zero para perdas.
Faz exatamente o que você esperaria; pergunta
file
qual é o tipo de arquivo e verifica padrões conhecidos. Correspondências TTA: d
(: data
), AIFF / WAVIF
e FLACFL
. Nenhum dos resultados sem perdas corresponde a nenhum deles, e eu testei que ainda funcionará se os nomes de arquivos forem removidos.Teste:
fonte
file
não confia em extensões de qualquer maneira (muitos usuários coisa renomear um png para um jpeg é o mesmo que convertê-lo!)GS2 , 3 bytes
Formatos com perdas retornam 0 , formatos sem perdas retornam 1 .
Experimente online! (permalinks em Gist)
fundo
Os formatos que temos que suportar têm os seguintes números mágicos, ou seja, começam com esses bytes.
Entradas recuadas são contêineres para o formato anterior que aparecem nos casos de teste.
?
indica um byte variável..
indica um byte não imprimível. Todos os outros bytes são exibidos como caracteres ISO 8859-1.Observando apenas o segundo byte, podemos determinar o formato de uma maneira fácil:
Formatos sem perdas têm uma letra maiúscula como segundo byte, enquanto formatos com perdas não.
Como funciona
fonte
JavaScript (ES6), 20 bytes
Explicação
Toma o conteúdo do arquivo como entrada e retorna
true
se o arquivo é sem perdas oufalse
se é lossy testando o primeiro caractere de que a entrada para ver se ele é umf
,F
,R
ouT
.Tente
Cole o conteúdo de um arquivo no arquivo
textarea
.Segundo esforço,
8163 bytesBusca o conteúdo de um arquivo a partir de uma URL fornecida, que acabou sendo um exagero.
Primeiro esforço,
14611689 bytesInválidos, pois os tipos MIME estão vinculados a extensões e, aparentemente, os cabeçalhos de resposta se qualificam como entrada adicional.
fonte
AddType <mime> <extension>
ou IIS<MimeMap>
. É claro que uma configuração específica ou arquivo ferramenta de hospedagem poderia fazer uma inspeção adequada, e que mereceria fazer a escolha servidor ser parte da resposta (uma vez que é o servidor que está determinando o tipo de arquivo!)Chip , 11 bytes
Replicou descaradamente a resposta de Dennis 'Jelly em Chip.
Retornos sem
0x0
perdas, retornos com perdas0x1
.Experimente on-line , links em essência (obrigado Dennis pela estratégia TIO aqui)
Explicar!
Essa parte é de limpeza: ele
S
dispara o primeiro byte et
depois desaparece.Esta é a carne da decisão. Cada byte de entrada é acessado pelos bits
HGFEDCBA
. SeG
estiver definido eF
não estiver, isso significa que o byte está dentro do intervalo0x40
para0x5f
(que é aproximadamente equivalente a 'maiúsculas' e bom o suficiente para a tarefa em questão).No entanto, para economia de bytes, inverto essa decisão de
G and (not F)
para(not G) or F
, pois ou's podem estar implícitos no Chip.Esse valor verdadeiro / falso resultante é colocado em
a
, que é o bit mais baixo da saída. (Todos os outros bits serão zero). No TIO, executo a saída através do hexdump para que os valores sejam visíveis.Equivalentemente, em C-ish, alguém poderia dizer algo como:
fonte
Cubix, 16 bytes
Formulário líquido:
Tente você mesmo
Você deve inserir os valores de bytes decimais do arquivo em uma lista separada. O separador não importa, qualquer coisa que não seja um dígito ou sinal de menos é suficiente. O código realmente se importa apenas com o primeiro byte, para que você possa deixar de fora o restante do arquivo, se quiser. O programa gera
0
para sem perdas e1
com perdas. Experimente aqui ! A entrada padrão usa um cabeçalho FLAC.Explicação
O bom dos arquivos é que (quase) todos eles têm a chamada mágica. Esses são os primeiros bytes do arquivo. Um bom software não verifica a extensão do arquivo, mas a mágica do arquivo para ver se ele pode lidar com um determinado arquivo.
Dennis encontrou uma maneira de usar essa mágica para encontrar o tipo de compactação, mas o fato de ele ter descartado o primeiro byte me fez querer tentar criar um método que usasse o primeiro byte, e não o segundo. Afinal, essa comunidade tem tudo a ver com salvar bytes.
Aqui está uma lista dos primeiros bytes dos diferentes tipos de arquivos. Ordenei-os em dois grupos: com e sem perdas. Aqui estão os valores do primeiro byte em decimal, hexadecimal e binário. Você já pode ver um padrão ...
O padrão que vi foi que o segundo bit (contado da esquerda para a direita) estava sempre ligado nos bytes "sem perdas" e o quinto bit estava sempre desligado. Essa combinação não aparece em nenhum dos formatos com perdas. Para "extrair" isso, nós simplesmente fazemos um AND binário (by
0b01001000 (=72)
) e depois comparamos com0b01000000 (=64)
. Se ambos são iguais, o formato de entrada é sem perdas, caso contrário, é com perdas.Infelizmente, o Cubix não possui um operador de comparação, então usei a subtração (se o resultado for 64, isso gera 0 e resulta em 8, -56 ou -64, caso contrário, voltarei a isso mais tarde.
Primeiro, vamos começar no início do programa. O AND binário é feito usando o
a
comando:Em seguida, comparamos com 64 usando subtração (observe que atingimos um espelho que reflete o IP na face superior [primeira linha, segundo caractere, apontando para o sul] no meio desta parte).
Depois que o IP é revertido pelo
u
, usamos algum fluxo de controle para enviar a1
para a pilha se (e somente se) a parte superior da pilha for diferente de zero:Depois de envolvermos o cubo, atingimos a
<
instrução, que aponta o IP para oeste na quarta linha. Tudo o que resta a fazer é produzir e terminar.Portanto, o programa gera
0
sem perdas e1
com perdas.fonte