¡Estar allí o ser cuadrado!

19

Todo el mundo ha oído hablar de la frase "estar allí o ser cuadrado". Así que pensé que era hora de un desafío al respecto.

Entrada

Tomará una dirección de directorio absoluta completa como texto como entrada a través de STDIN o equivalente.

Salida

Si la dirección del directorio existe y es válida, su programa se moverá a esa carpeta en su computadora. De lo contrario, saldrá a través de STDOUT o equivalente al siguiente cuadrado:

+-+
| |
+-+

Requisitos

  • Las lagunas estándar no están permitidas.
  • Puede generar una nueva línea final si es inevitable.
  • Su programa no debe producir ningún resultado si se ha movido.
  • Su programa debe poder ejecutarse nuevamente donde sea que se haya movido.

Supuestos

  • Puede suponer que la entrada nunca está vacía.
  • Puede suponer que el directorio nunca tiene un nombre de archivo agregado al final.
  • Puede suponer que el directorio de entrada nunca es el actual.
  • Puede suponer que tiene permisos para escribir y ejecutar en todas partes.

Este es el , por lo que la respuesta más corta en bytes gana.

FinW
fuente
¿Podemos codificar el nombre del archivo?
BookOwl
Sí @bookowl puedes
FinW
¿La ruta incluye el nombre de archivo ( c:\users\Joe\program.txt) o no ( c:\users\Joe\ )? En el último caso, ¿el nombre del archivo creado debe ser el mismo que el de la fuente?
Luis Mendo
@LuisMendo nunca obtendrá un archivo como entrada solo un directorio
FinW
@FinW Lamentablemente, todavía no ha respondido a mi pregunta: ¿el nombre del archivo creado debe ser el mismo que el original?
Luis Mendo

Respuestas:

1

Bash + coreutils, 43 42 bytes

mv -t $1 $0 2> >(:)||echo -n '+-+
| |
+-+'

Esto evita imprimir la nueva línea final a través de la bandera -n para hacer eco.

No estoy muy seguro de lo que significa el OP al permitir una nueva línea final si es "inevitable".

Si es aceptable incluir una nueva línea al final, cambie

echo -n '+-+

a

echo '+-+

y guarde 3 bytes, para un total de 39 bytes.

Mitchell Spector
fuente
7

PowerShell , 59 62 61 60 bytes

