Hilf mir, die Box zu öffnen

33

Ich habe eine ASCII-Art-Box und benötige ein Programm, um sie zu öffnen.

Beispiele

Eingang:

-------
|     |
|_____|

Ausgabe:

      /
     /
    /
   /
  /
 /
/
|     |
|_____|

Spezifikation

  • Die erste Zeile besteht nur aus -mindestens 3 Zeilen
  • Die mittleren Zeilen beginnen mit |Leerzeichen und enden mit|
    • Alle mittleren Reihen sind gleich
  • Die letzte Zeile beginnt mit |haben _mit einem und beenden|
  • Alle Zeilen sind gleich lang

Öffnen der Box:

  • Jedes -sollte durch ein /in aufsteigender Linie und Position ersetzt werden.
Downgoat
quelle
2
Im Gegensatz zum Spiel "Shut the Box"?
Addison Crump
1
Husten
Addison Crump
28
Der Deckel wird beim Öffnen doppelt so lang? Na ja, Schuld ASCII-Kunst.
Darrel Hoffman
8
Was ist in der Box?
Williham Totland
2
Es gibt keinen funktionierenden Dolmetscher, also denke ich nicht. Spielt keine Rolle; Wenn ich den Dolmetscher mache (hoffentlich bald), werde ich die Antwort posten.
ETHproductions

Antworten:

7

CJam, 14 Bytes

