À partir d'un répertoire (tel que C:/
), à partir de stdin ou lu à partir d'un fichier, produisez une arborescence de répertoires, chaque fichier / dossier étant indenté en fonction de sa profondeur.
Exemple
Si j'ai un C:/
lecteur qui ne contient que deux dossiers foo
et bar
, et bar
est vide pendant qu'il foo
contient baz.txt
, alors l'exécution avec entrée C:/
produit:
C:/
bar/
foo/
baz.txt
lors de l'exécution avec entrée C:/foo/
devrait produire
foo/
baz.txt
Comme il s'agit de codegolf, le nombre d'octets le plus bas l'emporte. Les extensions de fichiers (telles que baz.txt
) sont facultatives. Notes supplémentaires: les fichiers cachés peuvent être ignorés, les répertoires doivent réellement exister, on peut supposer que les fichiers ne contiennent pas de caractères non imprimables ou de nouvelles lignes mais tous les autres caractères ASCII imprimables sont corrects (les noms de fichiers avec des espaces doivent être pris en charge). La sortie peut être écrite dans un fichier ou une sortie standard. Les indentations peuvent être constituées d'un caractère de tabulation ou de 4 espaces.
la source
.
)?Réponses:
bash,
615854 octetsPrend l'entrée comme argument de ligne de commande, sort sur STDOUT.
Notez que les espaces près de la fin avant le
|g
sont en fait un caractère de tabulation (SE les convertit en espaces lors de l'affichage des publications).Merci à @Dennis pour 4 octets!
la source
Dyalog APL , 48 octets
⍞
invite pour la saisie de caractères'dir/s/b ',
ajouter le texte⎕SH
exécuter en shellr←
stocker dans r↑
faire une liste de chaînes dans une matrice de caractères⍋
indices de tri croissantr[
...]
réorganiser r [trié](
...)
sur la sortie standard de la commande shell, faites:'[^\\]+\\'⎕R' '
regex remplace les séquences terminées par des antislashs de non-antislashs par quatre espaces1↓
laisser tomber la première ligne⊂∘⊃,
ajouter le premier [ligne] ci-jointLe résultat de la saisie de "\ tmp" à l'invite commence comme suit sur mon ordinateur:
⋮
la source
SML , 176 octets
Déclare (entre autres) une fonction
%
qui prend une chaîne en argument. Appelez avec% "C:/Some/Path";
ou% (getDir());
pour le répertoire actuel.J'utilise le langage StandardML normalement utilisé de manière plutôt fonctionnelle, dont
FileSys
j'ai découvert la bibliothèque après avoir lu ce défi.Les caractères spéciaux
!
,&
,$
et%
ont pas de signification particulière dans la langue elle - même et sont simplement utilisés comme identifiants; cependant, ils ne peuvent pas être mélangés avec les identificateurs alphanumériques standard, ce qui permet de se débarrasser de certains espaces autrement nécessaires.Peut être compilé comme ceci avec SML / NJ ou avec Moscow ML * en préfixant avec
load"OS";
.* Voir
mosml.org
, ne peut pas publier plus de 2 liens.la source
C # (.NET Core) , 222 octets
Essayez-le en ligne!
Le non-golf:
C'est la première fois que je récursais une
Main
fonction!Je crois qu'une personne qui a une connaissance plus récente de C # peut jouer au golf plus, car je n'ai pas programmé sur C # depuis un certain temps!
la source
PHP, 180 octets
NULL
et sera interprété comme0
parstr_repeat
; lancera un avertissement s'il n'est pas fourniajoute des parenthèses
is_dir(...)?d(...):"..."
pour supprimer les entrées masquées de la sortie (+2)remplace
"#^\.#"
par#^\.+$#
pour afficher / recrée les entrées masquées mais ignore les entrées pointées (+2)closedir($s);
avant la finale}
à corriger (+13)false!==
la condition while à corriger (+8)avec glob, 182 octets (probablement 163 dans le futur php)
2
signifieGLOB_MARK
, ajoutera une barre oblique à tous les noms de répertoire, commels -F
preg_replace
caractères spéciaux glob évadés quej'aurais pu abuser
preg_quote
pour cela (-19); mais cela échouerait sur les systèmes Windows, car la barre oblique inverse est le séparateur de répertoires.preg_quote
et fonctionner sur tous les systèmes.avec des itérateurs, 183 octets
(enfin, pas purement des itérateurs: j'ai utilisé implicitement
SplFileInfo::__toString()
le golf$f->getBaseName()
et$f->isDir()
les anciennes fonctions PHP 4).ls -a
),4096
ou,FilesystemIterator::SKIP_DOTS
avant),1
pour ignorer les entrées de points (+5) (ls -A
)1
signifieRecursiveIteratorIterator::SELF_FIRST
la source
PowerShell, 147 octets
Mec, je pense que PS devrait être capable de faire quelque chose comme la réponse bash, mais je ne propose rien de plus court que ce que j'ai ici.
Explication:
la source
Python 2, 138 octets
Modifié à partir de cette réponse SO . Ce sont des onglets d'indentation, pas des espaces. L'entrée sera prise comme
"C:/"
.Essayez-le en ligne - C'est assez intéressant que je suis autorisé à parcourir le répertoire sur Ideone ...
Même longueur:
la source
Lot, 237 octets
Où \ t représente le caractère de tabulation littéral. Cette version inclut des
\
s finaux sur les répertoires mais 41 octets peuvent être enregistrés s'ils ne sont pas nécessaires.la source
Perl, 89 octets
C'est utile quand il y a un module de recherche dans la distribution principale. Le module File :: Find de Perl ne traverse pas l'arbre dans l'ordre alphabétique, mais la spécification ne l'a pas demandé.
Le script proprement dit est de 76 octets, j'ai compté 13 octets pour les options de ligne de commande.
la source
Tcl , 116 octets
Essayez-le en ligne!
la source
Java 8, 205 octets
Il s'agit d'une soumission de programme complète qui prend en entrée son premier argument de ligne de commande (non explicitement autorisé, mais fait par de nombreux autres) et imprime la sortie en sortie standard.
Essayez-le en ligne (notez le nom différent de l'interface)
Non golfé
la source