Pila desbordante

47

(Inspirado por esta pregunta )

Objetivo

Su tarea es escribir un programa o función para imprimir una versión ASCII del logotipo de desbordamiento de pila en STDOUT

 \|/
(-)
(-)
(-)
(-)

Su programa debe tomar dos entradas, denominadas aquí H y N. La altura del "contenedor" de la pila (los paréntesis) está determinada por H. El número de elementos en la pila está determinado por N. Si N> H, el la pila se "desbordará".

De entrada y salida

H determinará la altura de los contenedores

Por ejemplo:

H = 1:

( )

H = 2:

( )
( )

H = 3:

( )
( )
( )

H siempre será al menos 1

N determinará cuántos elementos hay en la pila. Los siguientes ejemplos son todos H = 2:

N = 0

( )
( )

N = 1

( )
(-)

N = 2

(-)
(-)

N = 3

 \
(-)
(-)

N = 4

 \|
(-)
(-)

N = 5

 \|/
(-)
(-)

N = 6

 \|/
(-)-
(-)

N = 7

 \|/
(-)-
(-)-

N nunca será más que 2H+3(En otras palabras, la pila nunca atravesará el suelo).

Reglas

  • No hay lagunas estándar.
  • Su programa no debe producir ningún error.
  • Todos los casos de prueba deben pasar.
  • Puede ingresar H y N de la forma que desee.
  • Dudo seriamente que su idioma tenga algo incorporado para esto.
  • Cada línea puede tener opcionalmente un espacio extra al final. Una línea en blanco sobre una pila donde N <= H es opcional, como lo es una nueva línea final.
  • Este es el , por lo que gana el código más corto en bytes.

Casos de prueba

Además de todos los casos de prueba H = 2 de la sección Entrada / Salida, deben pasar todos los siguientes casos de prueba:

H = 1, N = 1

(-)

H = 1, N = 5

 \|/
(-)-

H = 4, N = 7

 \|/
(-)
(-)
(-)
(-)

H = 5, N = 0

( )
( )
( )
( )
( )

Tablas de clasificación

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

# Perl, 43 + 2 (-p flag) = 45 bytes

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

Daniel M.
fuente
44
¿Puedo publicar un programa no competitivo que realmente desborde la pila en lugar de imprimir el logotipo?
Dorukayhan quiere que Monica regrese el
@dorukayhan Si solo se desborda cuando n> h :)
Daniel M.
Quiero decir, ¿puedo hacer un programa que se cuelgue de un desbordamiento de pila?
Dorukayhan quiere que Monica regrese el
@dorukayhan solo si se bloquea cuando hay más elementos de los que la pila puede contener
Daniel M.

Respuestas:

14

Pyth, 43 41 40 bytes

<" \|/"g#0hK-QJEVJs[\(?<N_Kd\-\)*<N-K3\-

Pruébalo en línea. Banco de pruebas.

Primer pase, rápido y sucio. Entrada a STDIN como N\nH.

