Ajude-me a abrir a caixa


33

Eu tenho uma caixa de arte ASCII e preciso de um programa para abri-la.

Exemplos

Entrada:

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

Saída:

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

Especificação

  • A primeira linha consistirá apenas em -pelo menos três delas
  • As linhas do meio começarão com |espaços e terminarão com|
    • Todas as linhas do meio serão iguais
  • A última linha começará com |have _e terminará com um|
  • Todas as linhas terão o mesmo comprimento

Abrindo a caixa:

  • Cada um -deve ser substituído por um /em linhas e posições ascendentes.

2
Ao contrário do jogo "Shut the Box"?
Addison Crump


28
A tampa fica duas vezes mais longa quando aberta? Oh, bem, culpe a arte ASCII.
Darrel Hoffman

8
O que está na caixa?
Williham Totland

2
Não há um intérprete ativo, então acho que não. Não importa; quando eu fizer o intérprete (em breve, espero), postarei a resposta.
ETHproductions

Respostas:


7

CJam, 14 bytes

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

Experimente online!

Como funciona

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 bytes

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

Gera uma nova linha líder. Funciona pegando a linha de se -convertendo-os em um triângulo e substituindo os -por espaços.

Editar: salvou 5 bytes graças a @ edc65.


1
+1 Aprendi algo novo ($ '). Em vez este velho truque pode salvar 4 bytes para você:f=s=>s[R='replace'](/-+/,s=>s[R](/-/g,"\n$'/"))[R](/-/g,' ')
edc65

@ edc65 Obrigado, na verdade eu faço 5 bytes; também obrigado por corrigir meu erro de digitação (como você deve ter adivinhado, desenvolvo \ne converto posteriormente).
Neil

9

pb (NÃO COMPROMISSO), 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]>^}

A versão do pbi que você precisa para executar esta resposta é mais recente que a pergunta. Teria funcionado em versões mais antigas, exceto que eu nunca consegui permitir novas linhas de entrada. Ah bem.

Primeiro, isso determina a altura da caixa contando novas linhas na entrada. Uma vez que ele sabe disso, vai para o local Y do lado direito da caixa, desce até onde precisa estar e desenha as paredes e o chão, terminando com a tampa.

Confira esta animação divertida!

A pausa longa é o pincel passando por cima da entrada.

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 para a animação interessante. Como você o criou?
Gowtham 01/02

@Gowtham Eu acho que você grava sua tela e recorta o vídeo. Em seguida, pegue isso e converta-o em um GIF. Claro, apenas supondo, eu não sei o método real
Spotlight

@ awesomebing1 você conseguiu
undergroundmonorail

9

Pitão, 16 14 bytes

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

Explicação

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

Obrigado @FryAmTheEggman pelo novo algoritmo!

Experimente aqui.


8

Retina, 34 20 bytes

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

Na primeira etapa, todos -são substituídos pelos -seguintes, a /e uma nova linha. A nova linha no final da primeira linha original é excluída. Na segunda etapa, alteramos os novos -para espaços que resultam na saída desejada.

Experimente online aqui.


2
Apenas para o divertimento dele, também é possível em uma única etapa: retina.tryitonline.net/... (mesmos bytes embora)
Martin Ender

Se você comer a primeira nova linha separadamente, poderá usar $%'para capturar os -s finais, economizando 5 bytes: Experimente on-line!
Neil

7

MATL , 14 15 bytes

