Schreiben Sie in einer einzelnen Datei ein Programm, das keine Eingabe erfordert und keine Ausgabe erzeugt. Beim Ausführen sollte der Name der Datei, in der er enthalten ist , umgekehrt werden, unabhängig davon, wie der Name lautet , ohne den Code zu ändern oder andere dauerhafte Nebenwirkungen hervorzurufen.
Jeder Weg, dies zu erreichen, ist in Ordnung. Es ist nur wichtig, dass nach dem Ausführen des Programms die einzige dauerhafte Änderung darin besteht, dass der Dateiname umgekehrt wurde. zB sollten sich keine neuen Dateien im Verzeichnis befinden.
Wenn Sie das Programm erneut ausführen, sollte der Name zurückgesetzt werden. In der Tat sollte das Programm beliebig oft ausgeführt werden können.
Für die Zwecke dieser Herausforderung:
- Sie können davon ausgehen, dass Dateinamen immer Zeichenfolgen mit Kleinbuchstaben (az) zwischen 1 und 127 Zeichen sind. (Wenn für Ihre Sprache Dateien mit Erweiterungen ausgeführt werden müssen, kehren Sie einfach den Teil vor der Erweiterung um, z . B.
mycode.bat
→edocym.bat
.) - Sie können davon ausgehen, dass sich die Codedatei in einem eigenen Verzeichnis befindet, sodass keine Namenskonflikte auftreten (außer bei sich selbst).
- Sie dürfen nicht davon ausgehen, dass der Dateiname kein Palindrom ist, dh umgekehrt. Dateinamen, die Palindrome sind, sollten genauso gut funktionieren wie solche, die es nicht sind.
- Sie können den Inhalt oder die Metadaten Ihrer Datei lesen. Es gibt keine quine Einschränkungen hier.
- Sie können davon ausgehen, dass Ihr Programm auf einem bestimmten, modernen und alltäglichen Betriebssystem (z. B. Windows / Linux) ausgeführt wird, da nicht alle Shells denselben Befehlssatz haben.
Nehmen wir als konkretes Beispiel an, Sie haben ein Python-Programm in einer Datei, die
mycode
in einem eigenen Verzeichnis aufgerufen wird . Laufenpython mycode
im Terminal sollte dazu führen, dass der Dateiname in umgekehrt wird
edocym
. Die Dateiedocym
sollte sich alleine in ihrem Verzeichnis befinden - esmycode
sollte keine benannte Datei mehr existieren. Laufenpython edocym
mycode
kehrt den Namen zurück zu , an diesem Punkt kann der Vorgang auf unbestimmte Zeit wiederholt werden.Wenn die gleiche Python-Datei umbenannt wurde
racecar
(ohne den Code zu ändern) und dann ausführenpython racecar
nichts sollte sich sichtbar ändern, da "Rennwagen" ein Palindrom ist. Das gleiche gilt, wenn der Dateiname beispielsweise
a
oder lautetexx
.
Der kürzeste Code in Bytes gewinnt. Tiebreaker ist höher gestimmte Antwort.
quelle
Antworten:
Bash + gemeinsame Linux-Utils, 13 Bytes
Meine Methode ähnelt der von @DigitalTrauma, ist aber aufgrund der Pipe etwas kürzer mit
ls
:quelle
153 Bytes
OO ist cool und alles, bis Sie eine Variable definiert haben:
System.Reflection.Assembly.GetExecutingAssembly (). ManifestModule.Name
Das ist nur gemein
quelle
Bash + gemeinsame Linux-Utils, 15
Angenommen, das Skript befindet sich in einem eigenen Verzeichnis.
quelle
$0
kann ersetzt werden*
.$0
anstatt an das Letzte*
.<<<
.Julia, 51 Bytes
Dieses Programm sollte betriebssystemunabhängig sein, obwohl es nur unter OS X getestet wurde.
Ungolfed:
quelle
cd
. In diesem Fallf=readdir()[]
wäre noch kürzer.MATLAB,
5046 BytesVielen Dank an @Suever für das Entfernen von 4 Bytes und für das Testen!
Getestet unter OS X El Capitan und Debian Jessie, beide mit Matlab Version R2014a.
Unter Windows wird ein Flag
'f'
benötigt (e='.m';x=mfilename;movefile([x e],[flip(x) e]),'f'
), um den Dateinamen zu ändern, während die Datei verwendet wird.Wie es funktioniert
quelle
'f'
benötigt wird?Ruby, 24 Bytes
Ziemlich selbsterklärend. (
$0
ist der Name der ausgeführten Datei.)Führen Sie mit
ruby whatever
mit einem Arbeitsverzeichnis des Verzeichnisses aus, das die Datei enthält.quelle
Batch, 109 Bytes
Hinweis 1: Batch-Dateien müssen auf enden
.bat
. Es wird davon ausgegangen, dass die Batch-Datei mit ihrem Namen ohne Erweiterung ausgeführt wird und.bat
nicht rückgängig gemacht werden soll. Zum Beispielreverse
würde versuchen , umbenennenreverse.bat
zuesrever.bat
.Hinweis 2:
CMD.EXE
Fehler nach dem Umbenennen der Batch-Datei. (COMMAND.COM
Würde nicht, außer dass es überhaupt nicht in der Lage ist, Zeichenfolgen zu manipulieren.)Bearbeiten: 2 Byte mit der Garantie gespeichert, dass der Dateiname alphabetisch ist (basierend auf dem Kommentar von @ CᴏɴᴏʀO'Bʀɪᴇɴ).
quelle
if ]%f% NEQ ] goto l
C 102 Bytes
Nervenzusammenbruch:
Endlich eine Herausforderung, bei der C nicht (so hoffnungslos) wettbewerbsunfähig ist!
Wenn wir „können Sie das Arbeitsverzeichnis der Shell übernehmen wird der Ordner der Datei in ist“ bedeutet , dass das Programm immer aufgerufen werden
./myexecutable
, können wir vereinfachen*n=strrchr(*v,47)
zu*n=*v+1
10 Zeichen zu speichern, aber das ist nicht ganz gültig ( es könnte././myexecutable
zum Beispiel aufgerufen werden als ).Auch wenn Sie eine Dateierweiterung (zB „.out“) im Takt halten möchten, können Sie ändern
*t=strchr(b,0)
zu*t=strrchr(b,46)
, 2 Bytes kosten. Wird aber nicht benötigt.quelle
rename
passiert, wenn src == dest; es scheint, dass Sie die Palindrom-Bedingung kostenlos erfüllen./
in einem Eckfall?)oldpath
undnewpath
sind vorhandene feste Links, die auf dieselbe Datei verweisen, dannrename()
tut das nichts und gibt einen Erfolgsstatus zurück" - wenn die Zeichenfolgen identisch sind, verweisen sie auf dieselbe Datei.Vitsy + * sh, 15 Bytes
Erläuterung
Beachten Sie, dass für diese Einreichung die nicht sichere Version von Vitsy verwendet werden muss (nicht bei Try It Online möglich!)
quelle
Perl 5, 18 Bytes
Ein bisschen wie der Ruby (run
perl nameofscript
):Die Berücksichtigung eines möglichen Pfades ist hässlicher (47 Bytes)
quelle
V ,
2926 BytesDa dies nicht druckbare Dateien enthält, ist hier ein Hex-Dump:
Hinweis: Dies kann nicht auf v.tryitonline.net ausgeführt werden, da TIO keinen Dateizugriff zulässt.
Erläuterung:
quelle
Python 3, 105 Bytes
-Alex.A hat 1 Byte entfernt.
-Digital Trauma zeigte mir os.rename (), das 62 Bytes wegnahm.
-muddyfish hat 7 Bytes entfernt.
quelle
import
import os,sys;f=sys.argv[0];os.rename(f,f[::-1])
sollte den Trick für 48 Bytes tunsys.argv[0]
nur den Dateinamen ohne Pfad zurück, wenn das Skript direkt in einem eigenen ausgeführt wird. Helka gab an, dass dies in Ordnung istPHP,
84,7054 BytesBEARBEITEN: 14 Bytes entfernt dank
insertusernamehere
in den KommentarenBEARBEITEN: 16 Bytes entfernt dank
Martijn
in den Kommentarenquelle
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 Byte
quelle
Python 2 , 41 Bytes
Demo auf Bash.
Python ist die Dateierweiterung wirklich egal, also können wir einfach den gesamten Dateinamen spiegeln.
quelle
PHP, 31 Bytes
Es gibt wohl nicht viel zu erklären:
quelle
Perl 6 ,
7027 BytesWenn es in einem anderen Arbeitsverzeichnis arbeiten müsste, bräuchten Sie so etwas:
Da das Arbeitsverzeichnis dasselbe Verzeichnis wie das Programm ist, kann es auf folgende Weise vereinfacht werden:
Erläuterung:
quelle
JavaScript (Node),
10810468 Bytes36 Bytes gespart, dank Downgoat!
Windows-Version:
Andere Version:
quelle
js
stimme am Ende des Dateipfads überein, dem ein Zeichen vorangestellt ist. Dies wird immer ein.
.JavaScript ES6 (Node.js) 70 Bytes
Kein Regex Yay!
Jede Hilfe wird geschätzt
quelle
PowerShell v4 +, 68 Byte
Funktioniert nur, weil das Skript sich garantiert von alleine in einem Verzeichnis befindet. Führt einen
ls
(Alias fürGet-ChildItem
) aus und nimmt das.Name
der resultierenden Objekte. Wir speichern , dass in$c
und dann-split
auf wörtlichen Zeitraum die Dateinamen und Erweiterung zu erhalten, und speichern Sie die in$a
und$b
dargestellt.Als nächstes ist die
mv
(Alias fürMove-Item
) Befehl, wo wir bewegen$c
zu$a
(umgekehrt).$b
.Beispiel
quelle
Python (2.7 oder 3.4+),
6149 BytesIch glaube, das ist in der Nähe der optimalen Python-Lösung:
Inspiriert von
s4b3r6
der Antwort, verwendet aber List Slicing anstelle von Reverse und speichert__file__
in einer Variablen, um Bytes zu sparen, wenn es zweimal verwendet wird.Hinweis: Dies setzt voraus, dass der Dateiname immer ist
*.py
. Eine etwas allgemeinere Lösung, die mit jeder zweistelligen Dateierweiterung umgehen kanna[-3:]
, ist das Ersetzen".py"
auf Kosten von 1 zusätzlichen Byte.Update: 12 Bytes mit dem List Slicing Trick
a[-4::-1]
gespeichert, um die Dateierweiterung zu entfernen, anstatt sie zu teilen und dann mit umzukehrena.split(".")[0][::-1]
.quelle
Powershell, 112 Bytes
Ich werde die Unix-Cmds nicht schlagen, nur meine zwei Pence zum Spaß hinzufügen :-)
quelle
{}
, oder indem Sie 4 Leerzeichen vor Ihrem Code einfügen.PowerShell, 50 Byte
Es gibt nur eine Datei, daher hat der
mv *
Shell-Platzhalter nur ein Ergebnis. Der(ls).basename
Zielname listet alle Dateien auf (Alias für 'dir'), ruft die BaseName-Eigenschaft auf - und da es nur eine Datei gibt, entpackt PowerShell das Array mit 1 Element in eine Zeichenfolge. Speichern Sie diesen Dateinamen in$f
und indizieren Sie ihn mit einem Countdown, und-join
die umgekehrten Zeichen werden zu einer Zeichenfolge. Fügen Sie das obligatorische.ps1
Suffix hinzu.quelle
AutoIt, 45 Bytes
quelle
Python 2.7, 68 Bytes
Dies ist wahrscheinlich das Beste, was ich bekommen kann.Ich habe mich nur als falsch erwiesen.quelle
Python (2 & 3),
88 bis78 BytesNutzt die Tatsache aus, dass der Dateiname von sys.argv angegeben wird (da das Arbeitsverzeichnis der Ordner ist, in dem sich die Datei befindet) und verwendet os.rename. Ärgerlicherweise gibt reverse einen Iterator zurück, daher müssen wir join verwenden.
Bearbeiten: 10 Bytes mit __file__ anstelle von sys.argv [0] gespeichert, wie von @muddyfish an @DigitalTrauma vorgeschlagen.
quelle
tcl, 42
quelle
Visual Basic-Skript, 44 Bytes
Beispielausgabe für die aufgerufene Datei
reverse.vbs
(Run with cscript):quelle
SFK , 83 Bytes
Probieren Sie es online!
quelle
SmileBASIC 60 Bytes
Alternative:
quelle