Explicación

  1. Guarde la segunda entrada (altura) en J( JE) y reste de la primera entrada (el número de elementos). ( -QJE)
  2. Guarde la diferencia (número de elementos desbordados) en K. ( K-QJE)
  3. Agregue 1 al número. ( hK-QJE)
  4. Tomar max(0, previous). Esto se requiere ya que los números negativos romperían el siguiente paso. ( g#0hK-QJE)
  5. Tome como máximo esa cantidad de letras de la cadena " \|/"para obtener la primera línea e imprima. ( <" \|/"g#0hK-QJE)
  6. Bucle de Nnuevo range(0, J). ( VJ) Para cada Nimpresión, la concatenación de lo siguiente: ( s[)
    • "("( \()
    • " "si hay al menos N+1espacios libres en la pila ( <N_K), de lo "-"contrario. ( ?<N_Kd\-)
    • ")"( \))
    • "-"si hay al menos N+4piezas desbordadas en la pila ( <N-K3), de lo ""contrario. ( *<N-K3\-)
PurkkaKoodari
fuente
13

JavaScript (ES6), 105 102 bytes

@Edit: Guardado 3 bytes gracias a @PatrickRoberts.

f=
(n,h)=>` \\|/`.substr(0,n+1-h)+[...Array(h)].map((_,i)=>`
(${i+n<h?` `:`-`})${i+h+3<n?`-`:``}`).join``
;
<div oninput=o.textContent=f(+n.value,+h.value)>n<input id=n type=number min=0 value=0>h<input id=h type=number min=0 value=0><pre id=o>

Neil
fuente
Puede reemplazar substringcon substrpara guardar 3 bytes, y reemplazar i+n<h?' ':'-'con '- '[i+n<h]para guardar 2 bytes y reemplazar i+h+3<n?'-':''con ' -'[i+h+3<n]para guardar 1 byte. Eso te llevará a menos de 100
Patrick Roberts
@PatrickRoberts No recuerdo si substrignoré los subíndices negativos o no, pero no puedo usar sus otros consejos porque los subíndices de cadena son cadenas, por lo que los booleanos no son lo suficientemente buenos.
Neil
mierda Me olvidé de eso, buen punto
Patrick Roberts
¡Uso realmente inteligente de la plantilla etiquetada para salvar esos dos caracteres!
Benjamin Gruenbaum
@BenjaminGruenbaum ¿qué es una "plantilla etiquetada"?
Patrick Roberts
12

JavaScript (ES6), 126 122 112 bytes

h=>n=>' \\|/'.substr(0,(o=n-h)+1)+`
( )`[r='repeat'](0>-o?0:-o)+`
(-)-`[r](o=0>o-3?0:o-3)+`
(-)`[r](n<h-o?n:h-o)

Prueba

f=h=>n=>' \\|/'.substr(0,(o=n-h)+1)+`
( )`[r='repeat'](0>-o?0:-o)+`
(-)-`[r](o=0>o-3?0:o-3)+`
(-)`[r](n<h-o?n:h-o)
document.write(`<pre>${[[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7],[1,1],[1,5],[4,7],[5,0]].map(a=>f(a.shift())(a.shift())).join`

`}</pre>`)

Prueba alternativa (si su navegador no es compatible con ES6)

Vea la prueba en Babeljs.io y marque "evaluar".

Enfoque alternativo interesante a 136 bytes

h=>n=>' \\|/'.substr(0,(o=n-h)+1)+`
( )${0>-o?0:-o}
(-)-${o=0>o-3?0:o-3}
(-)${n<h-o?n:h-o}`.replace(/(\n.*)(\d+)/g,(_,s,r)=>s.repeat(r))

Esto mueve las cantidades repetidas a la cadena de plantilla y usa una expresión regular y reemplazar para inyectar los grupos repetidos. Lamentablemente, la firma .replace()es demasiado larga.

Patrick Roberts
fuente
Me sale un error ...?
Addison Crump
1
@VTCAKAVSMoACE su navegador debe ser compatible con la sintaxis ES6. Funciona bien para mí. Siéntase libre de pegar la prueba en Babel .
Patrick Roberts
@VTCAKAVSMoACE Chrome 52 (en versión beta a partir de junio de 2016) admite todo ES6 y ES7, excepto la optimización de llamadas de cola y la carga de módulos.
gcampbell
10

C ++ 14 (función lambda), 196

Guardado 1 byte gracias a Quentin.

Guardado 2 bytes gracias a Adam Martin.

#include<iostream>
using namespace std;[](int h,int n){auto s=" \\|/( ) (-) (-)-"s;int t=max(min(n-h,3),0);n-=t;cout<<s.substr(0,t+1)+'\n';for(;h;h--)n-=t=n>h?2:h<=n,cout<<s.substr(4+4*t,4)+'\n';}

La función en sí misma ocupa 157 bytes.

Véalo en acción aquí .

Versión sin golf:

[](int h, int n) {
    auto s = " \\|/( ) (-) (-)-"s;
    int t = max(min(n - h, 3), 0);
    n -= t;
    cout << s.substr(0, t + 1) + '\n';
    for(; h; h--) {
        if (n > h) t = 2;
        else if (h > n) t = 0;
        else t = 1;
        n -= t;
        cout << s.substr(4 + 4 * t, 4) + '\n';
    }
};
vaultah
fuente
2
No veo ningún punto en incluir includesy using namespace std;en el recuento de bytes, a menos que su respuesta sea un programa completo (que no lo es).
Alexander Revo
9

CJam, 57 bytes

Sri:X'(*+X),W%X)X')*+X),X))f+]zN*X5*,X'-*_"\|/"\++ri<S+er