l,{N'/@S*}%W%q

Probieren Sie es online!

Wie es funktioniert

l               Read the first line from STDIN.
 ,              Compute the line's length. Result: L
  {      }%     Map; for each I in [0 ... L-1]:
                  (implicit) Push I.
   N              Push a linefeed.
    '/            Push a slash.
      @           Rotate I on top of the stack.
       S*         Turn I into a string of I spaces.
           W%   Reverse the resulting array of strings and characters.
             q  Read the remaining input from STDIN.
Dennis
quelle
12

JavaScript ES6, 57 Byte

s=>s[r="replace"](/-+/,s=>s[r](/-/g,`
$'/`))[r](/-/g,' ')

Gibt eine führende Newline aus. Arbeiten Sie, indem Sie die Reihe von -s nehmen und sie in ein Dreieck umwandeln und dann das -s durch Leerzeichen ersetzen .

Bearbeiten: 5 Bytes dank @ edc65 gespeichert.

Neil
quelle
1
+1 Ich habe etwas Neues gelernt ($ '). Stattdessen kann dieser alte Trick 4 Bytes für Sie sparen:f=s=>s[R='replace'](/-+/,s=>s[R](/-/g,"\n$'/"))[R](/-/g,' ')
edc65
@ edc65 Danke, ich mache es tatsächlich 5 Bytes; Danke auch, dass du meinen Tippfehler behoben hast (wie du vielleicht vermutet hast, entwickle ich mit \nund konvertiere danach).
Neil
9

pb (NICHT KOMPETIEREND), 125 Bytes

^w[B!0]{>}w[B!45]{<w[B=10]{t[T+1]b[0]}}v[X]vw[T!0]{vb[124]<[X]b[124]>w[B=0]{>}t[T-1]}w[X!1]{<b[95]}<w[B!0]{^}w[Y!-1]{b[47]>^}

Die Version von pbi, die Sie zum Ausführen dieser Antwort benötigen, ist neuer als die Frage. Es hätte in älteren Versionen funktioniert, außer dass ich nie dazu gekommen bin, neue Zeilen in der Eingabe zuzulassen. Naja.

Zunächst wird die Höhe der Box durch Zählen der Zeilenumbrüche in der Eingabe bestimmt. Sobald es das weiß, geht es zur Y-Position auf der rechten Seite des Kastens, geht dort hinunter, wo es sein muss, zeichnet die Wände und den Boden und schließt mit dem Deckel.

Schauen Sie sich diese lustige Animation an!

Die lange Pause ist der Pinsel, der über die Eingabe geht.

Ungolfed:

^w[B!0]{>}                # Go to the end of the input
w[B!45]{<                 # Head left until hitting a hyphen
    w[B=10]{                # For each newline on the way:
            t[T+1]                # Count it
            b[0]                  # Delete it
    }
}

v[X]                      # Move down as far as it is right + the number of \n
v                         # ...plus one

w[T!0]{                   # While the counting variable is nonzero:
    vb[124]                 # Go down and draw a pipe
    <[X]b[124]              # Draw a pipe on the left as well
    >w[B=0]{>}              # Go back to the right side
    t[T-1]                  # Decrement variable
}

w[X!1]{<b[95]}            # Draw the bottom of the box
<w[B!0]{^}                # Go up the left wall
w[Y!-1]{b[47]>^}          # Go up and right, drawing the lid
untergrundbahn
quelle
2
+1 für die coole Animation. Wie hast du es geschaffen?
Gowtham
@ Gowtham Ich würde vermuten, dass Sie Ihren Bildschirm aufnehmen und das Video zuschneiden. Dann nimm das und wandle es in ein GIF um. Natürlich, ich rate nur, ich kenne die eigentliche Methode nicht
Spotlight
@ Awesomebing1 Sie haben es
U-
9

Pyth, 16 bis 14 Bytes

j+_m+*;d\/Uz.z

Erläuterung

   m      Uz   - [V for d in range(len(input()))]
    +*;d\/     - " "*d + "/"
  _            - ^[::-1]
j+          .z - "\n".join(^+rest_of_input())

Danke @FryAmTheEggman für den neuen Algorithmus!

Probieren Sie es hier aus.

Blau
quelle
8

Retina, 34 20 Bytes

- (? = (- *)) ¶?
$ 1 / ¶
-
 

Im ersten Schritt wird jeder -durch die -folgenden /Zeilen ersetzt: a und newline. Die neue Zeile am Ende der ursprünglichen ersten Zeile wird gelöscht. Im zweiten Schritt ändern wir die neuen -in Leerzeichen, was zur gewünschten Ausgabe führt.

Probieren Sie es hier online aus.

randomra
quelle
2
Nur zum Spaß ist es auch in einer einzigen Phase möglich: retina.tryitonline.net/… (gleiche Bytes)
Martin Ender
Wenn Sie die erste Zeile separat essen, können Sie die nachfolgenden Zeilen $%'erfassen, -wodurch Sie 5 Bytes sparen: Probieren Sie es online aus!
Neil
7

MATL , 14 15 Bytes

' /'jnXyPQ)`jt

Die Eingabe sollte einen nachgestellten Zeilenumbruch haben.

Probieren Sie es online!

Erläuterung

' /'       % push string (will be indexed into to generate the open lid)
jn         % read first line of input and push its length
Xy         % identity matrix with that size
P          % flip vertically
Q          % add 1. Now the matrix contains 1 and 2, to be used as indices
)          % index into string. Produces a 2D char array for the lid
`          % do-while loop
  j        %   push input line
  t        %   duplicate. Truthy if nonempty
           % implicitly end loop. The loop condition is the top of the stack,
           % that is, the input line that has just been read.
           % This is truthy if non-empty; and in that case another line will
           % be read in the next iteration.
           % implicitly display stack contents, bottom to top
Luis Mendo
quelle
5

Japt, 28, 26, 25, 22 18 17 Bytes

Ur-@"
{SpUa- -Y}/

Online testen!

Gibt einen führenden Zeilenumbruch aus, der laut OP akzeptabel ist.

Wie es funktioniert

Ur-@       // Replace each hyphen X in the input and its index Y with this function:
"          //  Start a string that contains a newline.
{        } //  Insert here:  
   Ua- -Y  //   Take the index of the last hyphen in the input, subtract Y,
 Sp        //   and return that many spaces.
/          //  Finish off the string with a slash.

Dies wäre 4 Bytes kürzer, wenn sich das Scharnier am rechten Rand der Box befinden darf:

Ur-@"
{SpY}\\
ETHproductions
quelle
4

JavaScript (ES6), 66

b=>([a,t]=b.split`-
`,[...a+0].map(_=>(t=l+`/
`+t,l+=' '),l=''),t)

PRÜFUNG

f=b=>([a,t]=b.split`-\n`,[...a+0].map(_=>(t=l+`/\n`+t,l+=' '),l=''),t)

var box = `-------
|     |
|_____|`

console.log=x=>O.textContent=x

console.log(f(box))
<pre id=O></pre>

edc65
quelle
3

Java 8, 158 118 Bytes

Dies ist nur ein Anfang, aber hey, FGITWFTW.

n->{String o="";int z=n.lastIndexOf("-"),i=z;for(;i-->0;o+="/\n")for(int y=i;y-->0;o+=" ");return o+n.substring(z+2);}

Erwartet die Eingabe als Zeichenfolge und gibt die Box zurück.

Addison Crump
quelle
3

Python 3, 1̶7̶0̶ 88 Bytes

Hier ist mein kurzer (er) Code: EDIT: Jetzt 82 Bytes kürzer mit @Dennis 's Code Edit!

f=open('f.txt')
d=len(f.readline())-1
a=f.read()
while d:d-=1;print(' '*d+'/')
print(a)

Python 3, 421 Bytes

Alternativ können Sie zum Spaß auch eines verwenden, das es langsam öffnet:

import time
import os
f = open('f.txt', 'r')
e = f.readline()
a = f.read()
d = len(e)
c = 0
t = e + a
g = ''
clear = lambda: os.system('cls')
while c <= d - 1:
    clear()
    print(("\n" * ((d - 1) - (c))) + t)
    c += 1
    e1 = e[0:(d - c)  -1]
    e2 = e[(d - c):len(e)]
    e1 += '/'
    e2 = ' ' * len(e2)
    y = (' ' * len(e1)) + '/' + '\n'
    g += y
    t = (g + e1 + e2 + '\n' + a)[d:len(g + e1 + e2 + '\n' + a)]
    time.sleep(0.2)
f.close()

Um eines von beiden zu verwenden, müssen Sie eine Textdatei in demselben Verzeichnis erstellen, die ein ASCII-Feld beliebiger Breite oder Tiefe mit dem Namen "f.txt" enthält. Es wird dann diese Box öffnen.

Monster
quelle
1
Sie können dies weiter verkürzen, indem Sie Variablen auf einzelne Buchstaben verkürzen und viele Leerzeichen zwischen Operatoren entfernen. Allgemeine Tipps zum Golfen in Python finden Sie hier .
Alex A.
Warum auf der Erde brauchen Sie Zeit? Diese Frage fragt nur nach einer einzelnen Ausgabe.
Addison Crump
Wie ich bereits sagte, war meine Interpretation dieses Puzzles etwas falsch, und wenn Sie es ausgeben, werden Sie mehr als die gewünschte Frage sehen.
Monster
Okay, ich habe eine einfachere Antwort hinzugefügt, die genau das tut, was die Frage sagt, so wie ich es jetzt verstehe. Es ist nicht schön, aber es funktioniert. Mein alternativer Code ist für alle, die fantastisch genug sind, um ihn zu öffnen
Monster,
2
Mit ein paar geringfügigen Änderungen wird die Anzahl der Bytes auf 81 verringert (Lesen von STDIN).
Dennis
3

Schlag, 85 , 84 79 Zeichen

(Pure Bash-Version, keine externen Befehle verwendet.)

r(){
a="${a/-
/
$s/
}"
s+=\ 
[[ $a = -* ]]&&r
}
mapfile a
r
IFS=
echo "${a[*]}"

