Soit tu viens, soit tu vaux rien!


19

Tout le monde a entendu la phrase «être là ou être carré». J'ai donc pensé qu'il était temps de se lancer un défi à ce sujet.

Contribution

Vous prendrez une adresse de répertoire absolue complète sous forme de texte en entrée via STDIN ou équivalent.

Production

Si l'adresse du répertoire existe et est valide, votre programme se déplacera lui-même dans ce dossier sur votre ordinateur. Sinon, il affichera via STDOUT ou l'équivalent le carré suivant:

+-+
| |
+-+

Exigences

  • Les failles standard ne sont pas autorisées.
  • Vous pouvez sortir une seule nouvelle ligne de fin si cela est inévitable.
  • Votre programme ne doit produire aucune sortie s'il a été déplacé.
  • Votre programme doit pouvoir s'exécuter à nouveau là où il a été déplacé.

Hypothèses

  • Vous pouvez supposer que l'entrée n'est jamais vide.
  • Vous pouvez supposer que le répertoire n'a jamais de nom de fichier ajouté à la fin.
  • Vous pouvez supposer que le répertoire d'entrée n'est jamais celui en cours.
  • Vous pouvez supposer que vous avez les autorisations pour écrire et exécuter partout.

C'est le , donc la réponse la plus courte en octets l'emporte.


Pouvons-nous coder en dur le nom de fichier?
BookOwl

Oui @bookowl vous pouvez
Fin le

Le chemin inclut-il le nom de fichier ( c:\users\Joe\program.txt) ou non ( c:\users\Joe\ )? Dans ce dernier cas, le nom du fichier créé doit-il être le même que la source?
Luis Mendo

@LuisMendo vous n'obtiendrez jamais un fichier comme entrée seulement un répertoire
FinW

@FinW Malheureusement, vous n'avez toujours pas répondu à ma question: le nom du fichier créé doit-il être le même que le fichier d'origine?
Luis Mendo

Réponses:


1

Bash + coreutils, 43 42 octets

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

Cela évite d'imprimer la nouvelle ligne de fin via le drapeau -n pour faire écho.

Je ne suis pas tout à fait sûr de ce que signifie l'OP en autorisant une nouvelle ligne de fin si elle est "inévitable".

S'il est acceptable d'inclure une nouvelle ligne de fin, changez

echo -n '+-+

à

echo '+-+

et économisez 3 octets, pour un total de 39 octets.


7

PowerShell , 59 62 61 60 octets

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

Essayez-le en ligne!

Explication

La Move-Itemcmdlet ( mv) de PowerShell renomme également un fichier, donc lui donner un répertoire qui n'existe pas comme destination renomme simplement le fichier à ce dernier composant à la place (tant que le parent existe), donc ce n'était pas bon.

Je pourrais utiliser Test-Pathpour déterminer que la destination existe et est un répertoire, mais c'est trop long Test-Path $d -PathT C.

Au lieu de cela, j'utilise Get-ChildItem( ls) avec le -Directoryparamètre (raccourci) et vérifie $?si cela a réussi. La sortie, s'il y en a, est affectée à $zafin qu'elle ne soit pas vue.

Cela se fait sous la forme d'un tableau avec 2 éléments, puis l'indexation dans le tableau avec la valeur booléenne de $?, qui sera fusionnée en 0ou 1, donc le premier élément du tableau est choisi si le répertoire de destination n'existe pas, et le second s'il le Est-ce que.

Le premier élément du tableau est une chaîne contenant la boîte (citée); les sauts de ligne sont autorisés dans les chaînes, même lorsqu'ils ne sont pas des heredocs. Le deuxième élément est une chaîne contenant la commande de déplacement.

Le résultat de cette sélection de tableau est canalisé dans Invoke-Expression( iex) pour être exécuté. Ceci est nécessaire car je laisse juste la commande de déplacement réelle dans le tableau, elle est exécutée n'importe quoi (pour remplir le tableau), ce qui va à l'encontre du but.


2
La seule raison pour laquelle cela ne fonctionne pas sur TIO est que le script est appelé .code.tio.ps1, non b.ps1. Ça marche. Il semble cependant y avoir une sortie parasite vers STDOUT. Je ne sais pas ce qui cause cela.
Dennis

Wow génial! La sortie parasite venait de gci, mes répertoires de test ne montraient pas cela parce qu'ils ne contenaient aucun élément enfant, donc cela a révélé cette faille. Il est maintenant corrigé en affectant simplement la sortie. Merci @Dennis!
briantist

Je pense que lsc'est une abréviation plus courte pourgci
dkudriavtsev

1
@wat duh, c'est sûr! J'utilise lstout le temps et puis au golf j'ai tendance à l'oublier. Je vous remercie.
briantist

Agréable. Je pense que c'est la première fois que je vois $?du golf ici.
AdmBorkBork

5

Octave, 60 57 52 octets

8 octets économisés grâce à @Stewie

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

Il s'agit d'un script qui réside dans un fichier appelé f.m. Une fois exécuté, il invitera l'utilisateur du dossier à déplacer le fichier. Si le dossier n'existe pas et que l'opération de déplacement échoue, movefileretourne false(ou 0) sinon il retourne true(ou 1). Si c'est le cas false, nous affichons la chaîne "+-+\n| |\n+-+".



4

Lot, 80 octets

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

Batch ne l'aime pas si vous déplacez le fichier batch pendant son exécution, donc en invoquant %1\%~nx0(qui est le nouveau nom du fichier batch) Batch arrête de rechercher l'ancien fichier batch.


4

Bash + coreutils, 54 octets

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

Assez simple. Il fait un test pour voir si le premier argument existe, s'il existe le programme se déplace lui-même dans l'argument, sinon imprime le carré.

Ne fonctionne pas sur Windows, mais il fonctionne sur Bash sur Ubuntu sur Windows / WSL. Ne prend pas une lettre de lecteur, mais je pense que cela a été clarifié pour être OK.

Ce compte appartient à Mendeleev.


Je pense que vous avez besoin echo -npour ne pas imprimer de nouvelle ligne de fin.
Mitchell Spector le

1

Python 3, 71 octets

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

Il doit être dans un fichier nommé f

Assez simple. Il essaie de se déplacer dans le répertoire qui lui est donné sur STDIN, et si une erreur se produit, il imprime la boîte.


0

C 137 octets

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

Version non golfée:

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

faccepte le nom de fichier et zaccepte le nom du répertoire. La chaîne de destination est une concaténation de zet f. rename()est utilisé pour déplacer le fichier vers le nouvel emplacement.

Le main()ressemblerait à ceci:

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

Peut certainement raccourci en quelque sorte!


0

Ruby, 58 + 12 = 70 octets

Utilise des drapeaux -nrfileutils. L'entrée est acheminée depuis un fichier sans saut de ligne vers STDIN.

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

0

Minecraft ComputerCraft Lua , 74 octets

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

Le nom de fichier est codé en dur comme "f". Cela s'exécute sur un ordinateur en jeu et s'exécute par rapport à la structure de répertoires de cet ordinateur. Utilise l' fsAPI intégrée de CC Lua .

Non golfé:

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.