Pruébalo aquí.

Definitivamente podría usar alguna mejora. La idea es construir una cuadrícula donde las -\|/-celdas se reemplacen con enteros consecutivos, por ejemplo

 345
(2)6
(1)7
(0)8

Y luego reemplazarlos con los caracteres correctos (potencialmente espacios) al final.

Martin Ender
fuente
6

Python 2, 101 100 98 bytes

def f(h,n):
 print" \|/"[:max(0,n-h+1)]
 for i in range(h):print("(-)","( )")[h-i>n]+"-"*(n>i+h+3)
Chuck Morris
fuente
Los espacios posteriores printson innecesarios
Cyoce
@Cyoce Gracias, eso ahorra 2 caracteres.
Chuck Morris
4

JavaScript (ES6), 87 80 bytes

F=(h,n)=>h?F(h-1,n-1)+`
(${n>0?'-':' '})${n>2*h+2?'-':''}`:' \\|/'.substr(0,n+1)

Utiliza la recursividad para crear la cadena de salida de abajo hacia arriba.

EDITAR : Gracias a @Neil por eliminar 7 bytes de 87 bytes

Original

(h,n)=>(E=s=>h--?E(`
(${n>0?'-':' '})${--n>2*h+3?'-':''}`+s):` \\|/`.substr(0,n+1)+s)``

Fragmento de prueba:

F=(h,n)=>h?F(h-1,n-1)+`
(${n>0?'-':' '})${n>2*h+2?'-':''}`:' \\|/'.substr(0,n+1)


h.oninput = n.oninput = () => output.innerHTML = F(+h.value, +n.value);
<label>h <input type="number" min="0" value="0" id="h" /></label>
<label>n <input type="number" min="0" value="0" id="n" /></label>
<hr />
<pre id="output"></pre>

George Reith
fuente
gracias por el buen fragmento! Debería dar un punto extra: P
Kimmax
1
@ Kimmax Gracias amigo, nadie quiere meterse con la consola
George Reith
Al menos cuando lo intenté, la pila era bastante grande, y solo sería de 78 bytes con recursión ordinaria.
Neil
La consola de fragmentos muestra una SyntaxErrorpara mí.
ArtOfCode
1
@ArtOfCode Necesita usar un navegador compatible con ES6
George Reith
3

JavaScript (ES6), 149 139 137 bytes

h=>n=>` ${[(g=(j,m=1)=>` -\\|/`[(j<n)*m])(h,2),g(h+1,3),g(h+2,4)].join``}${[...Array(h)].map((_,i)=>`
(${g(h-i-1)})${g(h+i+3)}`).join``}`

Me gustó la idea de @ MartinEnder sobre indexar los -\|/personajes y quería ver cómo le iría en ES6. Aparentemente no lo hice tan bien. Tratando de averiguar si esto podría mejorarse usando for...of.

Ediciones

  • Logré eliminar regexp y la llamada a .replace, moviendo la indexación directamente en su g()lugar.
  • Accidentalmente conté f=en el segundo byte

Prueba

