В одном файле напишите программу, которая не требует ввода и не производит вывода. При запуске он должен полностью изменить имя файла, в котором он содержится, независимо от того, какое это имя , без изменения кода или создания других длительных побочных эффектов.
Любой способ достижения этого хорошо. Имеет значение только то, что после запуска программы единственным долговременным изменением является изменение ее имени файла. например, в каталоге не должно быть новых файлов.
Повторный запуск программы должен вернуть имя обратно. Действительно, программа должна запускаться произвольно много раз.
Для целей этой задачи:
- Вы можете предположить, что имена файлов - это всегда строчные буквы (az) длиной от 1 до 127 символов. (Если ваш язык требует, чтобы файлы имели расширения для запуска, просто переверните деталь перед расширением, например
mycode.bat
→edocym.bat
.) - Вы можете предположить, что файл кода находится в каталоге сам по себе, поэтому у него не будет конфликтов имен (кроме как с самим собой).
- Вы не можете предполагать, что имя файла не является палиндромом, то есть то же самое при обращении. Имена файлов, которые являются палиндромами, должны работать так же, как и те, которые не работают.
- Вы можете прочитать содержимое вашего файла или метаданные. Там нет Куайна ограничений здесь.
- Вы можете предположить, что ваша программа будет работать в конкретной современной обычной операционной системе (например, Windows / Linux), поскольку не все оболочки имеют одинаковый набор команд.
В качестве конкретного примера, скажем, у вас есть программа на Python в файле, который называется
mycode
в своем собственном каталоге. Бегpython mycode
в терминале должно привести к обратному имени файла
edocym
. Файлedocym
должен быть один в своем каталоге - файл с именемmycode
больше не должен существовать. Бегpython edocym
обратится к имени обратно
mycode
, после чего процесс может повторяться бесконечно.Если тот же файл Python был переименован
racecar
(без изменения кода), а затем запуститьpython racecar
ничего не должно заметно измениться, так как «гоночный автомобиль» - палиндром. То же самое происходит, если имя файла было, скажем,
a
илиxx
.
Самый короткий код в байтах побеждает. Ответ Tiebreaker выше.
источник
Ответы:
Bash + общие утилиты Linux, 13 байт
Мой метод похож на @ DigitalTrauma, но немного короче из-за канала с
ls
:источник
C #, 153 байта
ОО это круто и все, пока у вас не определится переменная:
System.Reflection.Assembly.GetExecutingAssembly (). ManifestModule.Name
это просто значит
источник
Bash + общие утилиты Linux, 15
Предполагается, что скрипт находится в каталоге сам по себе.
источник
$0
его можно заменить на*
.$0
а не к последнему*
.<<<
.Юлия, 51 байт
Эта программа должна быть независимой от операционной системы, хотя она была протестирована только на OS X.
Ungolfed:
источник
cd
. В этом случаеf=readdir()[]
будет еще короче.MATLAB,
5046 байтовСпасибо @Suever за удаление 4 байтов и за тестирование!
Протестировано на OS X El Capitan и Debian Jessie, оба с версией Matlab R2014a.
В Windows необходим флаг
'f'
(e='.m';x=mfilename;movefile([x e],[flip(x) e]),'f'
), чтобы изменить имя файла во время его использования.Как это работает
источник
'f'
работаете?Рубин, 24 байта
Довольно очевидный. (
$0
это имя исполняемого файла.)Запустите с
ruby whatever
рабочим каталогом каталог, который содержит файл.источник
Пакетный, 109 байтов
Примечание 1: Пакетные файлы должны заканчиваться
.bat
; Предполагается, что пакетный файл выполняется по имени без расширения и.bat
не подлежит обращению. Например,reverse
попытался бы переименоватьreverse.bat
вesrever.bat
.Примечание 2:
CMD.EXE
ошибки после переименования командного файла. (COMMAND.COM
нет, за исключением того, что он не способен манипулировать строками).Изменить: 2 байта сохранены, используя гарантию, что имя файла является буквенным (на основе комментария @ CᴏɴᴏʀO'Bʀɪᴇɴ).
источник
if ]%f% NEQ ] goto l
C, 102 байта
Сломать:
Наконец, задача, в которой С не является (совершенно безнадежно) неконкурентоспособной!
Если мы возьмем «Можно предположить , рабочий каталог оболочки будет папка файл в» означает , что программа всегда будет служить
./myexecutable
, мы можем упростить ,*n=strrchr(*v,47)
чтобы*n=*v+1
спасти 10 символов, но это не совсем правомочно ( это может быть вызвано как././myexecutable
, например).Кроме того, если вы хотите сохранить расширение файла (например, «.out»), вы можете изменить его
*t=strchr(b,0)
на*t=strrchr(b,46)
2 байта. Не обязательно, хотя.источник
rename
делает, если src == dest; кажется, что вы удовлетворяете ограничению палиндрома бесплатно./
в угловом случае?)oldpath
иnewpath
существуют жесткие ссылки, ссылающиеся на один и тот же файл, тоrename()
ничего не делает и возвращает статус успеха» - если строки идентичны, они ссылаются на один и тот же файл.Витси + * ш, 15 байт
объяснение
Обратите внимание, что в этом представлении должна использоваться небезопасная версия Vitsy (это невозможно сделать в Try It Online!)
источник
Perl 5, 18 байт
Немного похоже на Ruby (запустить
perl nameofscript
):Принятие во внимание возможного пути более утомительно (47 байт)
источник
V ,
2926 байтТак как это содержит непечатаемые, вот шестнадцатеричный дамп:
Примечание: это не будет работать на v.tryitonline.net, так как TIO не разрешает доступ к файлам.
Объяснение:
источник
Python 3, 105 байт
-Alex.A удален 1 байт.
-Цифровая травма показала мне os.rename (), который забрал 62 байта.
Грязная рыба удалила 7 байт.
источник
import
import os,sys;f=sys.argv[0];os.rename(f,f[::-1])
должен сделать трюк для 48 байтовsys.argv[0]
просто возвращает имя файла только без пути, когда скрипт запускается самостоятельно. Хелка указала, что все в порядкеPHP,
84,7054 байтаРЕДАКТИРОВАТЬ: удалено 14 байтов благодаря
insertusernamehere
в комментарияхРЕДАКТИРОВАТЬ: удалено 16 байтов благодаря
Martijn
в комментарияхисточник
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 байт
источник
Python 2 , 41 байт
Демо на Баш.
Python действительно не заботится о расширении файла, поэтому мы можем просто перевернуть все имя файла.
источник
PHP, 31 байт
Ничего особенного, чтобы объяснить, я думаю:
источник
Perl 6 ,
7027 байтЕсли бы ему нужно было работать в другом рабочем каталоге, вам нужно что-то вроде этого:
Поскольку рабочий каталог будет таким же, что и программа, его можно упростить до:
Объяснение:
источник
JavaScript (узел),
10810468 байт36 байтов сохранено, благодаря Downgoat!
Версия для Windows:
Другая версия:
источник
js
в конце пути к файлу, которому предшествует символ. Это всегда будет.
.JavaScript ES6 (Node.js) 70 байт
Нет Regex Yay!
Любая помощь приветствуется
источник
PowerShell v4 +, 68 байт
Работает только потому, что скрипт гарантированно находится в каталоге сам по себе. Выполняет
ls
(псевдоним дляGet-ChildItem
) и принимает.Name
результирующий объект (ы). Мы сохраняем это в буквальном периоде,$c
а затем в-split
нем, чтобы получить имя файла и расширение, и сохраняем их в$a
и$b
, соответственно.Далее это
mv
(псевдонимMove-Item
) команды, где мы движемся$c
к$a
(обратный).$b
.пример
источник
Python (2,7 или 3,4+),
6149 байтЯ считаю, что это близко к оптимальному решению Python:
Вдохновлен
s4b3r6
ответом, но использует срез списка вместо обратного и сохраняет__file__
в переменную, чтобы сохранить байты при его двойном использовании.Примечание. Предполагается, что имя файла всегда
*.py
. Несколько более универсальным решением, которое может обрабатывать любое двухсимвольное расширение файла, было бы использовать егоa[-3:]
для замены".py"
, затратив 1 дополнительный байт.Обновление: 12 байтов сохранены с помощью трюка среза списка,
a[-4::-1]
чтобы удалить расширение файла, вместо разделения, а затем с помощью реверсаa.split(".")[0][::-1]
.источник
Powershell, 112 байт
Я не собираюсь побеждать Unix cmds, просто добавляю свои два пенса для удовольствия :-)
источник
{}
, или добавив 4 пробела перед кодом.PowerShell, 50 байт
Файл только один, поэтому
mv *
подстановочный знак будет иметь только один результат. Имя назначения, в(ls).basename
котором перечислены все файлы (псевдоним 'dir'), вызывает свойство BaseName - и поскольку существует только один файл, PowerShell распакует массив из 1 элемента в строку. Сохраните это имя в файле$f
, затем индексируйте его обратным отсчетом и-join
обратные символы вернутся в строку. Добавьте обязательный.ps1
суффикс.источник
AutoIt, 45 байт
источник
Python 2.7, 68 байт
Это, наверное, лучшее, что я могу получить.Я просто доказал, что ошибаюсь.источник
Python (2 и 3),
8878 байтИспользует тот факт, что имя файла задается sys.argv (поскольку рабочим каталогом является папка, в которой находится файл), и использует os.rename. Досадно, что перевернутый возвращает итератор, поэтому мы должны использовать соединение.
Изменить: 10 байтов были сохранены с использованием __file__ вместо sys.argv [0], как предложено @muddyfish для @DigitalTrauma.
источник
ткл, 42
источник
Сценарий Visual Basic, 44 байта
Пример вывода для файла с именем
reverse.vbs
(Run with cscript):источник
сфк , 83 байта
Попробуйте онлайн!
источник
SmileBASIC 60 байт
Альтернатива:
источник