Dans un seul fichier, écrivez un programme qui ne nécessite aucune entrée et ne produit aucune sortie. Lorsqu'il est exécuté, il doit inverser le nom du fichier dans lequel il se trouve, quel que soit son nom , sans altérer le code ni produire d'autres effets secondaires durables.
Tout moyen d'y parvenir est très bien. Il importe seulement qu'une fois le programme exécuté, le seul changement durable soit que son nom de fichier ait été inversé. par exemple, aucun nouveau fichier ne doit se trouver dans le répertoire.
Réexécuter le programme devrait inverser le nom. En effet, le programme devrait pouvoir être exécuté arbitrairement plusieurs fois.
Aux fins de ce défi:
- Vous pouvez supposer que les noms de fichiers sont toujours des chaînes de lettres minuscules (az) de 1 à 127 caractères. (Si votre langue nécessite que les fichiers aient des extensions pour s'exécuter, inversez simplement la partie avant l'extension, par exemple
mycode.bat
→edocym.bat
.) - Vous pouvez supposer que le fichier de code se trouve dans un répertoire lui-même afin qu'il n'ait pas de conflits de dénomination (sauf avec lui-même).
- Vous ne pouvez pas supposer que le nom de fichier n'est pas un palindrome, c'est-à-dire le même lorsqu'il est inversé. Les noms de fichiers qui sont des palindromes devraient fonctionner aussi bien que ceux qui ne le sont pas.
- Vous pouvez lire le contenu ou les métadonnées de votre fichier. Il n'y a aucune restriction de quine ici.
- Vous pouvez supposer que votre programme sera exécuté sur un système d'exploitation courant particulier, moderne (par exemple Windows / Linux), car tous les shells n'ont pas le même jeu de commandes.
Par exemple, disons que vous avez un programme Python dans un fichier appelé
mycode
dans son propre répertoire. Fonctionnementpython mycode
dans le terminal devrait entraîner une inversion du nom de fichier
edocym
. Le fichieredocym
doit être seul dans son répertoire - aucun fichier nommémycode
ne doit plus exister. Fonctionnementpython edocym
inversera le nom
mycode
, auquel cas le processus peut être répété indéfiniment.Si le même fichier Python a été renommé
racecar
(sans changer le code), puis exécutezpython racecar
rien ne devrait visiblement changer puisque "racecar" est un palindrome. Il en va de même si le nom de fichier était, disons,
a
ouxx
.
Le code le plus court en octets gagne. Tiebreaker est la réponse la plus votée.
la source
Réponses:
Bash + utilitaires Linux communs, 13 octets
Ma méthode est similaire à celle de @ DigitalTrauma mais un peu plus courte en raison de la pipe avec
ls
:la source
C #, 153 octets
OO est cool et jusqu'à ce qu'une variable soit définie:
System.Reflection.Assembly.GetExecutingAssembly (). ManifestModule.Name
c'est juste dire
la source
Bash + utilitaires Linux courants, 15
Suppose que le script se trouve dans un répertoire lui-même.
la source
$0
peut donc être remplacé par*
.$0
au lieu du dernier*
.<<<
.Julia, 51 octets
Ce programme devrait être indépendant du système d'exploitation, bien qu'il n'ait été testé que sur OS X.
Non golfé:
la source
cd
. Dans ce cas, cef=readdir()[]
serait encore plus court.MATLAB,
5046 octetsMerci à @Suever d'avoir supprimé 4 octets et pour les tests!
Testé sur OS X El Capitan et Debian Jessie, tous deux avec la version Matlab R2014a.
Sous Windows, un indicateur
'f'
est nécessaire (e='.m';x=mfilename;movefile([x e],[flip(x) e]),'f'
) pour modifier le nom du fichier lors de son utilisation.Comment ça marche
la source
'f'
?Rubis, 24 octets
Assez explicite. (
$0
est le nom du fichier en cours d'exécution.)Exécutez avec
ruby whatever
un répertoire de travail du répertoire qui contient le fichier.la source
Lot, 109 octets
Remarque 1: les fichiers batch doivent se terminer par
.bat
; il est supposé que le fichier de commandes est exécuté par son nom sans extension et que le.bat
ne doit pas être inversé. Par exemple,reverse
tenterait de renommerreverse.bat
àesrever.bat
.Remarque 2:
CMD.EXE
erreurs après avoir renommé le fichier de commandes. (COMMAND.COM
ne le ferait pas, sauf qu'il est incapable de manipuler les chaînes en premier lieu.)Edit: sauvé 2 octets en utilisant la garantie que le nom du fichier est alphabétique (basé sur le commentaire de @ CᴏɴᴏʀO'Bʀɪᴇɴ).
la source
if ]%f% NEQ ] goto l
C, 102 octets
Panne:
Enfin un défi où C n'est pas (tout à fait désespérément) non compétitif!
Si l' on prend « Vous pouvez supposer le répertoire de travail de la coquille sera le dossier que le fichier est » pour signifier que le programme sera toujours invoquée
./myexecutable
, nous pouvons simplifier*n=strrchr(*v,47)
pour*n=*v+1
sauver 10 caractères, mais ce n'est pas tout à fait valable ( elle pourrait être invoquée././myexecutable
par exemple).De plus, si vous souhaitez conserver une extension de fichier (par exemple ".out") intacte, vous pouvez modifier
*t=strchr(b,0)
à*t=strrchr(b,46)
, coûtant 2 octets. Pas obligatoire cependant.la source
rename
qui se passait si src == dest; il semble que vous satisfaisiez gratuitement la contrainte palindrome./
dans un cas d'angle?)oldpath
etnewpath
sont des liens durs existants se référant au même fichier, alorsrename()
ne fait rien et retourne un état de réussite" - si les chaînes sont identiques, elles se réfèrent au même fichier.Vitsy + * sh, 15 octets
Explication
Notez que cette soumission doit utiliser la version non sûre de Vitsy (ne peut pas être effectuée sur Try It Online!)
la source
Perl 5, 18 octets
Un peu comme celui de Ruby (run
perl nameofscript
):La prise en compte d'un chemin possible est plus laide (47 octets)
la source
V ,
2926 octetsPuisqu'il contient des non imprimables, voici un vidage hexadécimal:
Remarque: cela ne fonctionnera pas sur v.tryitonline.net car TIO n'autorise pas l'accès aux fichiers.
Explication:
la source
Python 3, 105 octets
-Alex.A a supprimé 1 octet.
-Digital Trauma m'a montré os.rename () qui a enlevé 62 octets.
-muddyfish a supprimé 7 octets.
la source
import
import os,sys;f=sys.argv[0];os.rename(f,f[::-1])
devrait faire l'affaire pour 48 octetssys.argv[0]
retourne simplement le nom de fichier uniquement sans le chemin lorsque le script est exécuté directement. Helka a indiqué que tout allait bienPHP,
84,70, 54 octetsEDIT: supprimé 14 octets grâce aux
insertusernamehere
commentairesEDIT: supprimé 16 octets grâce aux
Martijn
commentairesla source
rename($f=__FILE__,__DIR__."/".strrev(pathinfo($f)[filename]).".php");
.rename($f=__FILE__,"./".strrev(pathinfo($f)[filename]).".php");
rename(__FILE__,strrev(basename(__FILE__,'.php')).'.php');
PowerShell, 39 octets
la source
Python 2 , 41 octets
Démo sur Bash.
Python ne se soucie vraiment pas de l'extension du fichier, nous pouvons donc simplement retourner le nom complet du fichier.
la source
PHP, 31 octets
Rien à expliquer, je suppose:
la source
Perl 6 ,
7027 octetsS'il devait fonctionner dans un répertoire de travail différent, vous auriez besoin de quelque chose comme ceci:
Puisque le répertoire de travail sera le même répertoire que le programme, il peut être simplifié simplement:
Explication:
la source
JavaScript (Node),
10810468 octets36 octets économisés, grâce à Downgoat!
Version Windows:
Autre version:
la source
js
à la fin du chemin de fichier, précédé d'un caractère. Ce sera toujours un.
.JavaScript ES6 (Node.js) 70 octets
Pas de Regex Yay!
Toute aide est appréciée
la source
PowerShell v4 +, 68 octets
Fonctionne uniquement parce que le script est garanti d'être dans un répertoire à lui tout seul. Effectue un
ls
(alias pourGet-ChildItem
) et prend le ou.Name
les objets résultants. Nous stockons cela dans$c
et ensuite-split
sur période littérale pour obtenir le nom de fichier et l'extension, et stockons ceux-ci dans$a
et$b
, respectivement.Vient ensuite la commande
mv
(alias pourMove-Item
), où nous passons$c
à$a
(inversé).$b
.Exemple
la source
Python (2,7 ou 3,4+),
6149 octetsJe crois que cela est proche de la solution Python optimale:
Inspiré par
s4b3r6
la réponse de, mais utilise le découpage de liste au lieu de l'inverse et enregistre__file__
dans une variable pour enregistrer les octets lors de son utilisation double.Remarque: Cela suppose que le nom de fichier est toujours
*.py
. Une solution légèrement plus générique qui peut gérer n'importe quelle extension de fichier à deux caractères serait d'utilisera[-3:]
pour remplacer".py"
, au prix d'un octet supplémentaire.Mise à jour: enregistré 12 octets en utilisant l'astuce de découpage de liste
a[-4::-1]
pour supprimer l'extension de fichier, au lieu de fractionner puis d'inverser aveca.split(".")[0][::-1]
.la source
Powershell, 112 octets
Je ne vais pas battre les cmds unix, juste ajouter mes deux pence pour le plaisir :-)
la source
{}
, ou en ajoutant 4 espaces avant votre code.PowerShell, 50 octets
Il n'y a qu'un seul fichier, donc le
mv *
caractère générique du shell n'aura qu'un seul résultat. Le nom de destination est celui(ls).basename
qui répertorie tous les fichiers (alias pour 'dir'), appelle la propriété BaseName - et comme il n'y a qu'un seul fichier, PowerShell décompresse le tableau à 1 élément dans une chaîne. Stockez ce nom de fichier$f
, puis indexez-le avec un compte à rebours et-join
les caractères inversés sont sauvegardés dans une chaîne. Ajoutez le.ps1
suffixe obligatoire .la source
AutoIt, 45 octets
la source
Python 2.7, 68 octets
C'est probablement le meilleur que je puisse obtenir.Je viens de me prouver que j'avais tort.la source
Python (2 et 3),
8878 octetsExploite le fait que le nom de fichier est donné par sys.argv (car le répertoire de travail est le dossier dans lequel se trouve le fichier) et utilise os.rename. De manière ennuyeuse, reverse renvoie un itérateur, nous devons donc utiliser join.
Edit: enregistré 10 octets en utilisant __file__ au lieu de sys.argv [0], comme suggéré par @muddyfish à @DigitalTrauma.
la source
tcl, 42
la source
Script Visual Basic, 44 octets
Exemple de sortie pour le fichier appelé
reverse.vbs
(Exécuter avec cscript):la source
sfk , 83 octets
Essayez-le en ligne!
la source
SmileBASIC 60 octets
Alternative:
la source