Aiutami ad aprire la scatola


33

Ho una scatola di arte ASCII e ho bisogno di un programma per aprirla.

Esempi

Ingresso:

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

Produzione:

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

specificazione

  • La prima riga sarà composta solo da -almeno 3 di essi
  • Le righe centrali inizieranno con |spazi e finiranno con|
    • Tutte le file centrali saranno uguali
  • L'ultima riga inizia con |have _e termina con a|
  • Tutte le righe avranno la stessa lunghezza

Aprire la scatola:

  • Ognuno -dovrebbe essere sostituito da un /in linee e posizione crescente.

2
A differenza del gioco "Shut the Box"?
Addison Crump,


28
Il coperchio diventa il doppio del tempo quando viene aperto? Vabbè, dai la colpa all'arte ASCII.
Darrel Hoffman,

8
Cosa c'è nella scatola?
Williham Totland,

2
Non c'è un interprete funzionante, quindi credo di no. Non importa; quando creo l'interprete (presto, si spera), posterò la risposta.
ETHproductions

Risposte:


7

CJam, 14 byte

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

Provalo online!

Come funziona

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,' ')

Emette una nuova riga principale. Funziona prendendo la fila di -s e convertendoli in un triangolo, quindi sostituendo la -s con spazi.

Modifica: salvato 5 byte grazie a @ edc65.


1
+1 Ho imparato qualcosa di nuovo ($ '). Invece questo vecchio trucco può salvare 4 byte per te:f=s=>s[R='replace'](/-+/,s=>s[R](/-/g,"\n$'/"))[R](/-/g,' ')
edc65

@ edc65 Grazie, in realtà lo faccio 5 byte; anche grazie per aver risolto il mio errore di battitura (come avrete intuito io sviluppo \ne converto in seguito).
Neil,

9

pb (NON COMPETENTE), 125 byte

^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]>^}

La versione di pbi di cui hai bisogno per eseguire questa risposta è più recente della domanda. Avrebbe funzionato nelle versioni precedenti, tranne per il fatto che non ero mai riuscito a consentire l'ingresso di nuove righe. Oh bene.

Innanzitutto, questo determina l'altezza del riquadro contando le nuove righe nell'input. Una volta che lo sa, va nella posizione a Y del lato destro della scatola, scende fino a dove deve essere e disegna le pareti e il pavimento, finendo con il coperchio.

Dai un'occhiata a questa divertente animazione!

La lunga pausa è il pennello che passa sopra l'input.

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 per l'animazione divertente. Come lo hai creato?
Gowtham,

@Gowtham Immagino che tu registri il tuo schermo e ritagli il video. Quindi, prendilo e convertilo in GIF. Certo, solo indovinando, non conosco il metodo reale
Spotlight

@ awesomebing1 ce l'hai
undergroundmonorail

9

Pyth, 16 14 byte

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

Spiegazione

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

Grazie @FryAmTheEggman per il nuovo algoritmo!

Provalo qui.


8

Retina, 34 20 byte

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

Nel primo passo ogni -viene sostituito con quello -che segue, a /e una nuova riga. La nuova riga alla fine della prima riga originale viene eliminata. Nel secondo passaggio cambiamo i nuovi -in spazi che danno come risultato l'output desiderato.

Provalo online qui.


2
Solo per divertimento, è anche possibile in una sola fase: retina.tryitonline.net/… (stessi byte però)
Martin Ender,

Se mangi la prima newline separatamente puoi usare $%'per catturare i messaggi finali -che ti fanno risparmiare 5 byte: provalo online!
Neil,

7

MATL , 14 15 byte

