Bądź tam lub bądź kwadratowy!

19

Wszyscy słyszeli o wyrażeniu „bądź tam albo bądź kwadratowy”. Pomyślałem więc, że nadszedł czas na wyzwanie.

Wejście

Weź absolutny adres katalogu jako tekst jako dane wejściowe przez STDIN lub równoważny.

Wynik

Jeśli adres katalogu istnieje i jest prawidłowy, program przeniesie się do tego folderu na komputerze. Jeśli nie, wyświetli za pośrednictwem STDOUT lub odpowiednika następującego kwadratu:

+-+
| |
+-+

Wymagania

  • Standardowe luki są niedozwolone.
  • Możesz wygenerować jeden końcowy znak nowej linii, jeśli jest to nieuniknione.
  • Twój program nie może generować danych wyjściowych, jeśli został przeniesiony.
  • Twój program musi być w stanie uruchomić się ponownie, gdziekolwiek został przeniesiony.

Założenia

  • Możesz założyć, że dane wejściowe nigdy nie są puste.
  • Możesz założyć, że do katalogu nigdy nie dołączono nazwy pliku na końcu.
  • Możesz założyć, że katalog wejściowy nigdy nie jest bieżący.
  • Możesz założyć, że masz uprawnienia do pisania i wykonywania wszędzie.

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

FinW
źródło
Czy możemy na stałe zakodować nazwę pliku?
BookOwl
Tak @bookowl, możesz
FinW
Czy ścieżka zawiera nazwę pliku ( c:\users\Joe\program.txt), czy nie ( c:\users\Joe\ )? Czy w drugim przypadku nazwa utworzonego pliku musi być taka sama jak nazwa źródła?
Luis Mendo,
@LuisMendo nigdy nie dostaniesz pliku jako wejścia tylko do katalogu
FinW
@FinW Niestety, nadal nie odpowiedziałeś na moje pytanie: czy nazwa utworzonego pliku musi być taka sama jak oryginalny plik?
Luis Mendo

Odpowiedzi:

1

Bash + coreutils, 43 42 bajty

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

Pozwala to uniknąć drukowania końcowego znaku nowej linii za pomocą flagi -n do echa.

Nie jestem do końca pewien, co oznacza OP, pozwalając końcowemu znakowi nowej linii, jeśli jest to „nieuniknione”.

Jeśli dopuszczalne jest dodanie końcowego znaku nowej linii, zmień

echo -n '+-+

do

echo '+-+

i zapisz 3 bajty, w sumie 39 bajtów.

Mitchell Spector
źródło
7

PowerShell , 59 62 61 60 bajtów

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

Wypróbuj online!

Wyjaśnienie

Polecenie Move-Itemcmdlet ( mv) programu PowerShell również zmienia nazwę pliku, więc nadanie mu katalogu, który nie istnieje, ponieważ miejsce docelowe po prostu zmienia nazwę pliku na ostatni komponent (o ile istnieje element nadrzędny), więc nie było dobrze.

Mógłbym użyć Test-Pathdo ustalenia, czy miejsce docelowe istnieje i jest katalogiem, ale jest za długie Test-Path $d -PathT C.

Zamiast tego używam Get-ChildItem( ls) z parametrem (skróconym) -Directoryi sprawdzam, $?czy się udało. Dane wyjściowe, jeśli takie istnieją, są przypisane, aby $znie były widoczne.

Odbywa się to w postaci tablicy z 2 elementami, a następnie indeksowania do tablicy o wartości logicznej $?, która zostanie połączona z 0lub 1, więc pierwszy element tablicy jest wybierany, jeśli katalog docelowy nie istnieje, a drugi, jeśli on nie istnieje robi.

Pierwszy element tablicy jest ciągiem zawierającym pole (cytowane); znaki nowej linii są dozwolone w ciągach, nawet jeśli nie są heredokami. Drugi element to ciąg znaków zawierający polecenie przenoszenia.