' /'jnXyPQ)`jt

A entrada deve ter uma nova linha à direita.

Experimente online!

Explicação

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

Teste online!

Gera uma nova linha principal, aceitável de acordo com o OP.

Como funciona

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.

Isso seria 4 bytes mais curto se a dobradiça estiver na borda direita da caixa:

Ur-@"
{SpY}\\

4

JavaScript (ES6), 66

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

TESTE

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

Este é apenas um começo, mas ei, 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);}

Espera a entrada como uma sequência, retorna a caixa.


3

Python 3, 1̶7̶0̶ 88 bytes

Aqui está o meu código (er) curto: EDIT: agora 82 bytes mais curto com o Edit Edit do @Dennis!

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

Python 3, 421 bytes

Como alternativa, apenas por diversão, você pode usar um que o abra 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()

Para usar qualquer um, você deve criar um arquivo de texto no mesmo diretório que contenha uma caixa ascii de qualquer largura ou profundidade chamada 'f.txt'. Ele abrirá essa caixa.


1
Você pode encurtar ainda mais, encurtando as variáveis ​​para letras únicas e removendo muito espaço em branco entre os operadores. Para dicas gerais sobre golfe em Python, veja aqui .
Alex A.

Por que diabos você precisa de tempo? Esta pergunta pede apenas uma única saída.
usar o seguinte código

Como eu disse, minha interpretação deste quebra-cabeça foi um pouco errada e, se você o exibir, ele mostrará mais do que a pergunta solicitada.
Monster

Ok, adicionei uma resposta mais simples, que faz exatamente o que a pergunta diz, como agora a compreendo. Não é bonito, mas funciona. Meu código alternativo é para qualquer um bastante incrível para querer vê-lo aberto
Monstro

2
Algumas pequenas alterações reduzem a contagem de bytes para 81 (leitura em STDIN).
Dennis

3

Bash, 85 84 79 caracteres

(Versão do Pure Bash, nenhum comando externo usado.)

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

Gera uma nova linha líder.

Exemplo de execução:

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

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

echoé um comando externo - /usr/bin/echo;)
Levi

O echoexecutável existe para a conformidade do sistema operacional com os padrões. Hoje em dia esse é usado apenas se a portabilidade for importante, pois esse é o padrão , mas a maioria dos shells modernos tem seu próprio built-in echoque é usado por padrão: pastebin.com/RnxhweBv @Levi, se você renomear / mover seu /usr/bin/echo, meu código ainda funcionará.
Manatwork

(que era uma piada ....)
Levi

1
Oh. Está bem. Desculpe, eu já conheci pessoas anteriores que afirmaram o mesmo, mas sério.
Manatwork

3

Perl, 61 54 33 + 3 = 36 caracteres

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

Execute-o como

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

Cada um -na primeira linha é substituído por uma sequência resultante da concatenação de algum número de , /e \n. ${chr 39}é avaliada $'como $POSTMATCHvariável especial do perl (in) famosa aka . Por fim, o chomp se livra do caractere de nova linha à direita que foi adicionado para o último -caractere.

Obrigado a @manatwork por salvar mais de 7 caracteres.

Bônus - s^-^" "x$i++."\\\n"^ge&&chopabre a caixa da borda direita em 29 + 3 caracteres :). Execute-o como:

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

@manatwork Apenas a primeira linha contém -, então sim, eu posso jogar ainda mais. Obrigado!
Gowtham 01/02

$.==1$.<2, &&chop&chop, remova o par extra de parênteses ao redor length, conte {chr 39}como 1, pois não é necessário apenas pela versão da linha de comando devido à sintaxe do shell: $.<2&&s^-^" "x(length$')."/\n"^ge&chop+ 2 caracteres para as opções da linha de comando = 40 de acordo com a minha contagem. pastebin.com/iDhUs9XX
manatwork

@manatwork Na verdade, $.==1ou $.<2pode ser eliminado porque só primeira linha contém-
Gowtham

Sim, eu vi o que você fez lá. E fiquei impressionado. A propósito, você pode usar uma quebra de linha literal no código em vez de \n.
Manatwork

Doh. Encontrei um mais curto:s^-^$'=~y/-/ /r."/\n"^ge&chomp
manatwork 03/02

2

Pitão, 26 23 bytes

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

Que nojo. Definitivamente pode ser mais curto; ainda trabalhando nisso.


2

Python3, 76 bytes

f=open(0)
w=len(f.readline())
while w:w-=1;print(' '*w+'/')
print(f.read())
  1. Obtenha o comprimento da primeira linha de entrada.
  2. Imprima linhas /precedidas por um número decrescente de espaços.
  3. Empurre o resto da stdinlinha reta parastdout .

EDIT: Acabei de notar que meu código é quase idêntico à edição de comentários de @Dennis do código Python3 mais curto do @ Monster, a única diferença é imprimir o restante stdindiretamente, em vez de armazená-lo em uma variável. Grandes mentes!


2

Tela , 6 4 bytes

jL/o

Experimente aqui!

Explicação:

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)

Define uma função oque recebe uma string como entrada. (O programa completo não foi especificado na pergunta).


1

PowerShell, 55 bytes

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

Pega a entrada $argscomo uma string, -splits em novas linhas `n ( link de referência ) , armazena a primeira linha em $d(como uma string) e a restante em $b(como uma matriz de strings). Em seguida, fazemos um loop a partir lengthda primeira linha (menos 1) 0e cada iteração gera esse número de espaços mais a /. Finalmente, produza $b(o restante da sequência de entrada) que, por padrão, gera uma por linha.

