Em um único arquivo, escreva um programa que não exija entrada e não produza saída. Quando executado, ele deve reverter o nome do arquivo em que está, independentemente do nome , sem alterar o código ou produzir outros efeitos colaterais duradouros.
Qualquer maneira de conseguir isso é bom. Só importa que, uma vez que o programa seja executado, a única alteração duradoura seja que o nome do arquivo tenha sido revertido. por exemplo, nenhum novo arquivo deve estar no diretório
A execução do programa novamente deve reverter o nome. De fato, o programa deve poder ser executado arbitrariamente várias vezes.
Para os propósitos deste desafio:
- Você pode presumir que os nomes de arquivos são sempre cadeias de letras minúsculas (az) entre 1 e 127 caracteres. (Se o seu idioma exigir que os arquivos tenham extensões para executar, basta inverter a parte antes da extensão, por exemplo,
mycode.bat
→edocym.bat
.) - Você pode assumir que o arquivo de código está em um diretório por si só, para que não tenha conflitos de nomes (exceto com ele próprio).
- Você não pode assumir que o nome do arquivo não é um palíndromo, ou seja, o mesmo quando invertido. Nomes de arquivos que são palíndromos devem funcionar tão bem quanto aqueles que não são.
- Você pode ler o conteúdo ou os metadados do seu arquivo. Não há restrições de quine aqui.
- Você pode presumir que seu programa será executado em um sistema operacional comum, moderno e comum (por exemplo, Windows / Linux), pois nem todos os shells têm o mesmo conjunto de comandos.
Como um exemplo concreto, digamos que você tenha um programa Python em um arquivo chamado
mycode
em seu próprio diretório. Corridapython mycode
no terminal deve resultar na reversão do nome do arquivo para
edocym
. O arquivoedocym
deve estar sozinho em seu diretório - nenhum arquivo nomeadomycode
deve existir mais. Corridapython edocym
irá reverter o nome para
mycode
, quando o processo pode ser repetido indefinidamente.Se o mesmo arquivo Python foi renomeado
racecar
(sem alterar o código) e, em seguida, executepython racecar
nada deve mudar visivelmente, já que "carro de corrida" é um palíndromo. O mesmo se aplica se o nome do arquivo for, digamos,
a
ouxx
.
O código mais curto em bytes vence. O desempatador é a resposta votada mais alta.
fonte
Respostas:
Bash + utilitários linux comuns, 13 bytes
Meu método é semelhante ao do DigitalTrauma, mas um pouco mais curto devido ao pipe com
ls
:fonte
C #, 153 bytes
OO é legal e tudo até você ter uma variável definida:
System.Reflection.Assembly.GetExecutingAssembly (). ManifestModule.Name
isso é apenas dizer
fonte
Bash + utilitários linux comuns, 15
Supõe que o script esteja em um diretório por si só.
fonte
$0
pode ser substituído por*
.$0
não da última*
.<<<
.Julia, 51 bytes
Este programa deve ser independente do sistema operacional, embora tenha sido testado apenas no OS X.
Ungolfed:
fonte
cd
. Nesse caso,f=readdir()[]
seria ainda mais curto.MATLAB,
5046 bytesObrigado ao @Suever por remover 4 bytes e pelos testes!
Testado no OS X El Capitan e Debian Jessie, ambos com a versão R2014a do Matlab.
No Windows,
'f'
é necessário um sinalizador (e='.m';x=mfilename;movefile([x e],[flip(x) e]),'f'
) para alterar o nome do arquivo enquanto o arquivo está sendo usado.Como funciona
fonte
'f'
é necessário?Ruby, 24 bytes
Bastante auto-explicativo. (
$0
é o nome do arquivo que está sendo executado.)Execute com
ruby whatever
um diretório de trabalho do diretório que contém o arquivo.fonte
Lote, 109 bytes
Nota 1: Os arquivos em lote devem terminar em
.bat
; pressupõe-se que o arquivo em lotes seja executado por seu nome sem extensão e que.bat
não seja revertido. Por exemplo,reverse
tentaria renomearreverse.bat
paraesrever.bat
.Nota 2:
CMD.EXE
erros após renomear o arquivo em lotes. (COMMAND.COM
não seria, exceto que é incapaz de manipulação de string em primeiro lugar.)Editar: salvou 2 bytes usando a garantia de que o nome do arquivo é alfabético (com base no comentário de @ CᴏɴᴏʀO'Bʀɪᴇɴ).
fonte
if ]%f% NEQ ] goto l
C, 102 bytes
Demolir:
Finalmente, um desafio em que C não é (tão irremediavelmente) não competitivo!
Se tomarmos "Você pode assumir o diretório de trabalho do shell será a pasta o arquivo está em" para significar que o programa vai ser sempre invocado como
./myexecutable
, podemos simplificar*n=strrchr(*v,47)
para*n=*v+1
salvar 10 caracteres, mas isso não é inteiramente válido ( pode ser invocado como././myexecutable
, por exemplo).Além disso, se você deseja manter uma extensão de arquivo (por exemplo, ".out") intacta, pode mudar
*t=strchr(b,0)
para*t=strrchr(b,46)
, custando 2 bytes. Não é necessário.fonte
rename
acontece se src == dest; parece que você satisfaz a restrição do palíndromo gratuitamente./
em um caso de canto?)oldpath
enewpath
existem links físicos referentes ao mesmo arquivo,rename()
nada faz e retorna um status de sucesso" - se as strings são idênticas, elas se referem ao mesmo arquivo.Vitsy + * sh, 15 bytes
Explicação
Observe que este envio deve usar a versão não segura do Vitsy (não pode ser feito no Try It Online!)
fonte
Perl 5, 18 bytes
Um pouco como o Ruby (run
perl nameofscript
):Levar em consideração um caminho possível é mais feio (47 bytes)
fonte
V ,
2926 bytesComo contém imprimíveis, aqui está um dump hexadecimal:
Nota: isso não será executado no v.tryitonline.net, pois o TIO não permite o acesso ao arquivo.
Explicação:
fonte
Python 3, 105 bytes
-Alex.A removeu 1 byte.
-O Trauma digital me mostrou os.rename (), que removeu 62 bytes.
-muddyfish removeu 7 bytes.
fonte
import
import os,sys;f=sys.argv[0];os.rename(f,f[::-1])
deve fazer o truque para 48 bytessys.argv[0]
apenas retorna o nome do arquivo apenas sem o caminho quando o script é executado diretamente. Helka indicado este é okPHP,
84,70, 54 bytesEDIT: removido 14 bytes graças a
insertusernamehere
nos comentáriosEDIT: removido 16 bytes graças a
Martijn
nos comentáriosfonte
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 bytes
fonte
Python 2 , 41 bytes
Demo no Bash.
O Python realmente não se importa com a extensão do arquivo, para que possamos virar o nome inteiro.
fonte
PHP, 31 bytes
Acho que não há muito a explicar:
fonte
Perl 6 ,
7027 bytesSe fosse necessário trabalhar em um diretório de trabalho diferente, você precisaria de algo como isto:
Como o diretório de trabalho será o mesmo do programa, ele pode ser simplificado para apenas:
Explicação:
fonte
JavaScript (Nó),
10810468 bytes36 bytes salvos, graças ao Downgoat!
Versão do Windows:
Outra versão:
fonte
js
no final do caminho do arquivo, precedido por um caractere. Isso sempre será um.
.JavaScript ES6 (Node.js) 70 bytes
Não Regex Yay!
Qualquer ajuda é apreciada
fonte
PowerShell v4 +, 68 bytes
Só funciona porque é garantido que o script esteja em um diretório por si só. Executa um
ls
(alias paraGet-ChildItem
) e obtém o.Name
(s) objeto (s) resultante (s). Nós armazenamos que, em$c
e, em seguida,-split
que no período literal para obter o nome do arquivo e extensão, e armazenar aqueles em$a
e$b
, respectivamente.A seguir, o comando
mv
(apelido paraMove-Item
), para o qual estamos indo$c
para$a
(revertido).$b
.Exemplo
fonte
Python (2.7 ou 3.4 ou superior),
6149 bytesAcredito que isso esteja próximo da solução ideal para Python:
Inspirado na
s4b3r6
resposta de, mas usa o fatiamento de lista em vez de reverso e salva__file__
em uma variável para salvar bytes ao usá-lo duas vezes.Nota: Isso pressupõe que o nome do arquivo seja sempre
*.py
. Uma solução um pouco mais genérica que possa lidar com qualquer extensão de arquivo de dois caracteres seriaa[-3:]
substituí-la".py"
, ao custo de 1 byte extra.Atualização: salvou 12 bytes usando o truque de fatiar lista
a[-4::-1]
para remover a extensão do arquivo, em vez de dividir e reverter coma.split(".")[0][::-1]
.fonte
Powershell, 112 bytes
Eu não vou vencer os cmds unix, apenas adicionando meus dois pence por diversão :-)
fonte
{}
ou adicionando 4 espaços antes do código.PowerShell, 50 bytes
Há apenas um arquivo, portanto, o
mv *
curinga do shell terá apenas um resultado. O nome do destino é o(ls).basename
que lista todos os arquivos (alias de 'dir'), chama a propriedade BaseName - e, como existe apenas um arquivo, o PowerShell descompacta a matriz de 1 item em uma sequência. Armazene esse nome de arquivo$f
e indexe-o com uma contagem regressiva e-join
os caracteres invertidos retornem para uma sequência. Adicione o.ps1
sufixo obrigatório .fonte
AutoIt, 45 bytes
fonte
Python 2.7, 68 bytes
Este é provavelmente o melhor que posso conseguir.Eu apenas me provei errado.fonte
Python (2 e 3),
8878 bytesExplora o fato de que o nome do arquivo é fornecido pelo sys.argv (como o diretório de trabalho é a pasta em que o arquivo está) e utiliza o os.rename. Irritantemente, o reverso retorna um iterador, então temos que usar a junção.
Editar: salvou 10 bytes usando __file__ em vez de sys.argv [0], conforme sugerido por @muddyfish para @DigitalTrauma.
fonte
tcl, 42
fonte
Script do Visual Basic, 44 bytes
Exemplo de saída para o arquivo chamado
reverse.vbs
(Executar com cscript):fonte
sfk , 83 bytes
Experimente online!
fonte
SmileBASIC 60 bytes
Alternativo:
fonte