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.

2
Im Gegensatz zum Spiel "Shut the Box"?
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.

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.


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

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-


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.


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

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}\\

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>


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.


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.


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|_____|'

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

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
\
 \
  \
   \
|  |
|__|

@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.


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!


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

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).


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|__|"
   /
  /
 /
/
|  |
|__|


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


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.

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) ).


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 :()


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

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|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|

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.


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;

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!


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|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|

0

Gema, 51 49 31 Zeichen

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

Probelauf:

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.