Gibt eine führende Newline aus.

Probelauf:

bash-4.3$ bash open-the-box.sh <<< $'-------\n|     |\n|_____|'

      /
     /
    /
   /
  /
 /
/
|     |
|_____|
Mann bei der Arbeit
quelle
echoist ein externer Befehl - /usr/bin/echo;)
Levi
Die echoausführbare Datei existiert für die Übereinstimmung des Betriebssystems mit den Standards. Wenn Portabilität heutzutage , dass man nur verwendet wird , ist wichtig, da , dass man auf die ist bis Standard , aber die meisten modernen Schalen haben ihre eigenen eingebauten echo, die standardmäßig verwendet wird: pastebin.com/RnxhweBv @Levi, wenn Sie umbenennen / bewegen Sie /usr/bin/echo, meine Code wird immer noch funktionieren.
Manatwork
(Es war ein Witz ....)
Levi
1
Oh. Okay. Tut mir leid, ich habe schon früher Leute getroffen, die dasselbe behaupteten, aber es ernst meinten.
Manatwork
3

Perl, 61 54 33 + 3 = 36 Zeichen

s^-^" "x(length$')."/\n"^ge&chomp

Führen Sie es als

perl -ple 's^-^" "x(length${chr 39})."/\n"^ge&chomp' closed_box_file

Jeder -in erster Linie durch eine Kette ersetzt, ist ein Ergebnis der Verkettung von einer Anzahl von , /und \n. ${chr 39}wertet zu Perls (in) berühmter $'aka $POSTMATCHspezieller Variable aus. Zuletzt entfernt chomp das abschließende Newline-Zeichen, das für das letzte -Zeichen hinzugefügt wurde .

Vielen Dank an @manatwork für das Speichern von mehr als 7 Zeichen.

Bonus - s^-^" "x$i++."\\\n"^ge&&chopöffnet die Box vom rechten Rand in 29 + 3 Zeichen :). Führen Sie es aus als:

