Objetivo:
Crie um programa para encontrar o menor arquivo na pasta atual.
- O tamanho do arquivo pode ser medido em bytes ou caracteres.
- Se vários arquivos tiverem o mesmo tamanho, você poderá escolher um ou exibir todos eles.
- Você pode assumir que haverá pelo menos um arquivo na pasta e nenhum arquivo terá o tamanho 0.
Suponha que todos os arquivos da pasta possam ser carregados pelo idioma que você está usando.
Suponha que não haja pastas no diretório atual.
Entrada:
O programa não deve receber nenhuma entrada do usuário, a menos que:
- Se o seu idioma não tiver uma "pasta atual", ele poderá solicitar ao usuário o nome / caminho da pasta.
- Se o seu idioma não puder acessar arquivos diretamente no seu computador, poderá permitir que o usuário faça o upload de arquivos. (JavaScript, por exemplo)
Resultado:
O nome do menor arquivo deve ser exibido.
- Símbolos iniciais / finais são permitidos, desde que fique claro qual arquivo foi escolhido.
- (Imprimir uma lista de todos os arquivos é contra as regras).
Notas:
- As brechas padrão não são permitidas.
- Você não pode modificar / criar / excluir arquivos na pasta para alterar o resultado.
- Isso é código-golfe ; a resposta mais curta (em bytes) vence.
code-golf
file-system
12Me21
fonte
fonte
Respostas:
Vim 12 bytes
Experimente online!
Explicação:
!!
é o comando de filtro . Ele canaliza o conteúdo da linha atual para um comando arbitrário do sistema e envia a saída de volta ao buffer. É útil para usar ferramentas externas para coisas nas quais o bash é melhor que o vim, por exemplo,!!rev
para reverter a linha atual ou!Gxxd
fazer o dump hexadecimal do buffer. No nosso caso, o buffer está vazio, portanto é equivalente a:r!ls
, o que apenas alimenta a saída do comando na linha atual.Agora, o cursor está na linha 1 e queremos excluir todas as linhas, menos a última. A abordagem ingênua é
Mas nós podemos fazer melhor. Como expliquei nesta dica , geralmente
{
pode (mas nem sempre) ser equivalente a . Aqui é ainda melhor. Porque o movimento é baseado em caracteres , não baseado em linhas como é, não tem que ir até uma linha em primeiro lugar, deixando-nos comgg
gg
fonte
Bash + coreutils, 13 bytes
Explicação:
fonte
ls -1Sa|tail -1
é 3 bytes mais curto e possui uma saída mais limpa.ls
detecta a saída no terminal, ele formatará a saída em várias colunas. Mas, se a saída for um canal, será apenas 1 por linha. Comparels
vsls|cat
ls -Sar|sed q
Python
23,94767454 bytes-18 bytes graças a @orlp
-2 bytes graças a @ Jonathan Allan
-20 bytes graças a uma alteração nas especificações dos desafios
fonte
print min(filter(path.isfile,listdir(".")),key=path.getsize)
é mais limpo e substancialmente mais curto."."
é o padrão.print(min(filter(path.isfile,listdir()),key=path.getsize))
wc
que me deu mais 1 bytefilter
bit inteiro é desnecessário. Isso também não funciona no Python 3, poisprint
é uma função. O seguinte funcionaria e seria substancialmente mais curto:print(min(listdir(),key=path.getsize))
PowerShell ,
302421 bytesExperimente online!
ls
é um alias paraGet-ChildItem
. Isso é canalizadosort-object
com olength
atributo, para que os arquivos sejam classificados por tamanho. Nós indexamos isso com o(...)[0]
para obter o primeiro (ou seja, o menor) e, em seguida, obtemos o.Name
mesmo. A saída via implícitaWrite-Output
acontece na conclusão do programa.Economizou 6 bytes, pois garantimos a existência de apenas arquivos no diretório. Economizou mais 3 graças ao ConnorLSW.
fonte
-file
arquivos existentes no diretório atual?sort le*
para raspar alguns bytes, pois o PowerShell o aceitará.Ruby,
61403837 bytesObrigado GB e Value Ink
fonte
Dir.foreach(?.).min_by{|x|File.size x}
obtém o mesmo resultado em 38 bytes.Dir[?*]
é muito mais curto, mas não inclui arquivos Unix ocultos, como.bash_profile
...Dir[?*,".*"]
. A seqüência de globos.?*
não corresponderá ao arquivo,.a
se existir.Mathematica, 35 bytes
FileNames[]
produz uma lista de nomes de todos os arquivos (e diretórios) no diretório atual;~MinimalBy~FileByteCount
seleciona o nome do arquivo cuja contagem de bytes é menor.FileByteCount
lança um monte de erros quando aplicado a diretórios, mas os erros não inviabilizam o programa.fonte
Java 7,
149142 bytesExperimente online!
-7 bytes graças a CAD97
fonte
()->java.utils.stream(new java.io.File(".").listFiles()).max((a,b)->a.length()-b.length).get().getName()
para 104 bytesSH (Linux / Unix)
15141314 bytes-S
classifica por tamanho (decrescente),e-r
invertetail -1
gera o último arquivo na lista.@ Dennis Obrigado por salvar 1 byte @Dani_l Obrigado por salvar 1 byte.
fonte
tail
embora, em vez de reverter, e-1
é uma abreviação de-n1
.MATLAB / Oitava,
5248 bytesExplicação
Isso obtém uma lista de diretórios de todos os arquivos e pastas no diretório atual usando
dir
. A saída dedir
é umstruct
contendo o nome do arquivo, seja um diretório ou não, o tamanho (em bytes) etc.Podemos então pegar uma matriz dos tamanhos de cada um em bytes
[d.bytes]
e executar a divisão elemento a elemento com um booleano indicando se é um diretório ou não~[d.isdir]
que produziráInf
onde é um diretório (divisão por zero) e o tamanho em bytes caso contrário (divisão por 1)Nós encontramos o índice do mínimo dessa matriz usando a segunda saída de
min
e usamos isso para indexar na estrutura inicial e exibir o nome comd(n).name
fonte
disp(...)
torno da saída para imprimi-la corretamente. Caso contrário, se, por exemplo, houvesse um arquivo chamadoans
que não fosse o menor da pasta, a saída não seria clara sobre qual arquivo é o menor para quem não conhece o MATLAB.ans =
é ok.
(pasta atual) e..
(pasta acima), por isso não consigo remover o diretório que parece. Me desculpe por isso.Scala, 52 bytes
Versão antiga, 79 bytes
Ajustado de acordo com o conselho de jaxad0127. Agora são apenas 52 bytes.
fonte
Lote,
433935 bytesA saída inclui um espaço de liderança por algum motivo, mas felizmente isso é permitido. Edit: Agora, assumindo que não há diretórios para salvar 4 bytes.
fonte
/a-d
.Perl 6 ,
33 32 3116 bytesTente
Tente
Tente
Tente
Expandido:
fonte
dir
padronizado como$*CWD
, e a descrição da tarefa diz que você pode assumir que não haverá pastas, então acho que você pode reduzi-lodir.min(*.s).put
.J ,
2120 bytesGuardou um byte graças a @ Conor .
Explicação
fonte
Arquivo BATCH,
777263 bytesNão existe um equivalente direto de
head
outail
no BATCH, pelo menos ao meu conhecimento, então aqui está uma solução alternativa. (com muita ajuda da @Neil - obrigado!)O
dir
comando, com/o-s
para classificar no tamanho do arquivo decrescente e/b
para gerar apenas os nomes dos arquivos. Percorremos aqueles comFOR /F
, definindo a variávelF
para o nome do arquivo a cada vez. Finalmente, produzimos apenas o último comECHO %F%
.Economizou mais 9 bytes graças a Neil e graças a garantias de que nenhum diretório está presente.
fonte
FOR
variável precisa de dois%
s para trabalhar em um script. Caso contrário, alguns truques de golfe: 1. Não use@ECHO OFF
em scripts curtos, adicione a@
a cada linha e depoisDO
. 2. Exclua o espaço antesDO
. 3. Os espaços:
es não são necessários nodir
comando.PHP,
8462 bytesComo a pergunta foi atualizada com a suposição de que não haverá pastas no diretório atual, consegui remover o material de verificação de arquivo e reduzi-lo.
Aqui está a minha resposta antiga:
Isso é o melhor que eu poderia fazer. Talvez exista uma maneira melhor de me perder.
fonte
Node.js (usando
walk
), 114 bytesIgnorar nova linha:
Isso chama um andador que percorre o diretório atual (
__dirname
) e, para cada arquivo, chama uma função com seu stats
e uma função a seguirn()
que deve ser chamada para continuar a travessia. Em seguida, noend
, ele imprime um nome de arquivo com o mínimosize
de bytes encontrado.s.size>m.size
retornafalse
quandom.size
éundefined
, por isso, após o primeiro retorno de chamada,m
é igual ao primeiro ficheiro encontrado e continua de lá normalmente.fonte
R, 36 bytes
Explicado
file.info()
retorna umadata.frame
das "informações do arquivo" quando recebe um caractere ou vetor de caracteres de nomes de arquivos / pastas que, quando usados na lista de arquivos / pastas no diretório atual (dir()
), se parecem com:Posteriormente, apenas encontramos o nome do arquivo para o qual a
size
coluna (abreviada usando$s
) é a menor. Conseqüentemente, se houver mais de um arquivo com o menor tamanho, todos serão retornados.Bônus: se também quiséssemos desconsiderar pastas no diretório atual, poderíamos simplesmente procurar o tamanho quando
isdir == FALSE
:x=file.info(y<-dir());y[x$s==min(x$s[!x$i])]
que é 44 bytes.fonte
file.size
é mais curto, porque você não precisa fazer isso$s
depois.Tcl , 88 bytes
Experimente online!
fonte
SmileBASIC, 110 bytes
Examina apenas os
TXT:
arquivos, pois osDAT:
arquivos não podem ser carregados, a menos que você já saiba o tamanho deles, impossibilitando o carregamento aleatório.fonte
DAT:
arquivo? Você poderia forçar com força todos os nomes / tamanhos de arquivo da pasta?DAT:
arquivo tridimensional em uma matriz bidimensional (por exemplo) causará um erro, portanto você não pode forçá-lo com força bruta. Você só precisa saber o número de dimensões de antemão, o que normalmente faria.DAT:
arquivo 2D em uma matriz 3D? Então você pode criar uma matriz de tamanho máximo. E você não pode pegar erros de forma alguma?Groovy , 49 bytes
Experimente online!
Encerramento, uso:
m(new File("location"))
fonte
C #, 277 bytes
Não é o mais curto, mas o que você esperaria de C #?
Golfe
Ungolfed
fonte
Röda ,
3231 bytesÉ uma função anônima que classifica os arquivos no diretório atual por tamanho e seleciona o primeiro arquivo com
pull
.Use-o assim:
main{ {ls""|sort key=fileLength|pull} }
fonte
ls""
funciona tão bem quantols"."
. Eu acho que você pode salvar um byte de queSmileBASIC 3, 105 bytes (competindo?)
Bate a resposta de 12Me21 mas ainda sofre com a incapacidade de carregar arquivos DAT (que parece muito cruel ao ser desqualificado, considerando as circunstâncias).
A versão mais curta acima é irritante e solicita que você carregue todos os arquivos, mas funciona. Por mais dois bytes, você pode suprimir o prompt; mude a linha 2 para isto:
fonte
Arquivo em lote, 33 bytes
Desta vez, arquivos em lote são moderadamente competitivos, por incrível que pareça.
Resultado
Encontre uma maneira de interromper a criação do
q
antes dedir/os/b
ser executado e você economizará no máximo 6 bytes por não precisar colocar o arquivo de saída em um diretório separado.Sempre será exibido
q
como o menor arquivo (a menos que esteja vinculado a outro arquivo de 0 byte), pois é criado como um arquivo vazio antes dedir/b/os
reunir uma lista de arquivos.fonte
C ++ 17 (gcc) , 180 bytes
Experimente online!
Requer uma biblioteca padrão recente que implementa
std::filesystem
.fonte
Zsh ,
1814 bytesExperimente online!Experimente online!(D)
globs dotfiles(oL)
classifica por tamanho[1]
seleciona a primeira correspondênciafonte