จะมีหรือเป็นสี่เหลี่ยม!


19

ทุกคนเคยได้ยินคำว่า "อยู่ที่นั่นหรือเป็นสี่เหลี่ยม" ดังนั้นฉันคิดว่าถึงเวลาแล้วที่จะต้องมีการท้าทาย

อินพุต

คุณจะใช้ที่อยู่ไดเรกทอรีสัมบูรณ์เต็มรูปแบบเป็นข้อความเป็นอินพุตผ่าน STDIN หรือเทียบเท่า

เอาท์พุต

หากที่อยู่ไดเรกทอรีมีอยู่และถูกต้องโปรแกรมของคุณจะย้ายตัวเองไปยังโฟลเดอร์นั้นในคอมพิวเตอร์ของคุณ ถ้าไม่มันจะออกผ่านทาง STDOUT หรือเทียบเท่าตารางต่อไปนี้:

+-+
| |
+-+

ความต้องการ

  • ช่องโหว่มาตรฐานไม่ได้รับอนุญาต
  • คุณสามารถส่งออกบรรทัดใหม่ต่อท้ายบรรทัดเดียวหากหลีกเลี่ยงไม่ได้
  • โปรแกรมของคุณต้องไม่สร้างเอาต์พุตถ้ามันถูกย้าย
  • โปรแกรมของคุณจะต้องสามารถทำงานได้อีกทุกที่ที่ถูกย้ายไป

สมมติฐาน

  • คุณอาจคิดว่าอินพุตไม่เคยว่างเปล่า
  • คุณอาจถือว่าไดเรกทอรีไม่มีชื่อไฟล์ต่อท้าย
  • คุณอาจคิดว่าไดเรกทอรีข้อมูลเข้านั้นไม่เคยเป็นไดเรกทอรีปัจจุบัน
  • คุณอาจถือว่าคุณมีสิทธิ์ในการเขียนและดำเนินการทุกที่

นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ


เราสามารถ hardcode ชื่อไฟล์ได้หรือไม่
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 เพื่อ echo

ฉันไม่แน่ใจว่า OP หมายถึงอะไรโดยการอนุญาตให้ขึ้นบรรทัดใหม่หากมัน "หลีกเลี่ยงไม่ได้"

หากเป็นที่ยอมรับที่จะรวมบรรทัดใหม่ต่อท้ายให้เปลี่ยน

echo -n '+-+

ถึง

echo '+-+

และบันทึก 3 ไบต์รวม 39 ไบต์


7

PowerShell , 59 62 61 60 ไบต์

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

ลองออนไลน์!

คำอธิบาย

Move-Itemcmdlet ของ PowerShell (mv ) เปลี่ยนชื่อไฟล์เช่นกันดังนั้นให้ไดเรกทอรีที่ไม่มีอยู่เนื่องจากปลายทางเพียงเปลี่ยนชื่อไฟล์เป็นองค์ประกอบสุดท้ายแทน (ตราบใดที่มีพาเรนต์) จึงไม่ดี

ฉันสามารถใช้Test-Pathเพื่อตรวจสอบว่าปลายทางมีอยู่และเป็นไดเรกทอรี Test-Path $d -PathT Cแต่มันนานเกินไป

ดังนั้นฉันจึงใช้Get-ChildItem( ls) พร้อม-Directoryพารามิเตอร์(สั้นลง) และตรวจสอบ$?เพื่อดูว่าสำเร็จหรือไม่ เอาท์พุทหากมีการใด ๆ ที่ได้รับมอบหมาย$zเพื่อที่จะไม่เห็น

เสร็จแล้วในรูปแบบของอาเรย์ที่มี 2 องค์ประกอบจากนั้นทำการจัดทำดัชนีในอาเรย์ด้วยค่าบูลีน$?ซึ่งจะรวมเข้าด้วยกัน0หรือ1ดังนั้นองค์ประกอบอาเรย์แรกจะถูกเลือกหากไม่มีไดเรกทอรีปลายทางและที่สองถ้ามัน ทำ.

องค์ประกอบอาร์เรย์แรกคือสตริงที่มีกล่อง (ที่ยกมา); ขึ้นบรรทัดใหม่ได้ในสายอักขระแม้ว่าจะไม่ใช่ heredocs ก็ตาม องค์ประกอบที่สองคือสตริงที่มีคำสั่งย้าย

