Orada olun ya da kare olun!


19

Herkes "orada ya da kare" ifadesini duymuştur. Bu yüzden bu konuda bir meydan okuma zamanı geldiğini düşündüm.

Giriş

STDIN veya eşdeğeri üzerinden tam bir mutlak dizin adresini metin olarak girersiniz.

Çıktı

Dizin adresi varsa ve geçerliyse, programınız kendisini bilgisayarınızdaki bu klasöre taşır. Değilse, STDOUT veya eşdeğeri aşağıdaki kareyle gönderilir:

+-+
| |
+-+

Gereksinimler

  • Standart boşluklara izin verilmez.
  • Kaçınılmazsa, tek bir satırsonu çıktısı alabilirsiniz.
  • Programınız taşınmışsa çıktı üretmemelidir.
  • Programınız taşındığı her yerde yeniden çalışabilmelidir.

Varsayımlar

  • Girişin asla boş olmadığını varsayabilirsiniz.
  • Dizinin sonuna sonuna bir dosya adı eklenmediğini varsayabilirsiniz.
  • Girdi dizininin hiçbir zaman geçerli dizin olmadığını varsayabilirsiniz.
  • Her yere yazma ve yürütme izniniz olduğunu varsayabilirsiniz.

Bu , bayt en kısa cevap kazanır.


Dosya adını kodlayabilir miyiz?
BookOwl

Evet @bookowl
FinW

Yol dosya adını ( c:\users\Joe\program.txt) içeriyor mu ( ) değil c:\users\Joe\ mi? İkinci durumda, oluşturulan dosyanın adı kaynak ile aynı mı olmalıdır?
Luis Mendo

@LuisMendo asla sadece bir dizin girdi olarak bir dosya alacaksınız
FinW

@FinW Maalesef sorumu hala cevaplamadınız: oluşturulan dosyanın adı orijinal dosya ile aynı olmalı mı?
Luis Mendo

Yanıtlar:


1

Bash + coreutils, 43 42 bayt

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

Bu, son satırın -n bayrağı aracılığıyla yankılanmasını sağlar.

Eğer "kaçınılmaz" ise takip eden bir yeni hatta izin vererek OP'nin ne anlama geldiğinden emin değilim.

Sondaki bir satırsonu eklemek kabul edilebilirse,

echo -n '+-+

için

echo '+-+

ve toplam 39 bayt için 3 bayt kaydedin.


7

PowerShell , 59 62 61 60 bayt

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

Çevrimiçi deneyin!

açıklama

PowerShell'in Move-Itemcmdlet ( mv) öğesi de bir dosyayı yeniden adlandırır; bu nedenle, hedef olarak varolmayan bir dizin vermek, dosyayı yalnızca bu son bileşene yeniden adlandırır (üst öğe olduğu sürece), bu da iyi değildi.

Test-PathHedefin var olduğunu ve bir dizin olduğunu belirlemek için kullanabilirsiniz , ancak çok uzun Test-Path $d -PathT C.

Bunun yerine , (kısaltılmış) parametresi ile Get-ChildItem( ls) kullanıyorum -Directoryve $?başarılı olup olmadığını kontrol ediyorum. Varsa çıktı $z, görünmemesi için atanır .

Bu, 2 öğeli bir dizi şeklinde yapılır, daha sonra boole değeriyle diziye endekslenir veya $?bu değer birleştirilir 0veya 1bu şekilde hedef dizini yoksa ilk dizi öğesi seçilir ve yapar.

İlk dizi elemanı kutuyu (alıntılanan) içeren bir dizedir; heredoc olmasa bile dizelerde yeni satırlara izin verilir. İkinci öğe, move komutunu içeren bir dizedir.

Bu dizi seçiminin sonucu çalıştırılacak Invoke-Expression( iex) haline getirilir . Bu sadece dizide gerçek hareket komutunu bıraktığım için gereklidir, amacı (diziyi doldurmak için) ne olursa olsun yürütülür.


2
Komut denir çünkü bu TIO çalışmıyor tek nedeni .code.tio.ps1değil b.ps1. Bu işe yarıyor. Yine de STDOUT için başıboş bir çıktı var gibi görünüyor. Buna neyin sebep olduğundan emin değilim.
Dennis

Vay harika! Kaçak çıktı, gcitest dizinlerim alt öğe içermedikleri için bunu sergilemedi, bu yüzden bu kusur ortaya çıktı. Şimdi çıktıyı atayarak düzeltildi. Teşekkürler @Dennis!
Briantist

Bence lsdaha kısa bir kısaltmagci
dkudriavtsev

1
@wat duh, kesinlikle! Her lszaman kullanıyorum ve sonra golfte unutmaya eğilimliyim. Teşekkür ederim.
Briantist

Güzel. Bence burada ilk kez $?golf yaparken gördüm .
AdmBorkBork

5

Oktav, 60 57 52 bayt

@Stewie sayesinde 8 bayt kaydedildi

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

Bu, adlı bir dosya içinde yaşayan bir komut dosyasıdır f.m. Çalıştırıldığında, kullanıcıdan dosyayı taşıyacağı klasörü soracaktır. Klasör yoksa ve taşıma işlemi başarısız olursa, movefiledöndürür false(veya 0), aksi takdirde döndürür true(veya 1). Eğer öyleyse false, dizeyi gösteririz "+-+\n| |\n+-+".



4

Toplu, 80 bayt

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

Toplu iş dosyasını toplu iş dosyası olarak hareket ettirirseniz beğenmez, bu nedenle %1\%~nx0(toplu iş dosyasının yeni adıdır) Batch eski toplu iş dosyasını aramayı durdurur.


4

Bash + coreutils, 54 bayt

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

Yeterince basit. İlk argümanın var olup olmadığını görmek için bir test yapar, eğer varsa, program kendini argümana taşır, başka kareyi yazdırır.

Windows üzerinde çalışmaz, ancak Windows / WSL üzerinde Ubuntu üzerinde Bash üzerinde çalışır. Bir sürücü mektubu almaz, ancak bunun iyi olduğu netleştirildiğini düşünüyorum.

Bu hesabın sahibi Mendeleev.


Bence echo -n, sondaki bir satırsonu yazdırmamanız gerekiyor .
Mitchell Spector

1

Python 3, 71 bayt

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

Adlı bir dosyada olmalı f

Oldukça basit. Kendini STDIN'de kendisine verilen dizine taşımaya çalışır ve bir hata oluşursa kutuyu yazdırır.


0

C 137 bayt

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

Ungolfed sürümü:

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

fdosya zadını ve dizin adını kabul eder. Hedef dize bir birleştirme olduğunu zve f. rename(), dosyayı yeni konuma taşımak için kullanılır.

main()Bu şekilde görünecektir:

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

Kesinlikle bir şekilde kısaltılabilir!


0

Yakut, 58 + 12 = 70 bayt

Bayrakları kullanır -nrfileutils. Giriş, satırsonu olmayan bir dosyadan STDIN'a aktarılır.

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

0

Minecraft ComputerCraft Lua , 74 bayt

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

Dosya adı "f" olarak kodlanmıştır. Bu, oyun içi bir bilgisayarda çalışır ve o bilgisayarın dizin yapısına göre çalışır. CC Lua'nın yerleşik fsAPI'sını kullanır .

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.