Sua tarefa hoje será pegar um arquivo existente e anexar zeros a ele até atingir um determinado tamanho.
Você deve escrever um programa ou função que leve o nome de um arquivo no diretório atual f
e um número de bytes b
. Enquanto mantém o conteúdo original de f
, você deve escrever zeros (bytes nulos, não ascii 0s) até o fim, para que seu novo tamanho seja b
bytes.
Você pode assumir que f
apenas possui ascii alfanuméricos em seu nome, que possui permissões totais sobre ele, que inicialmente não é maior que b
, mas pode ser tão grande quanto b
, e que há espaço livre em disco infinito.
Você não pode assumir que não f
está vazio ou que ainda não contém bytes nulos.
Outros arquivos existentes não devem ser modificados e novos arquivos não devem existir após o término da execução.
Casos de teste
Conteúdo de f | b Conteúdo resultante de f 12345 10 1234500000 0 3 000 [vazio] | 2 00 [vazio] | 0 [esvaziar] 123 3 123
fonte
b
Respostas:
Bash + coreutils, 13
Entrada da linha de comando - o primeiro parâmetro é o tamanho do arquivo e o segundo é o nome do arquivo.
De
man truncate
:Experimente online .
fonte
truncate
syscall falha.dd bs=1 of=$1 seek=$2<&-
(que imprime uma mensagem de erro que pode ser ignorada). O seu é muito mais curto. Agradável.Groovy,
54474341 bytes-6 graças à idéia do manatwork de remover o loop; essa foi a minha ideia original, não sei por que pensei que não iria funcionar e optei por um loop ... Definitivamente funciona, apenas testei.
Ungolfed:
fonte
{a,b->c=new File(a);c<<('\0'*(b-c.size()))}
(c=new File(a))
devido aos parênteses necessários.APL (Dyalog) ,
3317 bytesExperimente online!
fonte
∇Extend
?Python 2 ,
595754 bytes-5 bytes graças ao chepner
fonte
\x00
é um byte nulo.\0
no lugar de\x00
.def g(n,b):f=open(n,'a');f.write('\0'*b);f.truncate(b)
.PHP, 66 bytes
Recebe entrada dos argumentos da linha de comando; corra com
-nr
.Esses 55 bytes podem, mas provavelmente não funcionarão:
fonte
Java (Oracle JRE), 55 bytes
A especificação de
setLength(int)
diz que os bytes anexados são indefinidos, mas praticamente o Oracle JRE acrescenta apenas o0
byte (foi por isso que eu o especifiquei).O recurso é fechado automaticamente pela JVM, portanto, não precisamos fazer isso sozinhos.
Teste
fonte
AHK, 48 bytes
1
e2
são os dois primeiros parâmetros em um script AHK.FileGetSize
funciona em bytes por padrão.Não é emocionante, mas é simples: obtenha o tamanho, subtraia-o do tamanho desejado e adicione muitos zeros.
fonte
Perl 6 , 40 bytes
$^a
e$^b
são os parâmetros para a função - o nome do arquivo e o comprimento, respectivamente.fonte
Python 2 , 68 bytes
Experimente online! (Ao imprimir o conteúdo do arquivo, o código substitui bytes nulos por 0 ASCII para visibilidade.)
fonte
\0
é mais curto.PowerShell, 69 bytes
$f
para o arquivo,$s
para o tamanho de destino, salve como .ps1 e executeÉ um shell, então deve haver um loop muito pequeno adicionando 1 byte com
>>
redirecionamento de saída e anexado, certo? Bem, não, porque>>
apenas gera codificação UCS2-LE multibyte, portanto não há como adicionar um único byte a um arquivo .. a menos que você esteja usando o PSv5.1 e possa mudar isso, mas isso leva muito tempo para ser competitivo :Talvez exista uma abordagem do .Net Framework? Deveria haver, mas não posso fazê-lo realmente escrever bytes ou erro. Mas é mais longo de qualquer maneira:
fonte
Mathematica 50 Bytes
Importação / Exportação
Uso
fonte
q, 29 bytes
Função que leva o nome do arquivo no formato
:/foo/bar.baz
e comprimento como um número inteiro.Exemplo:
fonte
C, 56 bytes
O programa encontra o tamanho do arquivo e quantos bytes anexar. O arquivo adiciona
fs - b
bytes extras ao final.fonte
f
eb
, o que não é permitido. Você deve incluir a E / S em seu programa, que pode ser deARGV
, entrada do console ou argumentos para uma função.C #, 90 bytes
fonte