ผลลัพธ์ของการเลือกอาร์เรย์นั้นจะถูกไพพ์ไปที่Invoke-Expression( iex) เพื่อดำเนินการ นี่เป็นสิ่งที่จำเป็นเพราะฉันเพิ่งปล่อยให้คำสั่งย้ายที่แท้จริงในอาเรย์มันจะถูกดำเนินการไม่ว่าอะไรจะเกิดขึ้น (เพื่อเติมอาเรย์) ซึ่งเอาชนะวัตถุประสงค์


2
เหตุผลเพียงแค่นี้ไม่ทำงานบน TIO เป็นเพราะสคริปต์ที่เรียกว่าไม่.code.tio.ps1 วิธีนี้ใช้ได้ผล ดูเหมือนว่าจะมีเอาต์พุตหลงทางไปยัง STDOUT ไม่แน่ใจว่าเป็นสาเหตุอะไร b.ps1
Dennis

ว้าวยอดเยี่ยม! เอาท์พุทหลงทางมาจากgciไดเรกทอรีทดสอบของฉันไม่ได้แสดงว่าเพราะพวกเขาไม่มีรายการเด็กดังนั้นสิ่งนี้เปิดเผยข้อบกพร่องที่ มันได้รับการแก้ไขแล้วเพียงแค่กำหนดเอาท์พุท ขอบคุณ @Dennis!
นักเทศน์

ฉันคิดว่าlsเป็นตัวย่อที่สั้นกว่าสำหรับgci
dkudriavtsev

1
@ วัดดูมันแน่ใจ! ฉันใช้lsตลอดเวลาและในการเล่นกอล์ฟฉันมักจะลืมมัน ขอขอบคุณ.
ต้มตุ๋น

ดี ฉันคิดว่านี่เป็นครั้งแรกที่ฉันเห็นการ$?เล่นกอล์ฟที่นี่
AdmBorkBork

5

อ็อกเทฟ, 60 57 52 ไบต์

บันทึก 8 ไบต์ด้วย @Stewie

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

f.mนี้เป็นสคริปต์ที่อาศัยอยู่ในไฟล์ที่เรียกว่า เมื่อเรียกใช้มันจะแจ้งให้ผู้ใช้สำหรับโฟลเดอร์ที่จะย้ายไฟล์ไป หากโฟลเดอร์ไม่มีอยู่และการดำเนินการย้ายล้มเหลวก็movefileจะส่งกลับfalse(หรือ0) มิฉะนั้นจะส่งคืนtrue(หรือ1) ถ้าเป็นเราจะแสดงสตริงfalse"+-+\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 แต่จะใช้งานได้บน Bash บน Ubuntu บน Windows / WSL ไม่ได้ใช้อักษรชื่อไดรฟ์ แต่ฉันคิดว่าได้รับการชี้แจงแล้วว่าใช้ได้

บัญชีนี้เป็นของ Mendeleev


ฉันคิดว่าคุณต้องการecho -nเพื่อที่คุณจะได้ไม่ต้องพิมพ์บรรทัดใหม่ขึ้นมา
Mitchell Spector

1

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

เวอร์ชันที่ไม่ถูกปรับแต่ง:

#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ยอมรับชื่อไดเรกทอรี สตริงปลายทางเป็นกำหนดการและzfrename()ถูกใช้เพื่อย้ายไฟล์ไปยังตำแหน่งใหม่

main()จะมีลักษณะเช่นนี้

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

สามารถสั้นลงได้อย่างแน่นอน!


0

Ruby, 58 + 12 = 70 ไบต์

-nrfileutilsธงใช้ อินพุตถูกไพพ์จากไฟล์โดยไม่มีบรรทัดใหม่ใน STDIN

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

0

Minecraft ComputerCraft Luaขนาด 74 ไบต์

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

ชื่อไฟล์นั้นเขียนด้วยรหัสว่า "f" สิ่งนี้จะทำงานบนคอมพิวเตอร์ในเกมและทำงานโดยสัมพันธ์กับโครงสร้างไดเรกทอรีของคอมพิวเตอร์นั้น ใช้ CC builtin fsAPI ของ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.