不见不散!


19

每个人都听说过“存在或存在”一词。因此,我认为现在是应对这一挑战的时候了。

输入项

您将使用完整的绝对目录地址作为文本,通过STDIN或等效输入。

输出量

如果目录地址存在且有效,则程序将自身移动到计算机上的该文件夹。如果不是,它将通过STDOUT或等效的以下平方输出:

+-+
| |
+-+

要求

  • 不允许出现标准漏洞。
  • 如果不可避免,您可以输出一个尾随换行符。
  • 如果程序被移动,则它不会产生任何输出。
  • 您的程序无论移到何处都必须能够再次运行。

假设条件

  • 您可以假定输入永远不会为空。
  • 您可能会假设该目录永远不会在文件末尾附加文件名。
  • 您可以假设输入目录永远不是当前目录。
  • 您可能会假设您有权在任何地方编写和执行。

这是,因此最短答案以字节为单位。


我们可以对文件名进行硬编码吗?
BookOwl

是的@bookowl您可以
FinW

路径是否包含文件名(c:\users\Joe\program.txt)或不包含(c:\users\Joe\ )?在后一种情况下,创建的文件名是否必须与源名称相同?
路易斯·门多

@LuisMendo,您将永远不会获得仅作为目录输入的文件
FinW

@FinW可悲的是,您仍然没有回答我的问题:创建的文件名必须与原始文件名相同吗?
Luis Mendo

Answers:


1

Bash + coreutils,43个 42字节

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

这样可以避免通过-n标志打印尾随的换行符以回显。

我不太确定OP在允许的情况下允许尾随换行符是什么意思。

如果可以包含尾随换行符,请更改

echo -n '+-+

echo '+-+

并保存3个字节,总计39个字节。


7

PowerShell59 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-ChildItemls)与(shorted)-Directory参数一起使用,并检查$?其是否成功。如果有输出,则将其分配给$z它,以使其不可见。

是以包含2个元素的数组的形式完成的,然后使用布尔值索引到数组中,该布尔值$?将合并为01,因此如果目标目录不存在,则选择第一个数组元素,如果第二个元素则选择第二个数组元素做。

第一个数组元素是包含框(引号)的字符串;即使字符串不是heredocs,也可以在字符串中使用换行符。第二个元素是包含移动命令的字符串。

该数组选择的结果通过管道传递到Invoke-Expressioniex)中以执行。这是必要的,因为我只是将实际的move命令保留在数组中,所以无论执行什么操作(填充数组)都将执行该命令,这违背了目的。


2
在TIO上不起作用的唯一原因是因为调用了脚本.code.tio.ps1,而不是b.ps1可行。不过似乎有些杂散输出到STDOUT。不知道是什么原因造成的。
丹尼斯,

哇,真棒!杂散输出来自gci,我的测试目录未显示该错误,因为它们不包含任何子项,因此暴露了该缺陷。现在只需分配输出即可解决。谢谢@丹尼斯!
briantist

我认为lsgci
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)。如果是false,则显示字符串"+-+\n| |\n+-+"



4

批处理,80字节

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

如果在运行批处理文件时移动它,则Batch不喜欢它,因此通过调用%1\%~nx0(这是批处理文件的新名称),Batch停止寻找旧的批处理文件。


4

Bash + coreutils,54个字节

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

很简单。它进行测试以查看第一个参数是否存在,如果存在,则程序将自身移入该参数,否则打印正方形。

在Windows上不起作用,但是在Windows / WSL上的Ubuntu上的Bash上工作。不带驱动器号,但是我认为已经确定可以。

此帐户由Mendeleev拥有。


我认为您需要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接受目录名。目标字符串的串联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 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.