$z=ls($d=$args)-di;('"+-+
| |
+-+"','mv b.ps1 "$d"')[$?]|iex

Pruébalo en línea!

Explicación

El Move-Itemcmdlet ( mv) de PowerShell también cambia el nombre de un archivo, por lo que darle un directorio que no existe como destino solo cambia el nombre del archivo a ese último componente (siempre que exista el padre), por lo que no fue bueno.

Podría usar Test-Pathpara determinar que el destino existe y es un directorio, pero es demasiado largo Test-Path $d -PathT C.

Entonces, en su lugar, estoy usando Get-ChildItem( ls) con el -Directoryparámetro (acortado) y comprobando $?si fue exitoso. La salida, si hay alguna, se asigna para $zque no se vea.

Eso se hace en forma de una matriz con 2 elementos, luego se indexa en la matriz con el valor booleano de $?, que se fusionará con 0o 1, por lo que el primer elemento de la matriz se elige si el directorio de destino no existe, y el segundo si hace.

El primer elemento de matriz es una cadena que contiene el cuadro (citado); las nuevas líneas están permitidas en cadenas, incluso cuando no son heredocs. El segundo elemento es una cadena que contiene el comando mover.

El resultado de esa selección de matriz se canaliza a Invoke-Expression( iex) para su ejecución. Esto es necesario porque solo dejo el comando de movimiento real en la matriz, se ejecuta sin importar qué (para llenar la matriz), lo que anula el propósito.

briantista
fuente
2
La única razón por la que esto no funciona en TIO es porque se llama al script .code.tio.ps1, no b.ps1. Esto funciona Sin embargo, parece haber una salida perdida a STDOUT. No estoy seguro de qué causa eso.
Dennis
¡Wow increible! La salida perdida era de gci, mis directorios de prueba no exhibieron eso porque no contenían elementos secundarios, por lo que esto expuso ese defecto. Ahora se soluciona simplemente asignando la salida. Gracias @ Dennis!
briantist
Creo que lses una abreviatura más corta paragci
dkudriavtsev
1
@wat duh, ¡seguro que lo es! Lo uso lstodo el tiempo y luego en el golf tiendo a olvidarlo. Gracias.
briantist
Agradable. Creo que esta es la primera vez que la veo $?en el golf aquí.
AdmBorkBork
5

Octava, 60 57 52 bytes

8 bytes guardados gracias a @Stewie

if~movefile('f.m',input(''))disp("+-+\n| |\n+-+")end

Este es un script que vive dentro de un archivo llamado f.m. Cuando se ejecute, solicitará al usuario la carpeta para mover el archivo. Si la carpeta no existe y la operación de mover falla, entonces movefiledevuelve false(o 0) de lo contrario, devuelve true(o 1). Si es así false, mostramos la cadena "+-+\n| |\n+-+".

Suever
fuente
4

Lote, 80 bytes.

@if not "%1"=="" move %0 %1\>nul 2>nul&&%1\%~nx0||(echo +-+&echo ^| ^|&echo +-+)

A Batch no le gusta si mueve el archivo por lotes mientras se está ejecutando, por lo que invocando %1\%~nx0(que es el nuevo nombre del archivo por lotes) Batch deja de buscar el archivo por lotes anterior.

Neil
fuente
4

Bash + coreutils, 54 bytes

if [ -d $1 ];then mv $0 $1;else echo "+-+
| |
+-+";fi

Suficientemente simple. Hace una prueba para ver si existe el primer argumento, si existe el programa se mueve al argumento, de lo contrario imprime el cuadrado.

No funciona en Windows, sin embargo, funciona en Bash en Ubuntu en Windows / WSL. No toma una letra de unidad, sin embargo, creo que se ha aclarado que está bien.

Esta cuenta es propiedad de Mendeleev.

Prueba de la aplicación de intercambio de pila
fuente
Creo que necesita echo -npara no imprimir una nueva línea final.
Mitchell Spector
1

Python 3, 71 bytes

from shutil import*
try:move('f',input())
except:print("+-+\n| |\n+-+")

Debe estar en un archivo llamado f

Bastante sencillo. Intenta moverse a cualquier directorio que se le dé en STDIN, y si ocurre un error, imprime el cuadro.

BookOwl
fuente
0

C 137 bytes

#include<dirent.h> g(char *f,char *z){DIR* d=opendir(z);if(d){strcat(z,f);rename(f,z);}else{puts("+-+");puts("| |");puts("+-+");}}

Versión sin golf:

#include<dirent.h> 
g(char *f,char *z)
{ 
  DIR* d=opendir(z);
  if(d)
  {
    strcat(z,f);
    rename(f,z);
  }
  else
  {
    puts("+-+");
    puts("| |");
    puts("+-+");
  }
}

facepta el nombre del archivo y zacepta el nombre del directorio. La cadena de destino es una concatenación de zy f. rename()se usa para mover el archivo a la nueva ubicación.

El main()se vería así:

int main(int argc, char *argv[])
{
    g(argv[0]+2,argv[1]); // 1st arg is the Destination string
    return 0;
},

Definitivamente se puede acortar de alguna manera!

Abel Tom
fuente
0

Ruby, 58 + 12 = 70 bytes

Banderas usos -nrfileutils. La entrada se canaliza desde un archivo sin líneas nuevas a STDIN.

FileUtils.mv$0,File.exist?($_)&&$_ rescue$><<"+-+
| |
+-+"
Tinta de valor
fuente
0

Minecraft ComputerCraft Lua , 74 bytes

if fs.isDir(...)then fs.move("f",... .."f")else print("+-+\n| |\n+-+")end

El nombre del archivo está codificado como "f". Esto se ejecuta en una computadora del juego y se ejecuta en relación con la estructura de directorios de esa computadora. Utiliza la fsAPI incorporada de CC Lua .

Sin golf:

local tArgs = { ... }      -- '...' is Lua's vararg syntax, similar to python's *args syntax
if fs.isDir(tArgs[1]) then -- Using '...' is like passing all args separately, extra args are usually ignored
    fs.move("file", tArgs[1] .. "file") -- '..' is Lua's string concatenation syntax
else
    print("+-+\n| |\n+-+") -- print the required output if the directory doesn't exist
end
pizzapants184
fuente