' /'jnXyPQ)`jt

L'input dovrebbe avere una nuova riga finale.

Provalo online!

Spiegazione

' /'       % 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 byte

Ur-@"
{SpUa- -Y}/

Provalo online!

Emette una nuova riga iniziale, che è accettabile secondo il PO.

Come funziona

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.

Questo sarebbe inferiore di 4 byte se la cerniera può trovarsi sul bordo destro della scatola:

Ur-@"
{SpY}\\

4

JavaScript (ES6), 66

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

TEST

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 byte

Questo è solo un inizio, ma ehi, 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);}

Si aspetta input come una stringa, restituisce la casella.


3

Python 3, 1̶7̶0̶ 88 byte

Ecco il mio breve codice (er): EDIT: ora 82 byte più breve con la modifica del codice di @Dennis!

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

Python 3, 421 byte

In alternativa, solo per divertimento, puoi usarne uno che lo apre lentamente:

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

Per utilizzare uno di questi, è necessario creare un file di testo nella stessa directory contenente una casella ASCII di qualsiasi larghezza o profondità chiamata 'f.txt'. Si aprirà quindi quella casella.


1
È possibile accorciare ulteriormente accorciando le variabili in singole lettere e rimuovendo gran parte degli spazi bianchi tra gli operatori. Per suggerimenti generali per giocare a golf in Python, vedere qui .
Alex A.

Perché mai hai bisogno di tempo? Questa domanda richiede solo un singolo output.
Addison Crump,

Come ho detto, la mia interpretazione di questo enigma era leggermente off e se lo emetti ti mostrerà più della domanda posta.
Mostro

Ok, ho aggiunto una risposta più semplice che fa esattamente quello che dice la domanda, come ora la capisco. Non è carino ma funziona. Il mio codice alternativo è per chiunque sia abbastanza fantastico da volerlo vedere aperto
Monster

2
Alcune piccole modifiche portano il conteggio dei byte a 81 (leggendo da STDIN).
Dennis

3

Bash, 85 84 79 caratteri

(Versione Pure Bash, nessun comando esterno utilizzato.)

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

Emette una nuova riga principale.

Esecuzione di esempio:

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

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

echoè un comando esterno - /usr/bin/echo;)
Levi

L' echoeseguibile esiste per la conformità del sistema operativo agli standard. Al giorno d'oggi uno viene utilizzato solo se la portabilità è importante, poiché è all'altezza dello standard , ma la maggior parte delle shell moderne ha il proprio built-in echoche viene utilizzato per impostazione predefinita: pastebin.com/RnxhweBv @Levi, se si rinomina / sposta il /usr/bin/echomio, mio il codice continuerà a funzionare.
arte

(era uno scherzo ....)
Levi

1
Oh. Ok. Mi dispiace, ho già incontrato persone che hanno affermato lo stesso, ma sul serio.
arte

3

Perl, 61 54 33 + 3 = 36 caratteri

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

Eseguilo come

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

Ciascuno -nella prima riga è sostituito da una stringa che è il risultato della concatenazione di un numero di , /e \n. ${chr 39}valuta la famosa variabile speciale $'aka (in) di perl $POSTMATCH. Infine, chomp elimina il carattere di nuova riga finale che è stato aggiunto per l'ultimo -personaggio.

Grazie a @manatwork per aver salvato 7 + più personaggi.

Bonus : s^-^" "x$i++."\\\n"^ge&&chopapre la casella dal bordo destro in 29 + 3 caratteri :). Eseguilo come:

gowtham@ubuntu:~$ cat a
----
|  |
|__|
gowtham@ubuntu:~$ perl -plE 's^-^" "x$i++."\\\n"^ge&&chop' closed_box_file
\
 \
  \
   \
|  |
|__|

@manatwork Solo la prima riga contiene -, quindi sì, posso giocarci ancora di più. Grazie!
Gowtham,

$.==1$.<2, &&chop&chop, rimuovi la coppia di parentesi aggiuntiva length, conta {chr 39}come 1, poiché non è necessario solo per la versione della riga di comando a causa della sintassi della shell: $.<2&&s^-^" "x(length$')."/\n"^ge&chop+ 2 caratteri per le opzioni della riga di comando = 40 secondo il mio conteggio. pastebin.com/iDhUs9XX
arte

@manatwork In realtà, $.==1o $.<2può essere eliminato perché contiene solo la prima riga-
Gowtham,

Sì, ho visto cosa hai fatto lì. E sono rimasto stupito. A proposito, puoi usare un involucro di riga letterale nel codice anziché \n.
arte

Doh. s^-^$'=~y/-/ /r."/\n"^ge&chomp
Ne ho

2

Pyth, 26 23 byte

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

Che schifo. Può sicuramente essere più breve; ci sto ancora lavorando.


2

Python3, 76 byte

f=open(0)
w=len(f.readline())
while w:w-=1;print(' '*w+'/')
print(f.read())
  1. Ottieni la lunghezza della prima riga di input.
  2. Stampa le righe /precedute da un numero decrescente di spazi.
  3. Spingere il resto del stdindiritto verso stdout.

EDIT: Ho appena notato che il mio codice è quasi identico alla modifica del commento di @Dennis del codice Python3 più corto di @ Monster, l'unica differenza è stampare il resto stdindirettamente invece di memorizzarlo in una variabile. Grandi menti!


2

Tela , 6 4 byte

jL/o

Provalo qui!

Spiegazione:

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 byte

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

Definisce una funzione oche accetta una stringa come input. (Il programma completo non è stato specificato nella domanda).


1

PowerShell, 55 byte

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

Prende l'input $argscome stringa, -splits su newline `n ( collegamento di riferimento ) , archivia la prima riga in $d(come stringa) e la restante in $b(come matrice di stringhe). Quindi eseguiamo il loop dalla lengthprima riga (meno 1) a 0e ogni iterazione genera quel numero di spazi più a /. Infine, output $b(il resto della stringa di input) che per impostazione predefinita produrrà uno per riga.

