Cai dentro ou cai fora!


19

Todo mundo já ouviu falar da frase "esteja lá ou seja quadrado". Então eu pensei que era hora de um desafio sobre isso.

Entrada

Você receberá um endereço de diretório absoluto completo como texto e entrada via STDIN ou equivalente.

Resultado

Se o endereço do diretório existir e for válido, seu programa se moverá para essa pasta no seu computador. Caso contrário, ele produzirá via STDOUT ou equivalente o seguinte quadrado:

+-+
| |
+-+

Exigências

  • As brechas padrão não são permitidas.
  • Você pode gerar uma única linha nova à direita, se inevitável.
  • Seu programa não deve produzir saída se tiver sido movido.
  • Seu programa deve poder executar novamente onde quer que tenha sido movido.

Suposições

  • Você pode assumir que a entrada nunca está vazia.
  • Você pode supor que o diretório nunca tenha um nome de arquivo anexado ao final.
  • Você pode supor que o diretório de entrada nunca seja o atual.
  • Você pode assumir que tem permissão para escrever e executar em qualquer lugar.

Isso é , então a resposta mais curta em bytes vence.


Podemos codificar o nome do arquivo?
precisa saber é o seguinte

Sim @bookowl você pode
FinW

O caminho inclui o nome do arquivo ( c:\users\Joe\program.txt) ou não ( c:\users\Joe\ )? Neste último caso, o nome do arquivo criado deve ser o mesmo que a origem?
Luis Mendo

@LuisMendo você nunca receberá um arquivo como entrada apenas em um diretório
FinW

@ Finin Infelizmente, você ainda não respondeu à minha pergunta: o nome do arquivo criado deve ser o mesmo que o arquivo original?
Luis Mendo

Respostas:


1

Bash + coreutils, 43 42 bytes

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

Isso evita a impressão da nova linha à direita através do sinalizador -n para ecoar.

Não sei bem o que significa o OP, permitindo uma nova linha à direita, se for "inevitável".

Se for aceitável incluir uma nova linha à direita, altere

echo -n '+-+

para

echo '+-+

e salve 3 bytes, para um total de 39 bytes.


7

PowerShell , 59 62 61 60 bytes

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

Experimente online!

Explicação

O Move-Itemcmdlet do PowerShell ( mv) também renomeia um arquivo, fornecendo a ele um diretório que não existe, pois o destino apenas renomeia o arquivo para o último componente (desde que o pai exista), o que não é bom.

Eu poderia usar Test-Pathpara determinar que o destino existe e é um diretório, mas é muito longo Test-Path $d -PathT C.

Então, em vez disso, estou usando Get-ChildItem( ls) com o -Directoryparâmetro (reduzido) e verificando $?se foi bem-sucedido. A saída, se houver alguma, é atribuída para $zque não seja vista.

Isso é feito na forma de uma matriz com 2 elementos e, em seguida, é indexada na matriz com o valor booleano de $?, que será coalescido em 0ou 1, portanto, o primeiro elemento da matriz é escolhido se o diretório de destino não existir e o segundo se ele faz.

O primeiro elemento da matriz é uma sequência que contém a caixa (entre aspas); novas linhas são permitidas em strings, mesmo quando não são heredocs. O segundo elemento é uma sequência que contém o comando move.

O resultado dessa seleção de matriz é canalizado para Invoke-Expression( iex) para ser executado. Isso é necessário porque, apenas deixei o comando de movimentação real na matriz, ele é executado independentemente do que (preencher a matriz), o que anula o objetivo.


2
A única razão pela qual isso não funciona no TIO é porque o script é chamado .code.tio.ps1, não b.ps1. Isso funciona. Parece haver alguma saída perdida para STDOUT. Não tenho certeza do que causa isso.
Dennis

Wow fantástico! A saída perdida era de gci, meus diretórios de teste não exibiam isso porque não continham itens filhos, então isso expunha essa falha. É corrigido agora, apenas atribuindo a saída. Obrigado @Dennis!
Briantist

Eu acho que lsé uma abreviação mais curta paragci
dkudriavtsev

11
@ wat duh, com certeza é! Eu uso lso tempo todo e depois no golfe eu tendem a esquecê-lo. Obrigado.
Briantist

Agradável. Eu acho que é a primeira vez que eu vejo isso $?aqui no golfe.
AdmBorkBork 25/01

5

Oitava, 60 57 52 bytes

8 bytes salvos graças a @Stewie

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

Este é um script que vive dentro de um arquivo chamado f.m. Quando executada, solicita ao usuário que a pasta mova o arquivo para. Se a pasta não existir e a operação de movimentação falhar, movefileretornará false(ou 0) caso contrário, retornará true(ou 1). Se for false, exibimos a string "+-+\n| |\n+-+".



4

Lote, 80 bytes

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

O lote não gosta se você mover o arquivo em lotes enquanto está em execução; portanto, invoque %1\%~nx0(que é o novo nome do arquivo em lotes) o lote para de procurar o arquivo em lotes antigo.


4

Bash + coreutils, 54 bytes

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

Simples o suficiente. Ele faz um teste para verificar se o primeiro argumento existe, se o programa se move para o argumento, caso contrário, imprime o quadrado.

Não funciona no Windows, no entanto, funciona no Bash no Ubuntu no Windows / WSL. Não leva uma letra de unidade, no entanto, acho que foi esclarecido para estar OK.

Esta conta é de propriedade de Mendeleev.


Acho que você precisa echo -npara não imprimir uma nova linha à direita.
Mitchell Spector

1

Python 3, 71 bytes

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

Ele deve estar em um arquivo chamado f

Relativamente simples. Ele tenta se mover para qualquer diretório que lhe seja dado no STDIN e, se ocorrer um erro, ele imprime a caixa.


0

C 137 bytes

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

Versão não destruída:

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

faceita o nome do arquivo e zaceita o nome do diretório. A cadeia de destino é uma concatenação de ze f. rename()é usado para mover o arquivo para o novo local.

O main()seria assim:

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

Definitivamente pode ser reduzido de alguma forma!


0

Ruby, 58 + 12 = 70 bytes

Usa sinalizadores -nrfileutils. A entrada é canalizada de um arquivo sem novas linhas para o STDIN.

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

0

Minecraft ComputerCraft Lua , 74 bytes

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

O nome do arquivo é codificado como "f". Isso é executado em um computador no jogo e é executado em relação à estrutura de diretórios do computador. Usa a fsAPI incorporada do 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.