Sei dabei oder sei quadratisch!

19

Jeder hat von der Phrase "dort sein oder quadratisch sein" gehört. Also dachte ich, es sei Zeit für eine Herausforderung.

Eingang

Sie nehmen eine vollständige absolute Verzeichnisadresse als Text als Eingabe über STDIN oder eine gleichwertige Adresse.

Ausgabe

Wenn die Verzeichnisadresse existiert und gültig ist, verschiebt sich Ihr Programm in diesen Ordner auf Ihrem Computer. Wenn nicht, wird über STDOUT oder gleichwertig das folgende Quadrat ausgegeben:

+-+
| |
+-+

Bedarf

  • Standardlücken sind nicht zulässig.
  • Sie können eine einzelne nachgestellte Zeile ausgeben, wenn dies unvermeidbar ist.
  • Ihr Programm darf keine Ausgabe erzeugen, wenn es verschoben wurde.
  • Ihr Programm muss wieder ausgeführt werden können, egal wohin es verschoben wurde.

Annahmen

  • Sie können davon ausgehen, dass die Eingabe niemals leer ist.
  • Sie können davon ausgehen, dass an das Verzeichnis niemals ein Dateiname angehängt wurde.
  • Sie können davon ausgehen, dass das Eingabeverzeichnis niemals das aktuelle ist.
  • Sie können davon ausgehen, dass Sie Berechtigungen zum Schreiben und Ausführen überall haben.

Das ist , also gewinnt die kürzeste Antwort in Bytes.

FinW
quelle
Können wir den Dateinamen fest codieren?
BookOwl
Ja @bookowl können Sie
FinW
Enthält der Pfad den Dateinamen ( c:\users\Joe\program.txt) oder nicht ( c:\users\Joe\ )? Muss im letzteren Fall der Name der erstellten Datei mit dem Namen der Quelle übereinstimmen?
Luis Mendo
@ LuisMendo erhalten Sie nie eine Datei als Eingabe nur ein Verzeichnis
FinW
@FinW Leider haben Sie meine Frage immer noch nicht beantwortet: Muss der Name der erstellten Datei mit dem Namen der Originaldatei übereinstimmen?
Luis Mendo

Antworten:

1

Bash + Coreutils, 43 42 Bytes

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

Auf diese Weise wird vermieden, dass die nachgestellte Newline über das Flag -n zum Echo ausgegeben wird.

Ich bin mir nicht ganz sicher, was das OP bedeutet, wenn es "unvermeidlich" ist, eine nachgestellte Zeile zuzulassen.

Wenn es akzeptabel ist, eine nachgestellte Zeile einzufügen, ändern Sie diese

echo -n '+-+

zu

echo '+-+

und sparen Sie 3 Bytes für insgesamt 39 Bytes.

Mitchell Spector
quelle
7

PowerShell , 59 62 61 60 Byte

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

Probieren Sie es online!

Erläuterung

Das PowerShell- Move-ItemCmdlet ( mv) benennt eine Datei ebenfalls um. Wenn Sie ein Verzeichnis angeben , das nicht als Ziel existiert, wird die Datei stattdessen in die letzte Komponente umbenannt (sofern die übergeordnete Komponente vorhanden ist).

Ich könnte Test-Pathfeststellen, dass das Ziel existiert und ein Verzeichnis ist, aber es ist zu lang Test-Path $d -PathT C.

Also benutze ich stattdessen Get-ChildItem( ls) mit dem (verkürzten) -DirectoryParameter und überprüfe $?, ob es erfolgreich war. Der Ausgang, falls vorhanden, wird zugewiesen, $zdamit er nicht gesehen wird.

Dies geschieht in Form eines Arrays mit 2 Elementen und anschließender Indizierung in das Array mit dem booleschen Wert von $?, der zu 0oder verschmolzen 1wird. Das erste Array-Element wird also ausgewählt, wenn das Zielverzeichnis nicht vorhanden ist, und das zweite, wenn es vorhanden ist tut.

Das erste Array-Element ist eine Zeichenfolge, die die Box enthält (in Anführungszeichen gesetzt). Zeilenumbrüche sind in Strings erlaubt, auch wenn sie keine Heredocs sind. Das zweite Element ist eine Zeichenfolge, die den Befehl move enthält.