Esempio di esecuzione

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,' ')

Provalo online!

Dovrebbe essere scritto come commento di @Neil 's risposta , ma non riesco a creare ancora commenti


Ciao e benvenuto in PPCG. Presumo che tu intenda la risposta di Neil che hai golfato ulteriormente. Potresti voler aggiungere un link alla loro risposta e correggere il nome dell'autore per dare credito.
Jonathan Frech,

@JonathanFrech grazie, fatto
Utente Any3nymous il

1

05AB1E (legacy) , 9 byte

g'/1.Λ|»»

Provalo online! (Legacy-only)

Come funziona

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

Carbone , 14 byte

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

Provalo online (dettagliato) o provalo online (puro) .

Spiegazione:

Dividi l'input per nuove righe, prendi la lunghezza della prima riga e stampa una linea di quella lunghezza da Top-Right a Down-Left:

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

Sposta una volta a destra:

Move(:Right)
M→

Dividi nuovamente l'input per newline, rimuovi il primo elemento e stampa ciò che è implicitamente lasciato:

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

(NOTA: Mettere l'input diviso per newline in una variabile (dal momento che lo faccio due volte sopra) è più lungo di 1 byte e anche 14 byte usando un metodo leggermente diverso (grazie a @Neil ):
≔⮌⪪θ¶θ↙L⊟θM→⮌θ Provalo online (dettagliato) o provalo online (puro) ).


Se si inverte la suddivisione in input di newline, è possibile estrarre la prima riga che riporta a 14 byte: Provalo online!
Neil,

0

JavaScript ES6, 106 byte

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

Abbastanza semplice: ottenere la lunghezza della prima riga, creare un triangolo spaziato con trascinamento /e aggiungerlo all'originale, tagliato e unito.

Provalo! (Solo ES6 :()


2
Vedo che hai risolto il problema XKCD usando la formattazione. Intelligente.
Kroltan,

.repeat(n-i-1)=>.repeat(n+~i)
Downgoat,

0

Python 2.7, 120 122 caratteri

Ha bisogno di un file fcon la scatola originale / chiusa, l'output è quello aperto. Saluti a @Monster per l'idea ... proverò a capire l'input multilinea più tardi e vedremo se è più breve.

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]

modificare

  • /ho appena notato che quello più a sinistra ha uno spazio davanti; +2 byte

0

Rubino, 59 caratteri

(57 caratteri di codice + 2 caratteri opzioni della riga di comando.)

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

Esecuzione di esempio:

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

0

Bash, 129 personaggi

Richiede un file chiamato acon la casella chiusa, l'output su stdout.

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

Potrebbe essere possibile accorciarlo usando sede usando stdin e piping.


Bella prima risposta da golf. Alcuni semplici suggerimenti per cambiare la sintassi: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 caratteri

$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;

Versione non golfata:

$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;

C'è un refuso nel tuo codice: ti sei perso il sigillo di $argv. Ci sono un paio di trucchi minori che potresti applicare: $l=strlen(strtok($s=$argv[1],"↵"));while($l)$s=preg_replace("/-/","↵".str_repeat(" ",--$l-$i)."/",$s,1);echo$s;(Usa una nuova riga letterale nel tuo codice dove è “↵”: pastebin.com/36t2fb0P )
manatwork

0

Python, 125 byte (110 senza scatola)

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]

Se qualcuno ha idea di come accorciarlo, per favore fatemi sapere!


0

Awk, 47 46 caratteri

(44 caratteri codice + 2 caratteri opzione riga di comando.)

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

Esecuzione di esempio:

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

0

Gema, 51 49 31 caratteri

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

Esecuzione di esempio:

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


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.