Wynik tego wyboru tablicy jest przesyłany do Invoke-Expression( iex) w celu wykonania. Jest to konieczne, ponieważ po prostu zostawiam rzeczywistą komendę move w tablicy, jest ona wykonywana bez względu na wszystko (aby zapełnić tablicę), co nie spełnia celu.

briantist
źródło
2
Jedynym powodem, dla którego to nie działa w TIO, jest to, że skrypt jest wywoływany .code.tio.ps1, a nie b.ps1. To działa Wygląda jednak na to, że do STDOUT dochodzi jakiś zbłąkany wynik. Nie jestem pewien, co to powoduje.
Dennis
Łał fantastycznie! Zbłąkane dane wyjściowe pochodziły z gcimoich katalogów testowych, ale nie wykazywały tego, ponieważ nie zawierały żadnych elementów potomnych, więc to ujawniło tę wadę. Zostało to teraz naprawione przez przypisanie wyjścia. Dzięki @Dennis!
briantist
Myślę, że lsjest to krótszy skrótgci
dkudriavtsev
1
@wat duh, na pewno jest! Używam lscały czas, a potem w golfa zapominam o tym. Dziękuję Ci.
briantist
Ładny. Myślę, że po raz pierwszy grałem $?tutaj w golfa.
AdmBorkBork
5

Oktawa, 60 57 52 bajtów

8 bajtów zapisanych dzięki @Stewie

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

To jest skrypt, który znajduje się w pliku o nazwie f.m. Po uruchomieniu poprosi użytkownika o folder do przeniesienia pliku. Jeśli folder nie istnieje, a operacja przenoszenia nie powiedzie się, movefilezwraca false(lub 0) w przeciwnym razie zwraca true(lub 1). Jeśli tak false, wyświetlamy ciąg "+-+\n| |\n+-+".

Suever
źródło
4

Partia, 80 bajtów

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

Batch nie podoba się, jeśli przenosisz plik wsadowy w trakcie działania, więc przez wywołanie %1\%~nx0(która jest nową nazwą pliku wsadowego) Batch przestaje szukać starego pliku wsadowego.

Neil
źródło
4

Bash + coreutils, 54 bajty

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

Wystarczająco proste. Wykonuje test, aby sprawdzić, czy pierwszy argument istnieje, jeśli istnieje, program przenosi się do argumentu, w przeciwnym razie drukuje kwadrat.

Nie działa w systemie Windows, jednak działa w Bash na Ubuntu w systemie Windows / WSL. Nie wymaga litery napędu, ale myślę, że wyjaśniono, że jest OK.

To konto jest własnością Mendelejewa.

Test aplikacji stosu wymiany
źródło
Myślę, że potrzebujesz echo -n, aby nie drukować końcowego nowego wiersza.
Mitchell Spector
1

Python 3, 71 bajtów

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

Musi znajdować się w pliku o nazwie f

Dość proste. Próbuje przenieść się do dowolnego podanego mu katalogu na STDIN, a jeśli wystąpi błąd, drukuje to pole.

BookOwl
źródło
0

C 137 bajtów

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

Wersja bez golfa:

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

fakceptuje nazwę pliku i zakceptuje nazwę katalogu. Ciąg docelowy jest połączeniem zi f. rename()służy do przeniesienia pliku do nowej lokalizacji.

Wyglądałoby main()to tak:

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

Zdecydowanie jakoś skrócić!

Abel Tom
źródło
0

Rubin, 58 + 12 = 70 bajtów

Używa flag -nrfileutils. Dane wejściowe są przesyłane z pliku bez znaków nowej linii do STDIN.

FileUtils.mv$0,File.exist?($_)&&$_ rescue$><<"+-+
| |
+-+"
Wartość tuszu
źródło
0

Minecraft ComputerCraft Lua , 74 bajty

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

Nazwa pliku jest zakodowana na stałe jako „f”. Działa na komputerze w grze i działa względem struktury katalogów tego komputera. Używa wbudowanego fsinterfejsu API CC Lua .

Nie golfowany:

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
pizzapanty184
źródło