거기에 있거나 광장입니다!


19

모든 사람들은 "있거나 정사각형"이라는 문구를 들었습니다. 그래서 도전 할 때가되었다고 생각했습니다.

입력

STDIN 또는 이와 동등한 것을 통해 입력되는 텍스트로 전체 절대 디렉토리 주소를 사용합니다.

산출

디렉토리 주소가 존재하고 유효하면 프로그램이 컴퓨터의 해당 폴더로 이동합니다. 그렇지 않은 경우 STDOUT 또는 다음과 같은 사각형을 통해 출력됩니다.

+-+
| |
+-+

요구 사항

  • 표준 허점은 허용되지 않습니다.
  • 피할 수없는 경우 후행 줄 바꿈 하나를 출력 할 수 있습니다.
  • 프로그램이 이동 된 경우 출력을 생성하지 않아야합니다.
  • 프로그램이 이동 된 곳 어디에서나 다시 실행할 수 있어야합니다.

가정

  • 입력이 비어 있지 않다고 가정 할 수 있습니다.
  • 디렉토리 끝에 파일 이름이 추가되지 않았다고 가정 할 수 있습니다.
  • 입력 디렉토리가 현재 디렉토리가 아니라고 가정 할 수 있습니다.
  • 어디서나 쓰고 실행할 수있는 권한이 있다고 가정 할 수 있습니다.

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.


파일 이름을 하드 코딩 할 수 있습니까?
BookOwl

예 @bookowl
FinW

경로에 파일 이름 ( c:\users\Joe\program.txt)이 포함되어 c:\users\Joe\ 있습니까 ( )? 후자의 경우 작성된 ​​파일의 이름이 소스와 같아야합니까?
Luis Mendo

@LuisMendo 당신은 디렉토리로만 입력으로 파일을 얻을 수 없습니다
FinW

@FinW 슬프게도, 여전히 내 질문에 대답하지 않았습니다. 만든 파일의 이름이 원본 파일과 같아야합니까?
Luis Mendo

답변:


1

Bash + coreutils, 43 42 바이트

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

이렇게하면 -n 플래그를 통해 후행 줄 바꿈을 인쇄하여 에코하지 않습니다.

"피할 수없는"경우 후행 줄 바꿈을 허용하여 OP가 무엇을 의미하는지 잘 모르겠습니다.

후행 줄 바꿈을 포함 할 수 있으면 변경하십시오.

echo -n '+-+

echo '+-+

총 39 바이트로 3 바이트를 절약 할 수 있습니다.


7

PowerShell , 59 62 61 60 바이트

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

온라인으로 사용해보십시오!

설명

PowerShell의 Move-Itemcmdlet ( mv)은 파일 이름도 바꾸므로 대상이 존재하지 않는 디렉터리를 제공하면 대상은 파일이 마지막 구성 요소 (부모가 존재하는 한)로 이름을 바꿉니다.

Test-Path대상이 존재하고 디렉토리인지 확인하는 데 사용할 수 있지만 너무 깁니다 Test-Path $d -PathT C.

대신 Get-ChildItem( ls)를 (단축) -Directory매개 변수 와 함께 사용 하고 $?성공했는지 확인 합니다. 출력이 지정되어 $z있으면 표시되지 않습니다.

즉, 다음의 부울 값을 갖는 배열로 인덱싱 2 개 요소 배열의 형태로 끝낼 $?로 합쳐질 것이다 0또는 1목적지 디렉토리가 존재하지 않으면 상기 제 배열 요소를 선택하므로, 둘째 그 경우 그렇습니다.

첫 번째 배열 요소는 상자를 포함하는 문자열입니다 (인용). 줄 바꿈은 여기에없는 경우에도 문자열로 허용됩니다. 두 번째 요소는 이동 명령이 포함 된 문자열입니다.

해당 어레이 선택의 결과는 Invoke-Expression( iex)로 파이프되어 실행됩니다. 이것은 배열에 실제 이동 명령을 그대로두기 때문에 필요합니다 (어레이를 채우기 위해) 무엇이든 상관없이 실행되므로 목적을 무효로합니다.


2
이것이 TIO에서 작동하지 않는 유일한 이유는 스크립트가 .code.tio.ps1아닌 이라고하기 때문 b.ps1입니다. 작동합니다. STDOUT에 약간의 출력이있는 것 같습니다. 그 원인을 잘 모르겠습니다.
Dennis

대단해! 길 잃은 출력은에서 왔으며 gci, 테스트 디렉토리에는 하위 항목이 포함되어 있지 않아서 결함이 드러났습니다. 출력을 지정하여 수정되었습니다. 감사합니다 @Dennis!
briantist

나는 다음 ls과 같이 짧은 축약어 라고 생각한다gci
dkudriavtsev

1
@wat duh, 확실합니다! 나는 ls항상 사용 하고 골프에서 잊어 경향이 있습니다. 감사합니다.
briantist

좋은. $?여기 골프에서 처음 본 것 같아요 .
AdmBorkBork

5

옥타브, 60 57 52 바이트

@Stewie 덕분에 8 바이트 절약

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

이것은라는 파일 내에있는 스크립트입니다 f.m. 실행되면 파일을 이동할 폴더를 묻는 메시지가 표시됩니다. 폴더가 존재하지 않고 이동 작업이 실패하면 movefile반환 false(또는 0) 그렇지 않으면 반환 true(또는 1). 인 경우 falsestring을 표시합니다 "+-+\n| |\n+-+".



4

배치, 80 바이트

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

배치 파일이 실행 중일 때 배치 파일을 이동하면 배치가 마음에 들지 않으므로 배치 파일 %1\%~nx0의 새 이름 인 배치 를 호출 하면 배치가 이전 배치 파일을 찾지 않습니다.


4

Bash + coreutils, 54 바이트

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

충분히 간단합니다. 첫 번째 인수가 존재하는지 확인하기 위해 테스트를 수행합니다. 존재하는 경우 프로그램이 자체를 인수로 이동하고 그렇지 않으면 사각형을 인쇄합니다.

Windows에서는 작동하지 않지만 Windows / WSL의 Ubuntu에서 Bash에서는 작동합니다. 드라이브 문자를 사용하지는 않지만 그것이 명확하다고 생각합니다.

이 계정은 Mendeleev가 소유합니다.


echo -n후행 줄 바꿈을 인쇄하지 않도록 해야한다고 생각합니다 .
Mitchell Spector 2012 년

1

파이썬 3, 71 바이트

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

파일 이름이어야합니다 f

상당히 간단합니다. STDIN에 제공된 디렉토리로 이동하려고 시도하며 오류가 발생하면 상자를 인쇄합니다.


0

C 137 바이트

#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 버전 :

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

f파일 이름을 z수락하고 디렉토리 이름을 승인합니다. 대상 문자열은 z및 의 연결입니다 f. rename()파일을 새 위치로 이동하는 데 사용됩니다.

이것은 main()다음과 같습니다

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

어떻게 든 단축 할 수 있습니다!


0

루비, 58 + 12 = 70 바이트

flags를 사용합니다 -nrfileutils. 입력은 개행없이 파일에서 STDIN으로 파이프됩니다.

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

0

Minecraft ComputerCraft 루아 , 74 바이트

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

파일 이름은 "f"로 하드 코딩됩니다. 게임 내 컴퓨터에서 실행되며 해당 컴퓨터의 디렉토리 구조를 기준으로 실행됩니다. CC Lua의 내장 fsAPI를 사용합니다.

언 골프 드 :

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.