Hãy ở đó hoặc là hình vuông!


19

Mọi người đều đã nghe đến cụm từ "ở đó hoặc vuông". Vì vậy, tôi nghĩ rằng đã đến lúc cho một thách thức về nó.

Đầu vào

Bạn sẽ lấy một địa chỉ thư mục tuyệt đối đầy đủ dưới dạng văn bản làm đầu vào thông qua STDIN hoặc tương đương.

Đầu ra

Nếu địa chỉ thư mục tồn tại và hợp lệ, chương trình của bạn sẽ tự di chuyển đến thư mục đó trên máy tính của bạn. Nếu không, nó sẽ xuất qua STDOUT hoặc tương đương với hình vuông sau:

+-+
| |
+-+

Yêu cầu

  • Sơ hở tiêu chuẩn là không được phép.
  • Bạn có thể xuất một dòng mới duy nhất nếu không thể tránh khỏi.
  • Chương trình của bạn phải tạo ra không có đầu ra nếu nó đã được di chuyển.
  • Chương trình của bạn phải có khả năng chạy lại bất cứ nơi nào nó đã được di chuyển đến.

Giả định

  • Bạn có thể cho rằng đầu vào không bao giờ trống.
  • Bạn có thể cho rằng thư mục không bao giờ có tên tệp được nối vào cuối.
  • Bạn có thể cho rằng thư mục đầu vào không bao giờ là thư mục hiện tại.
  • Bạn có thể cho rằng bạn có quyền viết và thực thi ở mọi nơi.

Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.


Chúng tôi có thể mã hóa tên tập tin?
BookOwl

Có @bookowl bạn có thể
FinW

Đường dẫn có bao gồm tên tệp ( c:\users\Joe\program.txt) hay không ( c:\users\Joe\ )? Trong trường hợp sau, tên của tệp đã tạo phải giống với nguồn không?
Luis Mendo

@LuisMendo bạn sẽ không bao giờ nhận được tệp khi chỉ nhập vào một thư mục
FinW

@FinW Đáng buồn thay, bạn vẫn chưa trả lời câu hỏi của tôi: tên của tệp được tạo có giống với tệp gốc không?
Luis Mendo

Câu trả lời:


1

Bash + coreutils, 43 42 byte

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

Điều này tránh việc in dòng mới qua cờ -n để lặp lại.

Tôi không chắc chắn OP có nghĩa là gì khi cho phép một dòng mới theo dõi nếu điều đó "không thể tránh khỏi".

Nếu chấp nhận bao gồm một dòng mới, hãy thay đổi

echo -n '+-+

đến

echo '+-+

và lưu 3 byte, cho tổng số 39 byte.


7

PowerShell , 59 62 61 60 byte

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

Hãy thử trực tuyến!

Giải trình

Move-ItemLệnh cmdlet ( mv) của PowerShell cũng đổi tên một tệp, do đó, cung cấp cho nó một thư mục không tồn tại làm đích chỉ đổi tên tệp thành thành phần cuối cùng đó (miễn là cha mẹ tồn tại), vì vậy điều đó không tốt.

Tôi có thể sử dụng Test-Pathđể xác định rằng đích đến tồn tại và là một thư mục, nhưng nó quá dài Test-Path $d -PathT C.

Vì vậy, thay vào đó tôi đang sử dụng Get-ChildItem( ls) với -Directorytham số (rút ngắn) và kiểm tra $?xem nó có thành công hay không. Đầu ra nếu có bất kỳ được gán cho $znó không nhìn thấy.

Điều đó được thực hiện dưới dạng một mảng có 2 phần tử, sau đó lập chỉ mục vào mảng có giá trị boolean $?, sẽ được kết hợp thành 0hoặc 1, do đó, phần tử mảng đầu tiên được chọn nếu thư mục đích không tồn tại và thứ hai nếu nó làm.

Phần tử mảng đầu tiên là một chuỗi chứa hộp (trích dẫn); dòng mới được cho phép trong chuỗi, ngay cả khi chúng không phải là heredocs. Phần tử thứ hai là một chuỗi chứa lệnh di chuyển.

