そこにいるか、正方形に!


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フラグを使用して末尾の改行を出力することを回避できます。

「避けられない」場合に末尾の改行を許可することで、OPの意味がよくわかりません。

末尾の改行を含めることが許容される場合は、変更します

echo -n '+-+

echo '+-+

合計39バイトの3バイトを節約します。


7

PowerShell59 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-ChildItemls)を使用し、成功したかどうか-Directoryを確認$?しています。出力が存在する場合は、出力が割り当てられる$zため、表示されません。

これは、2つの要素を持つ配列の形式で行われます。次に、ブール値の配列にインデックスを付けます$?。これは、0または1に合体するため、宛先ディレクトリが存在しない場合は最初の配列要素が選択され、します。

最初の配列要素は、ボックス(引用符付き)を含む文字列です。改行は、ヒアドキュメントではない場合でも文字列で許可されます。2番目の要素は、moveコマンドを含む文字列です。

その配列選択の結果は、実行されるInvoke-Expressioniex)にパイプされます。これが必要なのは、実際の移動コマンドを配列に残しただけで、何が実行されても(配列にデータを入力するために)実行されるため、目的に反するためです。


2
TIOでこれが機能しない唯一の理由は、スクリプトが呼び出されるためであり、スクリプトでは.code.tio.ps1ないためb.ps1です。これは動作します。ただし、STDOUTへのいくつかの迷走出力があるようです。何が原因なのか分かりません。
デニス

うわ〜すごい!迷子の出力はからのものでしたgciが、テストディレクトリには子アイテムが含まれていなかったため、テストディレクトリには表示されませんでした。出力を割り当てるだけで修正されました。ありがとう@Dennis!
briantist


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 +-+)

実行中にバッチファイルを移動すると、バッチはそれを気に入らないので、%1\%~nx0(バッチファイルの新しい名前である)を呼び出すことにより、バッチは古いバッチファイルの検索を停止します。


4

Bash + coreutils、54バイト

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

簡単です。最初の引数が存在するかどうかをテストし、存在する場合はプログラムが引数に移動し、そうでない場合は正方形を出力します。

Windowsでは動作しませんが、Windows / WSL上のUbuntuのBashでは動作します。ドライブレターを受け取らないが、それはOKであると明確にされたと思う。

このアカウントはメンデレーエフが所有しています。


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

ルビー、58 + 12 = 70バイト

flagsを使用し-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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.