Будьте там або будьте квадратними!


19

Усі чули фразу "будь там чи будь квадрат". Тому я подумав, що настав час для виклику з цього приводу.

Вхідні дані

Ви отримаєте повну абсолютну адресу каталогів як текст у вигляді введення через STDIN або еквівалент.

Вихідні дані

Якщо адреса каталогів існує і є дійсною, ваша програма перейде сама до цієї папки на вашому комп'ютері. Якщо ні, то він виведе через STDOUT або еквівалент наступний квадрат:

+-+
| |
+-+

Вимоги

  • Стандартні лазівки заборонені.
  • Якщо неминуче, ви можете вивести один простий новий рядок.
  • Ваша програма не повинна видавати вихід, якщо вона була переміщена.
  • Ваша програма повинна мати можливість запускатися знову, куди б вона не була переміщена.

Припущення

  • Ви можете припустити, що вхід ніколи не порожній.
  • Ви можете припустити, що до каталогу ніколи не додано ім’я файлу до кінця.
  • Ви можете припустити, що каталог вводу ніколи не є поточним.
  • Ви можете припустити, що у вас є дозволи на запис та виконання скрізь.

Це , тому найкоротша відповідь у байтах виграє.


Чи можемо ми жорстко кодувати ім'я файлу?
BookOwl

Так @bookowl ви можете
FinW

Чи включає ім'я файлу ( c:\users\Joe\program.txt) чи ні ( c:\users\Joe\ )? В останньому випадку, чи має ім’я створеного файлу бути таким же, як джерело?
Луїс Мендо

@LuisMendo ви ніколи не отримаєте файл, оскільки введіть лише каталог
FinW

@FinW На жаль, ви все ще не відповіли на моє запитання: чи повинно ім'я створеного файлу бути таким же, як оригінальний файл?
Луїс Мендо

Відповіді:


1

Bash + coreutils, 43 42 байт

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

Це дозволяє уникнути друку нового рядка через прапор -n для відлуння.

Я не зовсім впевнений, що означає ОП, якщо дозволити прокладку нового рядка, якщо це "неминуче".

Якщо прийнятне включення нового рядка, змініть його

echo -n '+-+

до

echo '+-+

і збережіть 3 байти, загалом 39 байт.


7

PowerShell , 59 62 61 60 байт

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

Спробуйте в Інтернеті!

Пояснення

Командлет PowerShell Move-Item( mv) також перейменовує файл, тож даючи йому каталог, який не існує як пункт призначення, просто перейменовує файл замість цього останнього компонента (доки існує батьківський), так що це було не добре.

Я міг Test-Pathби визначити, що пункт призначення є каталогом, але це занадто довго Test-Path $d -PathT C.

Тому замість цього я використовую Get-ChildItem( ls) параметр (укорочений) -Directoryі перевіряю, $?чи вдалося це зробити. Вихід, якщо такий є, призначений $zтак, щоб його не було видно.

Це робиться у вигляді масиву з двома елементами, потім індексується в масив із булевим значенням $?, яке буде зв'язано з 0або 1, тому перший елемент масиву вибирається, якщо каталог призначення не існує, а другий, якщо він робить.

Перший елемент масиву - це рядок, що містить поле (цитується); нові рядки дозволені в рядках, навіть якщо вони не є гередоками. Другий елемент - це рядок, що містить команду move.

Результат цього вибору масиву передається в Invoke-Expression( iex) для виконання. Це необхідно через те, що я просто залишаю фактичну команду переміщення в масиві, вона виконується незалежно від того, що (для заповнення масиву), що перемагає мету.


2
Єдина причина, що це не працює в TIO, це тому, що скрипт викликається .code.tio.ps1, а не b.ps1. Це працює. Здається, є якийсь бродячий вихід до STDOUT, хоча. Не впевнений, що це викликає.
Денніс

Нічого дивовижного! Можливий вихід з gciмоїх тестових каталогів не виявляв цього, оскільки вони не містили дочірніх предметів, тому це виявило цей недолік. Це тепер виправлено шляхом простого призначення результату. Дякую @Dennis!
британіст

Я думаю ls, що це скорочене скорочення дляgci
dkudriavtsev

1
@wat duh, це точно! Я 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. Не приймає лист з накопичувачем, проте я думаю, що це було уточнено, щоб це було нормально.

Цей рахунок належить Менделєєву.


Я думаю, що вам потрібно, echo -nщоб ви не надрукували зворотний новий рядок.
Мітчелл Спектор

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приймає ім'я каталогу. Рядок призначення є з'єднанням 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

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". Це працює на ігровому комп'ютері і працює відносно структури каталогів цього комп'ютера. Використовується вбудований fsAPI CC Lua .

Безголівки:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.