Будь там или сам дурак!

19

Все слышали о фразе "будь там или будь квадратным". Поэтому я подумал, что пришло время испытать это.

вход

Вы будете использовать полный абсолютный адрес каталога как текст как ввод через STDIN или эквивалентный.

Выход

Если адрес каталога существует и является действительным, ваша программа переместится в эту папку на вашем компьютере. Если нет, он выведет через STDOUT или эквивалентный следующий квадрат:

+-+
| |
+-+

Требования

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

Предположения

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

Это , поэтому выигрывает самый короткий ответ в байтах.

FinW
источник
Можем ли мы жестко закодировать имя файла?
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 для вывода.

Я не совсем уверен, что означает OP, допуская завершающий символ новой строки, если он «неизбежен».

Если допустимо включить завершающий перевод новой строки, измените

echo -n '+-+

в

echo '+-+

и сохранить 3 байта, всего 39 байтов.

Митчелл Спектор
источник
7

PowerShell , 59 62 61 60 байт

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

Попробуйте онлайн!

объяснение

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

Я мог бы использовать, Test-Pathчтобы определить, что место назначения существует и является каталогом, но это слишком долго Test-Path $d -PathT C.

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

Это делается в виде массива с 2 элементами, затем выполняется индексация в массиве с логическим значением $?, которое будет объединено с 0или 1, поэтому первый элемент массива выбирается, если каталог назначения не существует, и второй, если он делает.

Первый элемент массива представляет собой строку, содержащую поле (в кавычках); переводы строки разрешены в строках, даже если они не являются наследниками. Второй элемент - это строка, содержащая команду перемещения.

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

briantist
источник
2
Единственная причина, по которой это не работает в TIO, заключается в том, что скрипт вызывается .code.tio.ps1, а не b.ps1. Это работает Кажется, что есть какой-то случайный вывод в STDOUT. Не уверен, что вызывает это.
Денис
Вау, круто! Случайный вывод был из 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+-+".

Suever
источник
1
codegolf.stackexchange.com/a/107780/31516
Стьюи Гриффин
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. Буква диска не принимает, однако, я думаю, что это было уточнено, чтобы быть в порядке.

Этот аккаунт принадлежит Менделееву.

Тест приложения Stack Exchange
источник
Я думаю, что вам нужно, echo -nчтобы вы не печатали завершающий символ новой строки.
Митчелл Спектор
1

Python 3, 71 байт

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

Это должно быть в файле с именем f

Довольно просто. Он пытается переместиться в любой каталог, который ему дан на STDIN, и, если происходит ошибка, он печатает поле.

BookOwl
источник
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

Рубин, 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 .

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
pizzapants184
источник