Objectif:
Créez un programme pour trouver le plus petit fichier dans le dossier actuel.
- La taille du fichier peut être mesurée en octets ou en caractères.
- Si plusieurs fichiers ont la même taille, vous pouvez en choisir un ou les afficher tous.
- Vous pouvez supposer qu'il y aura au moins un fichier dans le dossier et qu'aucun fichier n'aura une taille de 0.
Supposons que tous les fichiers du dossier peuvent être chargés dans la langue que vous utilisez.
Supposons qu'il n'y ait aucun dossier dans le répertoire actuel.
Contribution:
Le programme ne doit recevoir aucune entrée de l'utilisateur, sauf si:
- Si votre langue n'a pas de "dossier actuel", il peut demander à l'utilisateur un nom / chemin d'accès au dossier.
- Si votre langue ne peut pas accéder directement aux fichiers sur votre ordinateur, cela peut permettre à l'utilisateur de télécharger des fichiers. (JavaScript, par exemple)
Production:
Le nom du plus petit fichier doit être affiché.
- Les symboles de début / fin sont autorisés, tant qu'il est clair quel fichier a été choisi.
- (L'impression d'une liste de tous les fichiers est contraire aux règles).
Remarques:
- Les échappatoires standard ne sont pas autorisées.
- Vous ne pouvez pas modifier / créer / supprimer des fichiers dans le dossier pour changer le résultat.
- C'est du golf de code ; la réponse la plus courte (en octets) l'emporte.
code-golf
file-system
12Me21
la source
la source
Réponses:
Vim 12 octets
Essayez-le en ligne!
Explication:
!!
est la commande de filtrage . Il redirige le contenu de la ligne actuelle vers une commande système arbitraire et renvoie la sortie dans le tampon. Il est utile pour utiliser des outils externes pour des choses où bash est meilleur que vim, par exemple!!rev
pour inverser la ligne actuelle ou!Gxxd
pour vider le tampon hexadécimal. Dans notre cas, le tampon est vide, il est donc équivalent à:r!ls
, ce qui alimente simplement la sortie de la commande dans la ligne actuelle.Maintenant, le curseur est sur la ligne 1, et nous voulons supprimer toutes les lignes sauf la dernière. L'approche naïve est
Mais nous pouvons faire mieux. Comme je l'ai expliqué dans cette astuce , le
{
peut généralement (mais pas toujours) être équivalent àgg
. Ici, c'est encore mieux. Parce que le mouvement est basé sur des caractères , et non sur des lignes commegg
c'est le cas, nous n'avons pas besoin de remonter une ligne en premier, nous laissant avecla source
Bash + coreutils, 13 octets
Explication:
la source
ls -1Sa|tail -1
est de 3 octets plus court et a une sortie plus propre.ls
sortie est détectée sur le terminal, elle formatera la sortie en plusieurs colonnes. Mais si la sortie est un tube, elle n'en fera qu'un par ligne. Comparerls
vsls|cat
ls -Sar|sed q
Python
23,94767454 octets-18 octets grâce à @orlp
-2 octets grâce à @Jonathan Allan
-20 octets grâce à une modification des spécifications du défi
la source
print min(filter(path.isfile,listdir(".")),key=path.getsize)
est plus propre et sensiblement plus court."."
c'est la valeur par défaut.print(min(filter(path.isfile,listdir()),key=path.getsize))
wc
lequel m'a donné 1 octet de plusfilter
bit entier est inutile. Cela ne fonctionne pas non plus en Python 3, carprint
c'est une fonction. Les éléments suivants fonctionneraient et seraient considérablement plus courts:print(min(listdir(),key=path.getsize))
PowerShell ,
302421 octetsEssayez-le en ligne!
ls
est un alias pourGet-ChildItem
. C'est lié àsort-object
l'length
attribut, donc les fichiers sont triés par taille. Nous indexons cela avec le(...)[0]
pour obtenir le premier (c'est-à-dire le plus petit), puis prenons.Name
celui - ci. La sortie via impliciteWrite-Output
se produit à la fin du programme.6 octets enregistrés car nous sommes garantis que seuls les fichiers existent dans le répertoire. Enregistré 3 supplémentaires grâce à ConnorLSW.
la source
-file
puisque seuls les fichiers se trouvent dans le répertoire actuel?sort le*
pour raser certains octets car powershell l'acceptera.Rubis,
61403837 octetsMerci GB et Value Ink
la source
Dir.foreach(?.).min_by{|x|File.size x}
obtient le même résultat en 38 octets.Dir[?*]
sont beaucoup plus courts mais n'incluent pas les fichiers Unix cachés comme.bash_profile
...Dir[?*,".*"]
. La chaîne Glob.?*
ne correspondra pas au fichier.a
s'il existe.Mathematica, 35 octets
FileNames[]
produit une liste de noms de tous les fichiers (et répertoires) du répertoire courant;~MinimalBy~FileByteCount
sélectionne le nom du fichier dont le nombre d'octets est le plus petit.FileByteCount
jette un tas d'erreurs lorsqu'il est appliqué aux répertoires, mais les erreurs ne font pas dérailler le programme.la source
Java 7,
149142 octetsEssayez-le en ligne!
-7 octets grâce à CAD97
la source
()->java.utils.stream(new java.io.File(".").listFiles()).max((a,b)->a.length()-b.length).get().getName()
pour 104 octetsSH (Linux / Unix)
15141314 octets-S
trie par taille (décroissant),et-r
inversetail -1
sort le dernier fichier de la liste.@ Dennis Merci d'avoir économisé 1 octet @Dani_l Merci d'avoir enregistré 1 octet.
la source
tail
cependant au lieu d'inverser, et-1
c'est un raccourci pour-n1
.MATLAB / Octave,
5248 octetsExplication
Cela obtient une liste de répertoires de tous les fichiers et dossiers du répertoire en cours à l'aide de
dir
. La sortie dedir
est unstruct
contenant le nom du fichier, que ce soit un répertoire ou non, la taille (en octets), etc.Nous pouvons ensuite prendre un tableau des tailles de chacun en octets
[d.bytes]
et effectuer une division élément par élément avec un booléen indiquant s'il s'agit d'un répertoire ou non~[d.isdir]
qui donneraInf
où il est un répertoire (division par zéro) et la taille en octets sinon (division par 1).Nous trouvons l'index du minimum de ce tableau en utilisant la deuxième sortie de
min
et l'utilisons pour indexer dans la structure initiale et afficher le nom avecd(n).name
la source
disp(...)
autour de la sortie pour l'imprimer correctement. Sinon, s'il y avait par exemple un fichier appeléans
qui n'est pas le plus petit du dossier, la sortie ne serait pas claire quant au fichier le plus petit pour quiconque ne connaît pas MATLAB.ans =
va bien.
(dossier actuel) et..
(dossier ci-dessus), donc je ne peux pas supprimer la vérification du répertoire, il semble. Désolé pour ça.Scala, 52 octets
Ancienne version, 79 octets
Ajusté selon les conseils de jaxad0127. Il ne fait plus que 52 octets maintenant.
la source
Lot,
433935 octetsOutput includes a leading space for some reason, but fortunately that's allowed. Edit: Now assuming there are no directories to save 4 bytes.
la source
/a-d
.Perl 6 ,
33 32 3116 octetsEssayez-le
Essayez-le
Essayez-le
Essayez-le
Étendu:
la source
dir
défaut est$*CWD
, et la description de la tâche indique que vous pouvez supposer qu'il n'y aura pas de dossiers, donc je pense que vous pouvez raccourcir cela endir.min(*.s).put
.J ,
2120 bytesUn octet enregistré grâce à @Conor.
Explication
la source
BATCH File,
777263 bytesThere's no direct equivalent of
head
ortail
in BATCH, at least to my knowledge, so here's a kludgy work-around. (with much assistance from @Neil - thanks!)The
dir
command, with/o-s
to sort in descending file size, and/b
to output only the file names. We loop through those withFOR /F
, setting the variableF
to the file name each time. Finally, we output just the last one withECHO %F%
.Saved 9 more bytes thanks to Neil and thanks to guarantees that no directories are present.
la source
FOR
variable needs two%
s to work in a script. Otherwise, a few golfing tricks: 1. Don't use@ECHO OFF
on short scripts, add a@
to each line and afterDO
. 2. Delete the space beforeDO
. 3. The spaces and:
s aren't needed in thedir
command.PHP,
8462 bytesSince the question was updated with the assumption that there will be no folders in the current directory, I was able to remove the file check stuff and golf this down.
Here is my old answer:
This is the best I could do. Maybe there is a better way I'm missing.
la source
Node.js (using
walk
), 114 bytesIgnore newline:
This invokes a walker that traverses through the current directory (
__dirname
) and for each file calls a function with its stats
and a function nextn()
that must be invoked to continue the traversal. Then at theend
, it prints a filename with the minimumsize
in bytes found.s.size>m.size
returnsfalse
whenm.size
isundefined
, so after the first callback,m
is equal to the first file found, and continues from there normally.la source
R, 36 bytes
Explained
file.info()
returns adata.frame
of "file information" when given a character or character vector of file/folder names which when used on the list of files/folders in the current directory (dir()
), looks something like:Subsequently we just have the find the name of the file for which the
size
column (abbreviated using$s
) is the smallest. Consequently, if there are more than one file with the smallest size, all will be returned.Bonus: if we also wanted to disregard folders in the current directory we could simply search for size when
isdir == FALSE
:x=file.info(y<-dir());y[x$s==min(x$s[!x$i])]
which turns out to be 44 bytes.la source
file.size
is shorter because you don't have to do$s
afterwards.Tcl, 88 bytes
Try it online!
la source
SmileBASIC, 110 bytes
Only looks at
TXT:
files, sinceDAT:
files cannot be loaded unless you already know their size, making it impossible to load a random one.la source
DAT:
file? Could you brute-force every name/file size in the folder?DAT:
file into a 2-dimensional array (for example) will cause an error, so you can't brute force it. You just have to know the number of dimensions beforehand, which you normally would.DAT:
file into a 3-d array? Then you could create a maximum size array. And you can't catch errors in any way?Groovy, 49 bytes
Try it online!
Closure, usage:
m(new File("location"))
la source
C#, 277 bytes
Not the shortest, but what would you expect from C#?
Golfed
Ungolfed
la source
Röda,
3231 bytesIt's an anonymous function that sorts the files in the current directory by file length and selects then the first file with
pull
.Use it like this:
main{ {ls""|sort key=fileLength|pull} }
la source
ls""
works just as well asls"."
. I think you can save a byte from thatSmileBASIC 3, 105 bytes (competing?)
Beats 12Me21's answer but still suffers from inability to load DAT files (which feels very cruel to be disqualifying considering the circumstances.)
The shorter version above is annoying and prompts you on every file to load, but it does work. For two bytes more you can suppress the prompt; change line 2 to this:
la source
Batch File, 33 bytes
Batch files are moderately competitive this time, oddly enough.
Output
Find a way to stop the creation of
q
prior todir/os/b
being run and you'll save a maximum of 6 bytes by not needing to put the output file in a separate directory.Will always output
q
as the smallest file (unless tied for another 0 byte file) as it is created as an empty file beforedir/b/os
gathers a list of files.la source
C++17 (gcc), 180 bytes
Try it online!
Requires a recent standard library that implements
std::filesystem
.la source
Zsh,
1814 bytesTry it online!Try it online!(D)
globs dotfiles(oL)
sorts by size[1]
selects the first matchla source