En un solo archivo, escriba un programa que no requiera entrada y no produzca salida. Cuando se ejecuta, debe invertir el nombre del archivo que contiene, independientemente de cuál sea el nombre , sin alterar el código ni producir otros efectos secundarios duraderos.
Cualquier forma de lograr esto está bien. Solo importa que una vez que se ejecute el programa, el único cambio duradero sea que su nombre de archivo se haya revertido. por ejemplo, no deben estar nuevos archivos en el directorio.
Ejecutar el programa nuevamente debería revertir el nombre. De hecho, el programa debería poder ejecutarse arbitrariamente muchas veces.
Para los propósitos de este desafío:
- Puede suponer que los nombres de archivo son siempre cadenas de letras minúsculas (az) entre 1 y 127 caracteres de longitud. (Si su idioma requiere que los archivos tengan extensiones para ejecutarse, simplemente invierta la parte anterior a la extensión, por ejemplo,
mycode.bat
→edocym.bat
). - Puede suponer que el archivo de código está en un directorio por sí mismo, por lo que no tendrá conflictos de nombres (excepto consigo mismo).
- Es posible que no asume el nombre de archivo no es un palíndromo, es decir, la misma cuando se invierte. Los nombres de archivo que son palíndromos deberían funcionar tan bien como los que no lo son.
- Puede leer los contenidos o metadatos de su archivo. No hay restricciones de quine aquí.
- Puede suponer que su programa se ejecutará en un sistema operativo particular, moderno y común (por ejemplo, Windows / Linux), ya que no todos los shells tienen el mismo conjunto de comandos.
Como ejemplo concreto, supongamos que tiene un programa Python en un archivo llamado
mycode
en su propio directorio. Corriendopython mycode
en el terminal debe dar como resultado que se invierta el nombre del archivo
edocym
. El archivoedocym
debe estar solo en su directorio; ya nomycode
debe existir ningún archivo con el nombre . Corriendopython edocym
revertirá el nombre nuevamente
mycode
, en cuyo punto el proceso puede repetirse indefinidamente.Si se cambió el nombre del mismo archivo de Python
racecar
(sin cambiar el código) y luego se ejecutapython racecar
nada debería cambiar visiblemente ya que el "auto de carreras" es un palíndromo. Lo mismo ocurre si el nombre de archivo fuera, digamos,
a
oxx
.
El código más corto en bytes gana. Tiebreaker es la respuesta más votada.
fuente
Respuestas:
Bash + utilidades comunes de Linux, 13 bytes
Mi método es similar al de @ DigitalTrauma pero un poco más corto debido a la tubería con
ls
:fuente
C #, 153 bytes
OO es genial y todo hasta que tenga una variable definida:
System.Reflection.Assembly.GetExecutingAssembly (). ManifestModule.Name
eso solo significa
fuente
Bash + utilidades comunes de Linux, 15
Asume que el script está en un directorio por sí mismo.
fuente
$0
se puede reemplazar con*
.$0
lugar de la última*
.<<<
.Julia, 51 bytes
Este programa debería ser independiente del sistema operativo, aunque solo se probó en OS X.
Sin golf:
fuente
cd
. En este casof=readdir()[]
sería aún más corto.MATLAB,
5046 bytes¡Gracias a @Suever por eliminar 4 bytes y por las pruebas!
Probado en OS X El Capitan y Debian Jessie, ambos con la versión R2014a de Matlab.
En Windows
'f'
se necesita un indicador (e='.m';x=mfilename;movefile([x e],[flip(x) e]),'f'
) para cambiar el nombre del archivo mientras se está utilizando el archivo.Cómo funciona
fuente
'f'
se requiere?Rubí, 24 bytes
Bastante autoexplicativo. (
$0
es el nombre del archivo que se está ejecutando).Ejecute con
ruby whatever
un directorio de trabajo del directorio que contiene el archivo.fuente
Lote, 109 bytes
Nota 1: los archivos por lotes deben terminar en
.bat
; se supone que el archivo por lotes se ejecuta por su nombre sin extensión y que.bat
no se debe revertir. Por ejemplo,reverse
intentaría cambiar el nombrereverse.bat
aesrever.bat
.Nota 2:
CMD.EXE
errores después de cambiar el nombre del archivo por lotes. (COMMAND.COM
no, excepto que es incapaz de manipular cuerdas en primer lugar)Editar: se guardaron 2 bytes utilizando la garantía de que el nombre del archivo es alfabético (según el comentario de @ CᴏɴᴏʀO'Bʀɪᴇɴ).
fuente
if ]%f% NEQ ] goto l
C, 102 bytes
Descompostura:
¡Finalmente un desafío donde C no es (tan desesperadamente) poco competitivo!
Si tomamos "Se puede suponer el directorio de trabajo de la cáscara será la carpeta del archivo está en" el sentido de que el programa siempre será invocado como
./myexecutable
, podemos simplificar*n=strrchr(*v,47)
a*n=*v+1
ahorrar 10 caracteres, pero esto no es del todo válida ( podría invocarse como././myexecutable
, por ejemplo).Además, si desea mantener una extensión de archivo (por ejemplo, ".out") intacta, puede cambiar
*t=strchr(b,0)
a*t=strrchr(b,46)
, con un costo de 2 bytes. Aunque no es obligatorio.fuente
rename
hace si src == dest; parece que satisfaces la restricción del palíndromo de forma gratuita./
en un caso de esquina?)oldpath
ynewpath
hay enlaces duros existentes que se refieren al mismo archivo,rename()
no hace nada y devuelve un estado de éxito" - si las cadenas son idénticas, se refieren al mismo archivo.Vitsy + * sh, 15 bytes
Explicación
Tenga en cuenta que esta presentación debe utilizar la versión no segura de Vitsy (¡no se puede hacer en Pruébelo en línea!)
fuente
Perl 5, 18 bytes
Un poco como el Ruby (ejecutar
perl nameofscript
):Tener en cuenta una posible ruta es más feo (47 bytes)
fuente
V ,
2926 bytesComo esto contiene elementos no imprimibles, aquí hay un volcado hexadecimal:
Nota: esto no se ejecutará en v.tryitonline.net ya que TIO no permite el acceso a archivos.
Explicación:
fuente
Python 3, 105 bytes
-Alex.A eliminado 1 byte.
-Digital Trauma me mostró os.rename () que eliminó 62 bytes.
-muddyfish eliminó 7 bytes.
fuente
import
import os,sys;f=sys.argv[0];os.rename(f,f[::-1])
debería hacer el truco para 48 bytessys.argv[0]
solo devuelve el nombre del archivo solo sin la ruta cuando el script se ejecuta directamente. Helka indicó que esto está bienPHP
84,7054 bytesEDITAR: eliminado 14 bytes gracias a
insertusernamehere
en los comentariosEDITAR: eliminado 16 bytes gracias a
Martijn
en los comentariosfuente
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
fuente
Python 2 , 41 bytes
Demo en Bash.
Python realmente no le importa la extensión del archivo, por lo que podemos voltear todo el nombre del archivo.
fuente
PHP, 31 bytes
No hay mucho que explicar, supongo:
fuente
Perl 6 ,
7027 bytesSi necesitara trabajar en un directorio de trabajo diferente, necesitaría algo como esto:
Dado que el directorio de trabajo será el mismo directorio que el programa, puede simplificarse simplemente:
Explicación:
fuente
JavaScript (Node),
10810468 bytes36 bytes guardados, gracias a Downgoat!
Versión de Windows:
Otra versión:
fuente
js
al final de la ruta del archivo, precedido por un personaje. Esto siempre será a.
.JavaScript ES6 (Node.js) 70 Bytes
No Regex Yay!
Cualquier ayuda es apreciada
fuente
PowerShell v4 +, 68 bytes
Solo funciona porque se garantiza que el script esté en un directorio por sí solo. Realiza un
ls
(alias paraGet-ChildItem
) y toma el.Name
de los objetos resultantes. Lo almacenamos en$c
y luego-split
en un período literal para obtener el nombre de archivo y la extensión, y los almacenamos en$a
y$b
, respectivamente.El siguiente es el comando
mv
(alias paraMove-Item
), donde nos estamos moviendo$c
a$a
(invertido).$b
.Ejemplo
fuente
Python (2.7 o 3.4+),
6149 bytesCreo que esto está cerca de la solución óptima de Python:
Inspirado por
s4b3r6
la respuesta de, pero usa el corte de la lista en lugar del reverso, y guarda__file__
en una variable para guardar bytes cuando lo usa dos veces.Nota: Esto supone que el nombre del archivo es siempre
*.py
. Una solución un poco más genérica que pueda manejar cualquier extensión de archivo de dos caracteres sería usara[-3:]
para reemplazar".py"
, al costo de 1 byte adicional.Actualización: se guardaron 12 bytes usando el truco de corte de lista
a[-4::-1]
para eliminar la extensión del archivo, en lugar de dividir y luego revertir cona.split(".")[0][::-1]
.fuente
Powershell, 112 bytes
No voy a superar los cmds de Unix, solo agrego mis dos peniques por diversión :-)
fuente
{}
, o agregando 4 espacios antes de su código.PowerShell, 50 bytes
Solo hay un archivo, por lo que el
mv *
comodín de shell solo tendrá un resultado. El nombre de destino es el(ls).basename
que enumera todos los archivos (alias para 'dir'), solicita la propiedad BaseName, y dado que solo hay un archivo, PowerShell desempaquetará la matriz de 1 elemento en una cadena. Almacene ese nombre de archivo$f
, luego indexe con una cuenta regresiva y-join
los caracteres invertidos vuelvan a formar una cadena. Agregue el.ps1
sufijo obligatorio .fuente
AutoIt, 45 bytes
fuente
Python 2.7, 68 bytes
Esto es probablemente lo mejor que puedo conseguir.Solo demostré que estaba equivocado.fuente
Python (2 y 3),
8878 bytesExplota el hecho de que sys.argv proporciona el nombre de archivo (ya que el directorio de trabajo es la carpeta en la que se encuentra el archivo) y utiliza os.rename. Molesto, invertido devuelve un iterador, por lo que tenemos que usar join.
Editar: Guardado 10 bytes usando __file__ en lugar de sys.argv [0], como lo sugiere @muddyfish a @DigitalTrauma.
fuente
tcl, 42
fuente
Script de Visual Basic, 44 bytes
Ejemplo de salida para el archivo llamado
reverse.vbs
(Ejecutar con cscript):fuente
sfk , 83 bytes
Pruébalo en línea!
fuente
SmileBASIC 60 bytes
Alternativa:
fuente