Jadilah di sana atau menjadi persegi!

19

Semua orang telah mendengar ungkapan "ada di sana atau menjadi persegi". Jadi saya pikir sudah waktunya untuk tantangan tentang hal itu.

Memasukkan

Anda akan mengambil alamat direktori absolut penuh sebagai teks sebagai input melalui STDIN atau yang setara.

Keluaran

Jika alamat direktori ada dan valid, program Anda akan memindahkan dirinya ke folder itu di komputer Anda. Jika tidak, itu akan dihasilkan melalui STDOUT atau setara dengan kuadrat berikut:

+-+
| |
+-+

Persyaratan

  • Celah standar tidak diijinkan.
  • Anda dapat mengeluarkan satu baris baru jika tidak dapat dihindari.
  • Program Anda harus tidak menghasilkan keluaran jika sudah dipindahkan.
  • Program Anda harus dapat dijalankan lagi di mana pun ia dipindahkan.

Asumsi

  • Anda dapat berasumsi bahwa input tidak pernah kosong.
  • Anda dapat menganggap direktori tersebut tidak pernah memiliki nama file yang ditambahkan sampai akhir.
  • Anda dapat mengasumsikan bahwa direktori input tidak pernah menjadi yang sekarang.
  • Anda mungkin menganggap Anda memiliki izin untuk menulis dan mengeksekusi di mana-mana.

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Baik
sumber
Bisakah kita hardcode nama file?
BookOwl
Ya @ bookowl Anda boleh
FinW
Apakah path menyertakan nama file ( c:\users\Joe\program.txt) atau tidak ( c:\users\Joe\ )? Dalam kasus terakhir, haruskah nama file yang dibuat sama dengan sumbernya?
Luis Mendo
@LuisMendo Anda tidak akan pernah mendapatkan file sebagai input hanya direktori
FinW
@FinW Sedihnya, Anda masih belum menjawab pertanyaan saya: haruskah nama file yang dibuat sama dengan file asli?
Luis Mendo

Jawaban:

1

Bash + coreutils, 43 42 byte

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

Ini untuk menghindari pencetakan baris tambahan melalui flag -n ke echo.

Saya tidak begitu yakin apa arti OP dengan mengizinkan baris baru tertinggal jika "tidak dapat dihindari".

Jika dapat diterima untuk menyertakan baris tambahan, ubah

echo -n '+-+

untuk

echo '+-+

dan simpan 3 byte, untuk total 39 byte.

Mitchell Spector
sumber
7

PowerShell , 59 62 61 60 byte

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

Cobalah online!

Penjelasan

Move-ItemCmdlet ( mv) PowerShell juga mengganti nama file, jadi memberikannya direktori yang tidak ada sebagai tujuan hanya mengganti nama file ke komponen terakhir itu (selama induknya ada), jadi itu tidak baik.

Saya dapat menggunakan Test-Pathuntuk menentukan bahwa tujuan itu ada dan merupakan direktori, tetapi terlalu panjang Test-Path $d -PathT C.

Jadi alih-alih saya menggunakan Get-ChildItem( ls) dengan -Directoryparameter (disingkat) , dan memeriksa $?untuk melihat apakah itu berhasil. Output jika ada ditugaskan $zsehingga tidak terlihat.

Itu dilakukan dalam bentuk array dengan 2 elemen, kemudian mengindeks ke dalam array dengan nilai boolean $?, yang akan digabung menjadi 0atau 1, jadi elemen array pertama dipilih jika direktori tujuan tidak ada, dan kedua jika tidak.

Elemen array pertama adalah string yang berisi kotak (dikutip); baris baru diizinkan dalam string, bahkan ketika itu bukan heredocs. Elemen kedua adalah string yang berisi perintah bergerak.

Hasil dari pemilihan array akan disalurkan ke Invoke-Expression( iex) untuk dieksekusi. Ini diperlukan karena saya hanya meninggalkan perintah move yang sebenarnya di array, ia dieksekusi tidak peduli apa (untuk mengisi array), yang mengalahkan tujuannya.