Kết quả của việc lựa chọn mảng đó được dẫn vào Invoke-Expression( iex) để được thực thi. Điều này là cần thiết bởi vì tôi chỉ để lại lệnh di chuyển thực tế trong mảng, nó được thực thi bất kể điều gì (để điền vào mảng), mà đánh bại mục đích.


2
Lý do duy nhất điều này không hoạt động trên TIO là vì tập lệnh được gọi .code.tio.ps1chứ không phải b.ps1. Điều này hoạt động. Dường như có một số đầu ra đi lạc đến STDOUT mặc dù. Không chắc chắn những gì gây ra điều đó.
Dennis

Wow tuyệt vời! Đầu ra đi lạc là từ gci, các thư mục thử nghiệm của tôi đã không thể hiện điều đó bởi vì chúng không chứa các mục con, vì vậy điều này đã phơi bày lỗ hổng đó. Bây giờ nó đã được sửa bằng cách chỉ định đầu ra. Cảm ơn @Dennis!
nghĩa quân phiệt

Tôi nghĩ lslà viết tắt ngắn hơn chogci
dkudriavtsev

1
@wat duh, chắc chắn là vậy! Tôi sử dụng lstất cả thời gian và sau đó trong golf tôi có xu hướng quên nó. Cảm ơn bạn.
nghĩa anh hùng

Tốt đẹp. Tôi nghĩ rằng đây là lần đầu tiên tôi thấy $?được sử dụng trong việc chơi golf ở đây.
admBorkBork

5

Octave, 60 57 52 byte

8 byte được lưu nhờ @Stewie

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

Đây là một tập lệnh sống trong một tập tin được gọi là f.m. Khi chạy, nó sẽ nhắc người dùng cho thư mục di chuyển tệp đến. Nếu thư mục không tồn tại và thao tác di chuyển thất bại, sau đó movefiletrả về false(hoặc 0) nếu không nó sẽ trả về true(hoặc 1). Nếu đó là false, chúng tôi hiển thị chuỗi "+-+\n| |\n+-+".



4

Mẻ, 80 byte

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

Batch không thích nó nếu bạn di chuyển tệp bó khi nó đang chạy, vì vậy bằng cách gọi %1\%~nx0(đó là tên mới của tệp bó) Batch dừng tìm kiếm tệp bó cũ.


4

Bash + coreutils, 54 byte

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

Đủ đơn giản. Nó thực hiện một thử nghiệm để xem nếu đối số đầu tiên tồn tại, nếu nó tồn tại, chương trình tự di chuyển vào đối số, khác in ra hình vuông.

Không hoạt động trên Windows, tuy nhiên nó hoạt động trên Bash trên Ubuntu trên Windows / WSL. Không có một ký tự ổ đĩa, tuy nhiên tôi nghĩ rằng đã được làm rõ là OK.

Tài khoản này thuộc sở hữu của Mendeleev.


Tôi nghĩ rằng bạn cần echo -nđể bạn không in một dòng mới.
Spector Mitchell

1

Python 3, 71 byte

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

Nó phải ở trong một tệp có tên f

Khá đơn giản. Nó cố gắng tự di chuyển đến bất kỳ thư mục nào được trao cho nó trên STDIN và nếu xảy ra lỗi, nó sẽ in hộp.


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

Phiên bản bị đánh cắp:

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

fchấp nhận tên tệp và zchấp nhận tên thư mục. Chuỗi đích là một nối của zf. rename()được sử dụng để di chuyển tệp đến vị trí mới.

Các main()sẽ trông như thế này:

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

Chắc chắn có thể rút ngắn bằng cách nào đó!


0

Ruby, 58 + 12 = 70 byte

Sử dụng cờ -nrfileutils. Đầu vào được dẫn từ một tệp không có dòng mới vào 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

Tên tệp được mã hóa cứng là "f". Cái này chạy trên một máy tính trong trò chơi và chạy tương đối với cấu trúc thư mục của máy tính đó. Sử dụng fsAPI dựng sẵn của CC Lua .

Ung dung:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.