Exemplo de execução

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


1

JavaScript (Node.js) , 56 bytes

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

Experimente online!

Deve ser escrito como um comentário de @Neil 's resposta , mas eu não posso criar comentários ainda


Olá e bem-vindo ao PPCG. Suponho que você queira dizer a resposta de Neil, que você já jogou mais. Você pode adicionar um link à resposta e corrigir o nome do autor para dar crédito.
Jonathan Frech

@JonathanFrech obrigado, feito
Any3nymous user

1

05AB1E (herdado) , 9 bytes

g'/1.Λ|»»

Experimente online! (somente legado)

Como funciona

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

Carvão , 14 bytes

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

Experimente online (detalhado) ou online (puro) .

Explicação:

Divida a entrada por novas linhas, pegue o comprimento da primeira linha e imprima uma linha desse comprimento da parte superior direita para a esquerda inferior:

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

Mova uma vez para a direita:

Move(:Right)
M→

Divida a entrada por novas linhas novamente e remova o primeiro item e imprima o que resta implicitamente:

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

(OBSERVAÇÃO: Colocar a entrada dividida por novas linhas em uma variável (uma vez que eu faço isso duas vezes acima) tem 1 byte a mais e 14 bytes usando um método ligeiramente diferente (graças ao @Neil ):
≔⮌⪪θ¶θ↙L⊟θM→⮌θ Experimente on-line (detalhado) ou on-line (puro) ).


Se você inverter a entrada dividida por novas linhas, poderá sair da primeira linha, que o levará de volta a 14 bytes: Experimente online!
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`
`)

Simples o suficiente: obter o comprimento da primeira linha, criar um triângulo com espaçamento à direita /e adicioná-lo ao original, fatiado e unido.

Teste! (Somente ES6 :()


2
Vejo que você resolveu o problema do XKCD usando a formatação. Inteligente.
Kroltan 02/02

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

0

Python 2.7, 120 122 caracteres

Precisa de um arquivo fcom a caixa original / fechada, a saída é a aberta. Um brinde a @Monster pela idéia ... tentará descobrir a entrada de várias linhas mais tarde e ver se é mais curta.

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]

Editar

  • apenas notei que a extremidade esquerda /tem um espaço à frente; +2 bytes

0

Ruby, 59 caracteres

(Código de 57 caracteres + opções de linha de comando de 2 caracteres.)

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

Exemplo de execução:

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

0

Bash, 129 caracteres

Requer um arquivo chamado acom a caixa fechada, com saída para 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

Pode ser possível reduzi-lo usando sede usando stdin e tubulação.


Ótima primeira resposta de golfe. Algumas sugestões simples mudança sintaxe: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 caracteres

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

Versão não destruída:

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

Há um erro de digitação no seu código: você perdeu o sigilo de $argv. Existem alguns truques menores que você pode aplicar: $l=strlen(strtok($s=$argv[1],"↵"));while($l)$s=preg_replace("/-/","↵".str_repeat(" ",--$l-$i)."/",$s,1);echo$s;(Use uma nova linha literal no seu código onde é "↵": pastebin.com/36t2fb0P )
manatwork

0

Python, 125 bytes (110 sem caixa)

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 alguém tiver alguma idéia de como reduzi-lo, entre em contato!


0

Awk, 47 46 caracteres

(Código de 44 caracteres + opção de linha de comando de 2 caracteres.)

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

Exemplo de execução:

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

0

Gema, 51 49 31 caracteres

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

Exemplo de execução:

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


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.