briantis
sumber
2
Satu-satunya alasan ini tidak berfungsi pada TIO adalah karena skrip dipanggil .code.tio.ps1, bukan b.ps1. Ini bekerja. Tampaknya ada beberapa keluaran menyimpang ke STDOUT. Tidak yakin apa penyebabnya.
Dennis
Wow Keren! Output yang keluar dari gci, direktori pengujian saya tidak menunjukkan itu karena mereka tidak mengandung item anak, jadi ini memperlihatkan kelemahan itu. Sudah diperbaiki sekarang dengan hanya menetapkan output. Terima kasih @Dennis!
briantis
Saya pikir lsadalah singkatan yang lebih pendek untukgci
dkudriavtsev
1
@ apa ya, tentu saja! Saya menggunakan lssemua waktu dan kemudian dalam golf saya cenderung melupakannya. Terima kasih.
briantis
Bagus. Saya pikir ini adalah pertama kalinya saya melihat $?golf digunakan di sini.
AdmBorkBork
5

Oktaf, 60 57 52 byte

8 byte disimpan berkat @Stewie

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

Ini adalah skrip yang hidup dalam file bernama f.m. Saat dijalankan, itu akan meminta pengguna untuk memindahkan folder ke file. Jika folder tidak ada dan operasi pemindahan gagal, maka movefilekembali false(atau 0) jika tidak mengembalikan true(atau 1). Jika itu false, kami menampilkan string "+-+\n| |\n+-+".

Suever
sumber
4

Batch, 80 byte

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

Batch tidak menyukainya jika Anda memindahkan file batch saat sedang berjalan, jadi dengan memanggil %1\%~nx0(yang merupakan nama baru file batch) Batch berhenti mencari file batch lama.

Neil
sumber
4

Bash + coreutils, 54 byte

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

Cukup sederhana. Itu melakukan tes untuk melihat apakah argumen pertama ada, jika ada program bergerak sendiri ke argumen, yang lain mencetak kuadrat.

Tidak bekerja di Windows, namun bekerja di Bash di Ubuntu di Windows / WSL. Tidak mengambil huruf drive, namun saya pikir sudah diklarifikasi baik-baik saja.

Akun ini dimiliki oleh Mendeleev.

Tes Aplikasi Stack Exchange
sumber
Saya pikir Anda perlu echo -nagar Anda tidak mencetak baris tambahan.
Mitchell Spector
1

Python 3, 71 byte

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

Itu harus dalam file bernama f

Cukup sederhana. Ia mencoba untuk memindahkan dirinya ke direktori apa pun yang diberikan padanya di STDIN, dan jika terjadi kesalahan ia mencetak kotak.

BookOwl
sumber
0

C 137 byte

#include<dirent.h> g(char *f,char *z){DIR* d=opendir(z);if(d){strcat(z,f);rename(f,z);}else{puts("+-+");puts("| |");puts("+-+");}}

Versi tidak disatukan:

#include<dirent.h> 
g(char *f,char *z)
{ 
  DIR* d=opendir(z);
  if(d)
  {
    strcat(z,f);
    rename(f,z);
  }
  else
  {
    puts("+-+");
    puts("| |");
    puts("+-+");
  }
}

fmenerima nama file dan zmenerima nama direktori. String tujuan adalah gabungan dari zdan f. rename()digunakan untuk memindahkan file ke lokasi baru.

The main()akan terlihat seperti ini:

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

Pasti bisa dipersingkat entah bagaimana!

Abel Tom
sumber
0

Ruby, 58 + 12 = 70 byte

Menggunakan bendera -nrfileutils. Input disalurkan dari file tanpa baris baru ke STDIN.

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

Minecraft ComputerCraft Lua , 74 byte

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

Nama file dikodekan sebagai "f". Ini berjalan pada komputer dalam gim dan berjalan relatif terhadap struktur direktori komputer itu. Menggunakan fsAPI bawaan Lua CC .

Tidak Disatukan:

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
sumber