W jednym pliku napisz program, który nie wymaga danych wejściowych i nie generuje danych wyjściowych. Po uruchomieniu powinien odwrócić nazwę pliku, w którym się znajduje, bez względu na nazwę , bez zmiany kodu lub wywoływania innych trwałych skutków ubocznych.
Każdy sposób osiągnięcia tego jest w porządku. Liczy się tylko to, że po uruchomieniu programu jedyną trwałą zmianą jest odwrócenie nazwy pliku. np. żadne nowe pliki nie powinny znajdować się w katalogu.
Ponowne uruchomienie programu powinno odwrócić nazwę. Rzeczywiście, program powinien być w stanie być uruchamiany dowolnie wiele razy.
Na potrzeby tego wyzwania:
- Możesz założyć, że nazwy plików to zawsze ciągi małych liter (az) o długości od 1 do 127 znaków. (Jeśli twój język wymaga, aby pliki miały rozszerzenia do uruchomienia, po prostu odwróć część przed rozszerzeniem, np .
mycode.bat
→edocym.bat
). - Możesz założyć, że plik kodu jest sam w katalogu, więc nie będzie miał konfliktów nazw (z wyjątkiem samego siebie).
- Być może nie zakładamy, że nazwa pliku nie jest palindrom, czyli tyle samo, gdy odwrócony. Nazwy plików, które są palindromami, powinny działać tak samo dobrze, jak te, które nie są.
- Możesz przeczytać zawartość pliku lub metadane. Brak Quine ograniczenia tutaj.
- Możesz założyć, że twój program będzie działał na określonym, nowoczesnym, powszechnym systemie operacyjnym (np. Windows / Linux), ponieważ nie wszystkie powłoki mają ten sam zestaw poleceń.
Jako konkretny przykład, powiedzmy, że masz program w języku Python w pliku o nazwie
mycode
w jego własnym katalogu. Bieganiepython mycode
w terminalu powinno spowodować odwrócenie nazwy pliku
edocym
. Plikedocym
powinien być sam w swoim katalogu - żaden nazwany plik niemycode
powinien już istnieć. Bieganiepython edocym
odwróci nazwę z powrotem do
mycode
, w którym to momencie proces można powtarzać w nieskończoność.Jeśli nazwa tego samego pliku Python została zmieniona
racecar
(bez zmiany kodu), a następnie uruchompython racecar
nic nie powinno się wyraźnie zmienić, ponieważ „samochód wyścigowy” to palindrom. To samo dotyczy, jeśli nazwa pliku to, powiedzmy,
a
lubxx
.
Najkrótszy kod w bajtach wygrywa. Tiebreaker jest wyżej głosowaną odpowiedzią.
źródło
Odpowiedzi:
Bash + wspólne narzędzia linux, 13 bajtów
Moja metoda jest podobna do @ DigitalTrauma, ale nieco krótsza ze względu na potok z
ls
:źródło
C #, 153 bajty
OO jest fajne i dopóki nie zdefiniujesz zmiennej:
System.Reflection.Assembly.GetExecutingAssembly (). ManifestModule.Name
to po prostu znaczy
źródło
Bash + wspólne narzędzia linux, 15
Zakłada, że skrypt jest sam w katalogu.
źródło
$0
możesz go zastąpić*
.$0
poprzedniej wersji*
.<<<
.Julia, 51 bajtów
Ten program powinien być niezależny od systemu operacyjnego, chociaż był testowany tylko na OS X.
Nie golfowany:
źródło
cd
. W takim przypadkuf=readdir()[]
byłby jeszcze krótszy.MATLAB,
5046 bajtówDzięki @Suever za usunięcie 4 bajtów i za testowanie!
Testowane na OS X El Capitan i Debian Jessie, oba z wersją Matlab R2014a.
W systemie Windows
'f'
potrzebna jest flaga (e='.m';x=mfilename;movefile([x e],[flip(x) e]),'f'
) do zmiany nazwy pliku podczas jego używania.Jak to działa
źródło
'f'
jest wymagany?Ruby, 24 bajty
Dość oczywiste. (
$0
to nazwa wykonywanego pliku).Uruchom z
ruby whatever
działającym katalogiem katalogu zawierającego plik.źródło
Partia, 109 bajtów
Uwaga 1: Pliki wsadowe muszą kończyć się na
.bat
; zakłada się, że plik wsadowy jest wykonywany według jego nazwy bez rozszerzenia i że.bat
nie można go odwrócić. Na przykładreverse
próbowałby zmienić nazwęreverse.bat
naesrever.bat
.Uwaga 2:
CMD.EXE
błędy występują po zmianie nazwy pliku wsadowego. (COMMAND.COM
nie, poza tym, że przede wszystkim nie jest w stanie manipulować łańcuchem znaków).Edycja: Zapisano 2 bajty, używając gwarancji, że nazwa pliku jest alfabetyczna (na podstawie komentarza @ CᴏɴᴏʀO'Bʀɪᴇɴ).
źródło
if ]%f% NEQ ] goto l
C, 102 bajty
Awaria:
Wreszcie wyzwanie, w którym C nie jest (tak beznadziejnie) niekonkurencyjne!
Jeśli weźmiemy „Można założyć, katalog roboczy powłoki będzie folder plik znajduje się” oznacza, że program będzie zawsze wywoływana jak
./myexecutable
możemy uprościć*n=strrchr(*v,47)
aby*n=*v+1
zapisać 10 znaków, ale to nie jest do końca poprawny ( można././myexecutable
na przykład wywołać ).Również jeśli chcesz zachować rozszerzenie pliku (np. „.Out”), możesz zmienić
*t=strchr(b,0)
na*t=strrchr(b,46)
, kosztując 2 bajty. Nie jest to jednak wymagane.źródło
rename
, jeśli src == dest; wydaje się, że spełniasz ograniczenie palindromu za darmo./
w przypadku narożnym?)oldpath
inewpath
istnieją twarde linki odnoszące się do tego samego pliku, torename()
nic nie robi i zwraca status powodzenia” - jeśli ciągi są identyczne, odnoszą się do tego samego pliku.Vitsy + * sh, 15 bajtów
Wyjaśnienie
Pamiętaj, że w tym zgłoszeniu należy użyć niezabezpieczonej wersji Vitsy (nie można tego zrobić w Try It Online!)
źródło
Perl 5, 18 bajtów
Trochę jak Ruby (uruchom
perl nameofscript
):Biorąc pod uwagę możliwą ścieżkę, jest brzydsza (47 bajtów)
źródło
V ,
2926 bajtówPonieważ zawiera to niedrukowalne, oto zrzut heksowy:
Uwaga: nie będzie działać na v.tryitonline.net, ponieważ TIO nie zezwala na dostęp do plików.
Wyjaśnienie:
źródło
Python 3, 105 bajtów
-Aleks.A usunięto 1 bajt.
-Digital Trauma pokazał mi os.rename (), który zabrał 62 bajty.
-muddyfish usunął 7 bajtów.
źródło
import
import os,sys;f=sys.argv[0];os.rename(f,f[::-1])
powinien załatwić sprawę za 48 bajtówsys.argv[0]
po prostu zwraca nazwę pliku bez ścieżki, gdy skrypt jest uruchamiany bezpośrednio we własnym. Helka wskazała, że to w porządkuPHP,
84,70, 54 bajtyEDYCJA: usunięto 14 bajtów dzięki
insertusernamehere
w komentarzachEDYCJA: usunięto 16 bajtów dzięki
Martijn
w komentarzachźródło
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 bajtów
źródło
Python 2 , 41 bajtów
Demo na Bash.
Python naprawdę nie dba o rozszerzenie pliku, więc możemy po prostu przerzucić całą nazwę pliku.
źródło
PHP, 31 bajtów
Chyba nic wielkiego do wyjaśnienia:
źródło
Perl 6 ,
7027 bajtówGdyby musiał pracować w innym katalogu roboczym, potrzebujesz czegoś takiego:
Ponieważ katalog roboczy będzie tym samym katalogiem co program, można go uprościć po prostu:
Wyjaśnienie:
źródło
JavaScript (węzeł),
10810468 bajtów36 bajtów zapisanych, dzięki Downgoat!
Wersja Windows:
Inna wersja:
źródło
js
na końcu ścieżki pliku, poprzedzonej znakiem. To zawsze będzie.
.JavaScript ES6 (Node.js) 70 bajtów
No Regex Yay!
Każda pomoc jest mile widziana
źródło
PowerShell v4 +, 68 bajtów
Działa tylko, ponieważ skrypt ma gwarancję, że sam znajdzie się w katalogu. Wykonuje
ls
(alias dlaGet-ChildItem
) i pobiera.Name
wynikowe obiekty. Przechowujemy to w,$c
a następnie-split
w dosłownym okresie, aby uzyskać nazwę pliku i rozszerzenie oraz przechowywać je odpowiednio w$a
i$b
.Dalej jest polecenie
mv
(alias dlaMove-Item
), w którym przechodzimy$c
do$a
(odwróconego).$b
.Przykład
źródło
Python (2.7 lub 3.4+),
6149 bajtówUważam, że jest to zbliżone do optymalnego rozwiązania Python:
Zainspirowany
s4b3r6
odpowiedzią, ale używa wycinania list zamiast odwrotnego i zapisuje__file__
zmienną w celu zapisania bajtów przy dwukrotnym użyciu.Uwaga: Zakłada się, że nazwa pliku jest zawsze
*.py
. Nieco bardziej ogólnym rozwiązaniem, które może obsłużyć dowolne dwuznakowe rozszerzenie pliku, byłobya[-3:]
zastąpienie".py"
go kosztem 1 dodatkowego bajtu.Aktualizacja: Zapisano 12 bajtów, używając sztuczki wycinania list,
a[-4::-1]
aby usunąć rozszerzenie pliku, zamiast dzielić, a następnie cofaća.split(".")[0][::-1]
.źródło
PowerShell, 112 bajtów
Nie zamierzam pobić cmdów unixowych, dodając tylko dwa pensy dla zabawy :-)
źródło
{}
, lub dodając 4 spacje przed kodem.PowerShell, 50 bajtów
Jest tylko jeden plik, więc
mv *
symbol wieloznaczny powłoki będzie miał tylko jeden wynik. Nazwą docelową jest(ls).basename
lista wszystkich plików (alias „dir”), wywoływana jest właściwość BaseName - a ponieważ jest tylko jeden plik, PowerShell rozpakuje tablicę 1-elementową w ciąg. Zapisz nazwę pliku$f
, a następnie zindeksuj odliczanie, a-join
odwrócone znaki z powrotem w łańcuch. Dodaj obowiązkowy.ps1
sufiks.źródło
AutoIt, 45 bajtów
źródło
Python 2.7, 68 bajtów
To chyba najlepsze, co mogę dostać.Właśnie udowodniłem, że się mylę.źródło
Python (2 i 3),
8878 bajtówWykorzystuje fakt, że nazwa pliku jest podawana przez sys.argv (ponieważ katalog roboczy to folder, w którym znajduje się plik) i korzysta z os.rename. Irytujące, odwrócone zwraca iterator, więc musimy użyć łączyć.
Edycja: Zapisano 10 bajtów, używając __plik___ zamiast sys.argv [0], jak sugeruje @muddyfish dla @DigitalTrauma.
źródło
tcl, 42
źródło
Skrypt Visual Basic, 44 bajtów
Przykładowe dane wyjściowe dla pliku o nazwie
reverse.vbs
(Uruchom z cscript):źródło
sfk , 83 bajty
Wypróbuj online!
źródło
SmileBASIC 60 bajtów
Alternatywny:
źródło