gowtham@ubuntu:~$ cat a
----
|  |
|__|
gowtham@ubuntu:~$ perl -plE 's^-^" "x$i++."\\\n"^ge&&chop' closed_box_file
\
 \
  \
   \
|  |
|__|
Gowtham
quelle
@manatwork Nur die erste Zeile enthält -, also kann ich ja noch mehr Golf spielen. Vielen Dank!
Gowtham
$.==1$.<2, &&chop&chop, entferne das zusätzliche Klammerpaar um length, zähle {chr 39}als 1, da es aufgrund der Shell-Syntax nicht nur von der Kommandozeilenversion benötigt wird: $.<2&&s^-^" "x(length$')."/\n"^ge&chop+ 2 Zeichen für Kommandozeilenoptionen = 40 nach meiner Zählung. pastebin.com/iDhUs9XX
Manatwork
@manatwork Eigentlich $.==1oder $.<2kann beseitigt werden, weil nur die erste Zeile enthält-
Gowtham
Ja, ich habe gesehen, was du dort getan hast. Und ich war erstaunt. Übrigens können Sie anstelle von einen Zeilenumbruch im Code verwenden \n.
Manatwork
Doh. Fand eine kürzere:s^-^$'=~y/-/ /r."/\n"^ge&chomp
Manatwork
2

Pyth, 26 23 Bytes

jXK.z0jm+*\ t-lhKd\/lhK

Yuck. Kann definitiv kürzer sein; arbeite immer noch daran.

Türknauf
quelle
2

Python3, 76 Bytes

f=open(0)
w=len(f.readline())
while w:w-=1;print(' '*w+'/')
print(f.read())
  1. Liefert die Länge der ersten Eingabezeile.
  2. Drucken Sie Zeilen, /denen eine abnehmende Anzahl von Leerzeichen vorangestellt ist.
  3. Schieben Sie den Rest stdingerade nach stdout.

BEARBEITEN: Ich habe gerade bemerkt, dass mein Code fast identisch mit @Dennis 'Kommentarbearbeitung von @ Monsters kürzerem Python3-Code ist. Der einzige Unterschied besteht darin, den Rest stdindirekt zu drucken, anstatt ihn in einer Variablen zu speichern. Großartige Köpfe!

josh2112
quelle
2

Canvas , 6 4 Bytes

jL/o

Probieren Sie es hier aus!

Erläuterung:

j      remove 1st line of the input
 L     get the width of the remaining input
  /    push a diagonal of that size
   o   and output that diagonal
       and implicitly output the remaining input
dzaima
quelle
1

Python 2, 100 Bytes

def o(b):
 m=b.split('\n')[1:]
 print"\n".join(["/".rjust(i)for i in range(len(m[0]),0,-1)]+m)

Definiert eine Funktion o, die eine Zeichenfolge als Eingabe verwendet. (Vollständiges Programm wurde in der Frage nicht angegeben).

Scimonster
quelle
1

PowerShell, 55 Byte

$d,$b=$args-split"`n";($d.length-1)..0|%{" "*$_+"/"};$b

Übernimmt Eingaben $argsals Zeichenfolge, -splits in Zeilenumbrüchen `n ( Referenzlink ) , speichert die erste Zeile in $d(als Zeichenfolge) und die verbleibenden in $b(als Array von Zeichenfolgen). Wir durchlaufen dann die Schleife von der lengthersten Zeile (minus 1) bis 0und geben bei jeder Iteration die Anzahl der Leerzeichen plus a aus /. Schließlich wird eine Ausgabe $b(der Rest der Eingabezeichenfolge) ausgegeben, die standardmäßig eine Ausgabe pro Zeile enthält.

Beispiellauf

PS C:\Tools\Scripts\golfing> .\help-me-open-the-box.ps1 "----`n|  |`n|__|"
   /
  /
 /
/
|  |
|__|
AdmBorkBork
quelle
1

JavaScript (Node.js) , 56 Byte

a=>a[b="replace"](/-+/,c=>c[b](d=/-/g,`
$'/`))[b](d,' ')

Probieren Sie es online!

Sollte als Kommentar von geschrieben werden @Neil s‘ Antwort , aber ich kann nicht Kommentare erstellen noch

Beliebiger Benutzer
quelle
Hallo und willkommen bei PPCG. Ich nehme an, Sie meinen Neils Antwort, die Sie weiter vertieft haben. Möglicherweise möchten Sie einen Link zu ihrer Antwort hinzufügen und den Namen des Autors korrigieren, um Kredit zu geben.
Jonathan Frech
@ JonathanFrech danke, erledigt
Any3nymous Benutzer
1

05AB1E (Legacy) , 9 Byte

g'/1.Λ|»»

Probieren Sie es online! (nur Legacy)

Wie es funktioniert

g'/1.Λ|»» – Full program. Takes input from STDIN.
g         - Length. Only takes the first line into account.
 '/       – Push a slash character, "/".
   1.Λ    – And diagonally up-right, draw a line of slashes of the given length.
      |»  – Push the remaining inputs (all other lines) joined on newlines.
        » – Then join the stack on newlines.
Mr. Xcoder
quelle
1

Holzkohle , 14 Bytes

↙L§⪪θ¶⁰M→✂⪪θ¶¹

Probieren Sie es online (ausführlich) oder online (rein) .

Erläuterung:

Teilen Sie die Eingabe durch Zeilenumbrüche, nehmen Sie die Länge der ersten Zeile und drucken Sie eine Zeile dieser Länge von oben rechts nach unten links:

Print(:DownLeft,Length(AtIndex(Split(q,"\n"),0)))
↙L§⪪θ¶⁰

Einmal nach rechts bewegen:

Move(:Right)
M→

Teilen Sie die Eingabe erneut durch Zeilenumbrüche, entfernen Sie das erste Element und drucken Sie implizit das, was noch übrig ist:

Slice(Split(q,"\n"),1)
✂⪪θ¶¹

(HINWEIS: Das Einfügen der durch Zeilenumbrüche aufgeteilten Eingabe in eine Variable (da ich es oben zweimal mache) ist 1 Byte länger und 14 Byte mit einer etwas anderen Methode (dank @Neil ):
≔⮌⪪θ¶θ↙L⊟θM→⮌θ Probieren Sie es online (ausführlich) oder versuchen Sie es online (rein) ).

Kevin Cruijssen
quelle
Wenn Sie die durch Zeilenumbrüche aufgeteilte Eingabe umkehren, können Sie die erste Zeile entfernen, wodurch Sie wieder auf 14 Byte zurückkehren: Probieren Sie es online aus!
Neil
0

JavaScript ES6, 106 Bytes

q=>(q=q.split`
`,n=q[0].length,eval('for(i=0,r="";i<n;i++)r+=" ".repeat(n-i-1)+"/\\n"'),r+q.slice(1).join`
`)

Ganz einfach: Ermitteln der Länge der ersten Zeile, Erstellen eines nachgestellten Abstandsdreiecks /und Hinzufügen dieser Länge zum Original, geschnitten und verbunden.

Probieren Sie es aus! (Nur ES6 :()

Conor O'Brien
quelle
2
Wie ich sehe, haben Sie das XKCD-Problem mithilfe der Formatierung gelöst . Klug.
Kroltan
.repeat(n-i-1)=>.repeat(n+~i)
Downgoat
0

Python 2.7, 120 122 Zeichen

Benötigt eine Datei fmit der Original / geschlossenen Box, die Ausgabe ist die geöffnete. Ein Hoch auf @Monster für die Idee ... wird später versuchen, mehrzeilige Eingaben herauszufinden und festzustellen, ob sie kürzer sind.

for l in open('f').readlines():
 if l[1]==('-'):
  for x in range(1,len(l)):print(' '*(len(l)-x+1)+'/')
 else:print l[:-1]

Bearbeiten

  • Ich /habe gerade bemerkt, dass ganz links ein Leerzeichen vorne ist. +2 Bytes
janrn
quelle
0

Ruby, 59 Zeichen

(57 Zeichen Code + 2 Zeichen Befehlszeilenoptionen.)

s=""
$_=$_.chars.map{(s<<" ")[1..-1]+?/}.reverse*$/if$.<2

Probelauf:

bash-4.3$ ruby -ple 's="";$_=$_.chars.map{(s<<" ")[1..-1]+?/}.reverse*$/if$.<2' <<< $'-------\n|     |\n|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|
Mann bei der Arbeit
quelle
0

Bash, 129 Zeichen

Benötigt eine Datei, die amit der geschlossenen Box aufgerufen wird und auf stdout ausgegeben wird.

for i in $(seq `cat a|awk 'NR==1{print length($1)-1}'` -1 1);{ for j in `seq 1 $i`;{ printf " ";};echo "/";};echo "/";tail -n2 a

Es könnte möglich sein, es durch Verwendung sedund Verwendung von Standard und Rohrleitungen zu verkürzen.

Daniel Peukert
quelle
Schöne erste Golfantwort. Einige einfache Vorschläge zur Änderung der Syntax:for i in $(seq `awk 'NR<2&&$0=length-1' a` -1 1);{ for j in `seq 1 $i`;{ printf \ ;};echo /;};echo /;tail -n2 a
manatwork
0

PHP, 127 Zeichen

$s=$argv[1];$l=strlen(strtok($s,"\n"));for($i=0;$i<$l;$i++)$s=preg_replace("/-/","\n".str_repeat(" ",$l-$i-1)."/",$s,1);echo$s;

Ungolfed-Version:

$s=$argv[1];
$l=strlen(strtok($s,"\n"));

for($i=0;$i<$l;$i++){
    $v="\n".str_repeat(" ",$l-$i-1)."/";
    $s=preg_replace("/-/",$v,$s,1);
}
echo $s;
kuldeep.kamboj
quelle
Ihr Code enthält einen Tippfehler: Sie haben das Siegel von verpasst $argv. Es gibt ein paar kleine Tricks, die Sie anwenden können: $l=strlen(strtok($s=$argv[1],"↵"));while($l)$s=preg_replace("/-/","↵".str_repeat(" ",--$l-$i)."/",$s,1);echo$s;(Verwenden Sie eine wörtliche Newline in Ihrem Code, in der "↵" steht: pastebin.com/36t2fb0P )
manatwork
0

Python, 125 Bytes (110 ohne Box)

i="\n---\n| |\n|_|"
l,b,r=i.count("-"),i.split('\n'),range
for x in r(1,l):print" "*(l-x)+"/"
for x in r(2,len(b)):print b[x]

Wenn jemand eine Idee hat, wie man es verkürzt, lass es mich wissen!

Dave Lin
quelle
0

Awk, 47 46 Zeichen

(44 Zeichen Code + 2 Zeichen Befehlszeilenoption.)

/-/{OFS=RS;for(i=NF;i;i--){$i=s"/";s=s" "}}1

Probelauf:

bash-4.3$ awk -F '' '/-/{OFS=RS;for(i=NF;i;i--){$i=s"/";s=s" "}}1' <<< $'-------\n|     |\n|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|
Mann bei der Arbeit
quelle
0

Gema, 51 49 31 Zeichen

-\P/-+/=@subst{-=\\ ;$1}/\n
-=/

Probelauf:

bash-4.3$ gema -e '-\P/-+/=@subst{-=\\ ;$1}/\n;-=/' <<< $'-------\n|     |\n|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|
Mann bei der Arbeit
quelle