f=h=>n=>` ${[(g=(j,m=1)=>` -\\|/`[(j<n)*m])(h,2),g(h+1,3),g(h+2,4)].join``}${[...Array(h)].map((_,i)=>`
(${g(h-i-1)})${g(h+i+3)}`).join``}`
document.write(`<pre>${[[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7],[1,1],[1,5],[4,7],[5,0]].map(a=>f(a.shift())(a.shift())).join`

`}</pre>`)

Patrick Roberts
fuente
3

Java, 186 177 bytes

void f(int h,int n){for(int i=0;i<h+1;i++)System.out.print((i>0?"(":" ")+(i>0?n>h-i-2?"-":" ":n>h+0?"\\":" ")+(i>0?")":n>h+1?"|":" ")+(i>0?n>h+2+i?"-":" ":n>h+2?"/":" ")+"\n");}

Intente sin golf en línea

String f(int h, int n)
{
    String s=" ";
    s+=n>h+0?"\\":" ";
    s+=n>h+1? "|":" ";
    s+=n>h+2? "/":" ";
    s+="\n";

    for(int i=0; i<h; i++)
    {
        s+="(";
        s+=n>h-i-1?"-":" ";
        s+=")";
        s+=n>h+3+i?"-":" ";
        s+="\n";
    }

    return s;
}
Khaled.K
fuente
Puede guardar bytes utilizando una lambda. Probablemente incluso pueda omitir el cuerpo lambda
Daniel M.
2
¿Necesito algún IDE personalizado para compilar código Java sin control ? : D
Kimmax
@Kimmax .. D'oh!
Khaled.K
3

Excel, 131 bytes

Entrada tomada como una tupla, Altura Hadentro A1, Nadentro B1. La fórmula que contiene la celda debe tener activado el ajuste de texto. Sugiera usar una fuente monoespaciada.

=LEFT(" \|/",MAX(0,B1-A1+1))&"
"&REPT("(-)-
",MAX(0,B1-A1-3))&REPT("( )
",MAX(0,A1-B1))&REPT("(-)
",A1-MAX(0,B1-A1-3)-MAX(0,A1-B1))
Wernisch
fuente
Maravillosa solución! Usted debe agregar que esta toma de entrada como el 2-tupla de A1y B1y añadir la nota simple que esto requeriría la célula llamando a tener la opción de ajuste de texto para ser verdad. También quizás para obtener la alineación adecuada debería tener una fuente monoespaciada como Courier New o Lucidia Console
Taylor Scott el
1
Gracias @TaylorScott. Respuesta actualizada con sus sugerencias.
Wernisch
2

C ++ 11, 155 148 145 bytes

void f(int h,int n){cout<<string{" \\|/",max(min(3,n-h),0)+1}<<'\n';for(int i=0;i<h;++i)cout<<(h-i<=n?"(-)":"( )")<<(i<max(n-h-3,0)?"-\n":"\n");}

Sin golf :

void f(int h,int n)
{
  cout << string{" \\|/", max(min(3, n-h), 0) + 1} << '\n';
  for(int i=0; i<h; ++i)
    cout << (h-i <= n ? "(-)" : "( )") << (i < max(n-h-3,0) ? "-\n" : "\n");
}

Uso :

#include <iostream>
#include <string>
using namespace std;

void f(int h,int n){cout<<string{" \\|/",max(min(3,n-h),0)+1}<<'\n';for(int i=0;i<h;++i)cout<<(h-i<=n?"(-)":"( )")<<(i<max(n-h-3,0)?"-\n":"\n");}

int main()
{
  int h,n;
  cin >> h >> n;
  f(h, n);
}
Alexander Revo
fuente
137 bytes
ceilingcat
1

Python 3, 134 121 118 111 bytes

def f(h,n):print('\|/'[:max(0,n-h)]+'\n'+'\n'.join('(-)-'if h<n-x-3else('(-)','( )')[x+n<h] for x in range(h)))

Pruébelo aquí: https://repl.it/CYL1/0

Sin golf:

def f(h,n):
  top=['\|/'[:max(0,n-h)]]
  stack=['( )'if x+n<h else'(-)'for x in range(h)]
  overflow=top+stack
  v=n-3
  while v>h:
      overflow[h-v]+='-' #add side overflow
      v-=1

  print('\n'.join(overflow))

Me gustaría haber agregado el desbordamiento lateral a la comprensión de la lista, pero no pude incluirlo, así que tuve que ir con el ciclo while. ¡Guardado 13 bytes!

atlasólogo
fuente
La salida está desactivada, es probable que deba cambiar '\|/'[:max(0,n-h)]para que sea como la solución Python 2.
falta de bus
1

Pip , 50 bytes

Ps.(0Xa."\|/")@<bDC0Fi,aP"()"WV"- "@[b<a-ib<a+4+i]

Pruébalo en línea!

Ugh, esto es demasiado largo ... aunque no sé cómo acortarlo más. La indexación cíclica, que suele ser útil, esta vez cuesta bytes adicionales.

DLosc
fuente
1

PowerShell , 109 108 104 bytes

param($n,$h)-join" \|/"[0..(($d=$n-$h),0)[$d-lt0]]
1..$h|%{("( )","(-)")[$h-$_-lt$n]+"-"*($h+$_+2-lt$n)}

Pruébalo en línea!

Perdí mucho en indexación costosa pero aún decente. Sin embargo, no estoy seguro de que mi índice matemático sea óptimo. Robó algo de lógica de las otras respuestas para guardar un byte. También recordó la precedencia de hacer estallar algunos parens para -4 bytes.

Veskah
fuente
0

05AB1E , 45 bytes

-U…( )¸¹иε²N›ið'-:]RεX4-N@i'-«]" \|/"XdX*>£š»

Definitivamente se puede jugar al golf. No estoy muy contento con él en su forma actual tbh.

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

-                # Subtract the 2nd (implicit) input `n` from the 1st (implicit) input `h`
                 #  i.e. `h`=3, `n`=8 → 5
 U               # Pop and store it in variable `X`
…( )             # Push string "( )"
    ¸            # Wrap it into a list: ["( )"]
     ¹и          # Repeat it the first input (`h`) amount of times
                 #  i.e. 3 → ["( )","( )","( )"]
ε                # Map each to:
 ²Ni            #  If the second input `n` is larger than the map-index N:
                 #    i.e. `n`=8 >= N=0 → 1 (truthy)
     ð'-:       '#   Replace the space with a "-"
                 #    i.e. "( )" → "(-)"
]                # Close both the if and map
 R               # Reverse the list
ε                # Map each to:
 X4-N@i          #  If `X` minus 4 is larger than or equal to the map-index N:
                 #     i.e. `X`=5 and N=0 → 5-4 >= 0 → 1 (truthy)
                 #     i.e. `X`=5 and N=2 → 5-4 >= 2 → 0 (falsey)
       '-«      '#   Append a "-"
]                # Close both the if and map
 " \|/"          # Push String " \|/"
       Xd        # Check if `X` is 0 or positive (0 if negative, 1 if 0 or positive)
                 #  i.e. `X`=5 → 1 (truthy)
         X*      # Multiply it by `X`
                 #  i.e. 1 * 5 → 5
           >     # Increase it by 1
                 #  i.e. 5 → 6
            £    # Take that many character of the string " \|/"
                 #  i.e. 6 → " \|/"
             š   # Prepend it to the list
                 #  i.e. ["(-)-","(-)-","(-)"] and " \|/" → [" \|/","(-)-","(-)-","(-)"]
              »  # Join the list by newlines (and output implicitly)
                 #  i.e. [" \|/","(-)-","(-)-","(-)"] → " \|/\n(-)-\n(-)-\n(-)"
Kevin Cruijssen
fuente
Si te hace sentir mejor, esto es lo que tenía: LR'(ì')«¹x‚3+¬UŸ¦ζJ¹XŸJ¦1úr)˜»y eso es solo la mitad.
Urna mágica del pulpo