Das Ergebnis dieser Array-Auswahl wird zur Ausführung an Invoke-Expression( iex) übergeben. Dies ist notwendig, weil ich nur den eigentlichen Befehl move im Array belasse, er wird ausgeführt, egal was (um das Array zu füllen), was den Zweck zunichte macht.

Briantist
quelle
2
Der einzige Grund, warum dies bei TIO nicht funktioniert, ist, dass das Skript aufgerufen wird .code.tio.ps1, nicht b.ps1. Das funktioniert. Es scheint jedoch einige Streuausgaben für STDOUT zu geben. Nicht sicher, was das verursacht.
Dennis
Wow super! Die Streuausgabe stammte von gci, meine Testverzeichnisse wiesen dies nicht auf, da sie keine untergeordneten Elemente enthielten, sodass dies diesen Fehler aufdeckte. Es wird jetzt behoben, indem nur der Ausgang zugewiesen wird. Vielen Dank @Dennis!
Briantist
Ich denke, lsist eine kürzere Abkürzung fürgci
dkudriavtsev
1
@wat duh, ist es sicher! Ich benutze die lsganze Zeit und dann beim Golfen neige ich dazu, es zu vergessen. Vielen Dank.
Briantist
Nett. Ich denke, dies ist das erste Mal, dass ich $?hier Golfspielen gesehen habe.
AdmBorkBork
5

Oktave, 60 57 52 Bytes

8 Bytes gespart dank @Stewie

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

Dies ist ein Skript, das in einer Datei namens lebt f.m. Beim Ausführen wird der Benutzer aufgefordert, den Ordner anzugeben, in den die Datei verschoben werden soll. Wenn der Ordner nicht vorhanden ist und der Verschiebevorgang fehlschlägt, wird movefilezurückgegeben false(oder 0), andernfalls wird zurückgegeben true(oder 1). Wenn ja false, zeigen wir den String an "+-+\n| |\n+-+".

Suever
quelle
4

Batch, 80 Bytes

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

Batch gefällt nicht, wenn Sie die Batch-Datei während der Ausführung verschieben. Durch Aufrufen von %1\%~nx0(dies ist der neue Name der Batch-Datei) sucht Batch nicht mehr nach der alten Batch-Datei.

Neil
quelle
4

Bash + Coreutils, 54 Bytes

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

Einfach genug. Es führt einen Test durch, um festzustellen, ob das erste Argument vorhanden ist. Wenn es vorhanden ist, verschiebt sich das Programm in das Argument. Andernfalls wird das Quadrat gedruckt.

Funktioniert nicht unter Windows, jedoch unter Bash unter Ubuntu unter Windows / WSL. Nimmt keinen Laufwerksbuchstaben, aber ich denke, das wurde geklärt, um in Ordnung zu sein.

Dieser Account gehört Mendeleev.

Stack Exchange App Test
quelle
Ich denke, Sie müssen, echo -ndamit Sie keine nachgestellte Zeile drucken.
Mitchell Spector
1

Python 3, 71 Bytes

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

Es muss sich in einer Datei mit dem Namen befinden f

Relativ einfach. Es versucht, sich in das Verzeichnis zu verschieben, das ihm auf STDIN zugewiesen ist, und druckt die Box, wenn ein Fehler auftritt.

BookOwl
quelle
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("+-+");}}

Ungolfed-Version:

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

fAkzeptiert den Dateinamen und zden Verzeichnisnamen. Zielzeichenfolge ist eine Verkettung von zund f. rename()wird verwendet, um die Datei an den neuen Speicherort zu verschieben.

Das main()würde so aussehen:

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

Kann auf jeden Fall irgendwie verkürzt werden!

Abel Tom
quelle
0

Ruby, 58 + 12 = 70 Bytes

Verwendet Flags -nrfileutils. Die Eingabe wird aus einer Datei ohne Zeilenumbrüche in STDIN weitergeleitet.

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

Minecraft ComputerCraft Lua , 74 Bytes

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

Der Dateiname ist fest mit "f" codiert. Dies läuft auf einem In-Game-Computer und relativ zur Verzeichnisstruktur dieses Computers. Verwendet die integrierte fsAPI von 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
Pizzapants184
quelle