Sii lì o sii quadrato!


19

Tutti hanno sentito parlare della frase "essere lì o essere quadrato". Quindi ho pensato che fosse giunto il momento di una sfida.

Ingresso

Prenderai un indirizzo di directory assoluto completo come testo come input tramite STDIN o equivalente.

Produzione

Se l'indirizzo della directory esiste ed è valido, il tuo programma si sposterà su quella cartella sul tuo computer. In caso contrario, verrà emesso tramite STDOUT o equivalente il seguente quadrato:

+-+
| |
+-+

Requisiti

  • Le scappatoie standard non sono ammesse.
  • È possibile generare una nuova riga finale se inevitabile.
  • Il tuo programma non deve produrre output se è stato spostato.
  • Il tuo programma deve poter essere eseguito di nuovo ovunque sia stato spostato.

ipotesi

  • Si può presumere che l'input non sia mai vuoto.
  • Si può presumere che alla directory non sia mai stato aggiunto un nome file fino alla fine.
  • Si può presumere che la directory di input non sia mai quella corrente.
  • Puoi presumere di disporre delle autorizzazioni per scrivere ed eseguire ovunque.

Questo è , quindi vince la risposta più breve in byte.


Possiamo hardcodificare il nome del file?
BookOwl

Sì, puoi prenotare
FinW,

Il percorso include il nome file ( c:\users\Joe\program.txt) o no ( c:\users\Joe\ )? In quest'ultimo caso, il nome del file creato deve essere lo stesso del sorgente?
Luis Mendo,

@LuisMendo non otterrai mai un file come input solo una directory
FinW

@FinW Purtroppo non hai ancora risposto alla mia domanda: il nome del file creato deve essere lo stesso del file originale?
Luis Mendo,

Risposte:


1

Bash + coreutils, 43 42 byte

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

Questo evita di stampare la nuova riga finale tramite il flag -n per l'eco.

Non sono del tutto sicuro di cosa significhi l'OP consentendo una nuova riga finale se è "inevitabile".

Se è accettabile includere una nuova riga finale, cambia

echo -n '+-+

per

echo '+-+

e salva 3 byte, per un totale di 39 byte.


7

PowerShell , 59 62 61 60 byte

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

Provalo online!

Spiegazione

Il Move-Itemcmdlet ( mv) di PowerShell rinomina anche un file, quindi assegnandogli una directory che non esiste in quanto la destinazione rinomina invece il file nell'ultimo componente (fintanto che esiste il genitore), quindi non andava bene.

Potrei usare Test-Pathper determinare che la destinazione esiste ed è una directory, ma è troppo lunga Test-Path $d -PathT C.

Quindi invece sto usando Get-ChildItem( ls) con il -Directoryparametro (abbreviato) e controllo $?per vedere se ha avuto successo. L'output se ce n'è è assegnato in $zmodo che non venga visto.

Questo viene fatto sotto forma di un array con 2 elementi, quindi indicizzato nell'array con il valore booleano di $?, a cui verrà coalizzato 0o 1, quindi il primo elemento dell'array viene scelto se la directory di destinazione non esiste e in secondo luogo se lo fa.

Il primo elemento dell'array è una stringa contenente la casella (citato); le nuove righe sono consentite nelle stringhe, anche quando non sono ereditate. Il secondo elemento è una stringa contenente il comando move.

Il risultato di quella selezione di array viene reindirizzato in Invoke-Expression( iex) per essere eseguito. Ciò è necessario perché lascio semplicemente il comando di spostamento effettivo nella matrice, viene eseguito indipendentemente da cosa (per popolare la matrice), che vanifica lo scopo.


2
L'unico motivo per cui questo non funziona su TIO è perché lo script viene chiamato .code.tio.ps1, non b.ps1. Questo funziona Tuttavia, sembra che ci sia un po 'di randagio verso STDOUT. Non sono sicuro di cosa sia la causa.
Dennis,

Wow fantastico! L'output vagava da gci, le mie directory di test non lo mostravano perché non contenevano elementi figlio, quindi questo ha rivelato quel difetto. Ora è stato risolto semplicemente assegnando l'output. Grazie @Dennis!
Briantist,

Penso che lssia un'abbreviazione più breve pergci
dkudriavtsev il

1
@wat duh, lo è di sicuro! Uso lstutto il tempo e poi nel golf tendo a dimenticarlo. Grazie.
Briantist,

Bello. Penso che questa sia la prima volta che ho visto $?usato nel golf qui.
AdmBorkBork,

5

Ottava, 60 57 52 byte

8 byte salvati grazie a @Stewie

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

Questo è uno script che vive all'interno di un file chiamato f.m. Quando eseguito, richiederà all'utente di spostare il file nella cartella. Se la cartella non esiste e l'operazione di spostamento non riesce, movefilerestituisce false(o 0) altrimenti restituisce true(o 1). Se lo è false, visualizziamo la stringa "+-+\n| |\n+-+".



4

Lotto, 80 byte

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

A Batch non piace se sposti il ​​file batch mentre è in esecuzione, quindi invocando %1\%~nx0(che è il nuovo nome del file batch) Batch interrompe la ricerca del vecchio file batch.


4

Bash + coreutils, 54 byte

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

Abbastanza semplice. Fa un test per vedere se esiste il primo argomento, se esiste il programma si sposta nell'argomento, altrimenti stampa il quadrato.

Non funziona su Windows, tuttavia funziona su Bash su Ubuntu su Windows / WSL. Non prende una lettera di unità, tuttavia penso che sia stato chiarito per essere OK.

Questo account è di proprietà di Mendeleev.


Penso che tu abbia bisogno in echo -nmodo da non stampare una nuova riga finale.
Mitchell Spector

1

Python 3, 71 byte

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

Deve essere in un file denominato f

Abbastanza semplice. Cerca di spostarsi in qualsiasi directory assegnata su STDIN e, se si verifica un errore, stampa la casella.


0

C 137 byte

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

Versione non golfata:

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

faccetta il nome file e zaccetta il nome della directory. La stringa di destinazione è una concatenazione di ze f. rename()viene utilizzato per spostare il file nella nuova posizione.

Il main()sarebbe simile a questo:

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

Può sicuramente abbreviato in qualche modo!


0

Rubino, 58 + 12 = 70 byte

Usa le bandiere -nrfileutils. L'input viene reindirizzato da un file senza nuove righe in STDIN.

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

0

Minecraft ComputerCraft Lua , 74 byte

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

Il nome file è codificato come "f". Questo viene eseguito su un computer in-game e viene eseguito relativamente alla struttura di directory di quel computer. Utilizza l' fsAPI integrata di CC Lua .

Ungolfed:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.