Boa tarde Golfgeneers.
Esta é uma pergunta razoavelmente longa e detalhada. Dado o que estava pedindo, precisava ser. Se você tiver alguma dúvida, pergunte a eles. Se houver algo que não esteja claro, me avise para que eu possa corrigi-lo. Provavelmente, este é o lado mais difícil do codegolf.
Estamos construindo um computador leve e precisamos do sistema de arquivos com menor peso possível. O código mais curto será escolhido.
Estamos fornecendo um disco rígido de ponta de 65536 bytes. Para esse protótipo, será um arquivo de imagem direta, que seu programa pode assumir que exista, e esteja no local que melhor lhe convier - ou seja, um arquivo binário representando todo o disco rígido. Você pode assumir que esta imagem já está 'formatada' - ie. se o seu programa depende de algo estar no arquivo para funcionar, pode ser. Se você precisar que o estado vazio inicial seja algo diferente de todos os zeros, indique o que é.
Não há limite de memória para a RAM usada pelo seu aplicativo.
Os comandos de entrada e saída exigirão uma interface para o disco rígido real. Como a imagem do disco, seu programa pode assumir que o arquivo de entrada existe e está onde você deseja. Da mesma forma, seu programa pode ser produzido sempre que for conveniente. No entanto, ele deve fechar o arquivo após executar o comando de entrada ou saída.
Você não está recebendo um formato que deve ser usado para a imagem do disco - você pode desenvolver o seu próprio. Ele deve ser capaz de armazenar até 248 arquivos. Qualquer arquivo com mais de 256 bytes pode contar como um novo arquivo para esse limite a cada 256 bytes ou parte dele. Um arquivo pode ter até 63488 bytes. Basicamente - ele deve ser tão capaz quanto um disco rígido com 248 setores de 256 bytes cada.
O raciocínio por trás desses tamanhos aparentemente é fornecer 2048 bytes de 'administração' - para armazenar detalhes dos arquivos. Cada arquivo / pasta deve estar acessível com um nome de 4 caracteres alfanuméricos, que podem fazer distinção entre maiúsculas e minúsculas ou sem distinção de acordo com sua preferência. Se o seu programa suportar nomes de 4 ou menos caracteres, haverá um bônus de um multiplicador de 0,95.
Seu programa deve aceitar, via stdin, os seguintes comandos. Os parâmetros serão separados por um espaço. O comando será encerrado por uma nova linha.
- L - Liste os nomes para stdout de todos os arquivos atuais e seus tamanhos em bytes, separados por novas linhas.
- C ab - Copie o arquivo a para o novo arquivo b.
- D a - Excluir arquivo a
- R ab - renomeia o arquivo a para o novo nome b
- I a - Adiciona o arquivo de entrada (veja a nota acima) como arquivo a
- O a - Arquivo de saída a para o arquivo de saída
Os seguintes erros podem ser relatados ao STDOUT ou STDERR como motivos válidos para a falha na execução de um comando. Você pode optar por imprimir apenas ERR # onde # é o número do erro:
- 1 - O arquivo não existe
- 2 - O arquivo já existe
- 3 - Sem espaço *
* Observe que seu programa não pode emitir isso apenas porque está sem espaço contínuo. Se você ainda tiver setores disponíveis, deverá desfragmentar o disco para fazê-lo funcionar.
Um sistema de pastas é opcional - no entanto, gera um bônus de um multiplicador de 0,8 na sua pontuação. Se ele suportar mais de um nível de diretório, ele renderá um bônus de um multiplicador de 0,7 (não além do 0,8). Para o bônus, você deve ter
- L, R, C e D funcionam apenas dentro do diretório atual. L deve listar pastas no diretório atual, bem como os arquivos.
- Novo comando M ab move o arquivo a para a pasta b. Se b for '.', Move o arquivo para o diretor pai
- O novo comando G a vai para a pasta a. Se a for '.', Vai para a pasta pai
- R também deve renomear pastas
- D também deve excluir pastas e quaisquer arquivos / pastas dentro delas
- C também deve copiar pastas e quaisquer arquivos / pastas dentro delas
Os seguintes erros adicionais podem ser relatados ao STDOUT ou STDERR como motivos válidos para a falha na execução de um comando.
- 4 - Pasta não existe
- 5 - Arquivo, não é necessário pasta - onde, I e O exigem nomes de arquivo, e uma pasta foi fornecida
Sua pontuação é:
- O tamanho, em bytes, do seu código-fonte
Multiplicado por
- 0,95 se você suportar nomes de 4 ou menos caracteres
- 0.8 se você suportar um único nível de pastas
- 0,7 se você suportar vários níveis de pastas
- 0,95 se você suportar comandos (não necessariamente nomes de arquivos) em letras minúsculas ou maiúsculas
Boa sorte.
fonte
Respostas:
Ruby, 505,4 pontos (560 caracteres)
Notas:
F
no diretório atual.F
deve existir e podem ser criados / formatado através do seguinte comando:IO.write('F',(([""]*248)+([0]*248)+[""]).pack('A4'*248+'s'*248+'A63488'))
.I
também está sempre no diretório atual, o arquivo de saída estáO
.Bônus:
O código ainda não está totalmente disponível, mas já mostra que, para uma pontuação substancialmente melhor, eu tentaria uma abordagem completamente diferente.
Sessão de teste (apenas STDIN / STDOUT é mostrado, mas é claro que cada comando é anexado ao chamar o programa acima):
fonte
Tcl, pontuação 487.711 (772 bytes)
Bônus (precisa pegar todos):
Limitações conhecidas:
F
já deve existir. Espaço vazio ou em branco está bom.i
, o arquivo de saída éo
e o sistema de arquivos está emF
eval puts [expr 1+2]
I
(também não é minha ideia eG
não cria)G
não valida o diretório.Alguns hacks:
eval puts $c
-> diretório atual, separado por espaços.exit
- sem comentários.lappend c .
-> alterna para o subdiretório.
fonte
Python 2.7 373 (413 bytes)
O disco é salvo no formato pickle do Python: para criar um disco vazio, é necessário colocar esses dois bytes '}.' no início e, opcionalmente, 65534 preenchem os bytes posteriormente. Suporta nomes de arquivos grandes arbitrários (* 0,95), comandos em maiúsculas e minúsculas (* 0,95) e links físicos (:-).
fonte