Puertas puertas puertas, vamos a la tienda de la puerta!

9

El desafío es doble:

Haz un programa que construya una puerta. ASCII, HTML o de otra manera

Haz que la puerta sea funcional. Abre y cierra

¡Se puede abrir mediante entrada o interacción!

  • Puerta no funcional +5 puntos.
  • Solo una puerta abierta +10 puntos.
  • Puerta interactiva +15 puntos.
  • Puerta elegante +20 puntos. Esto significa giratorio, plegable, etc.
  • Animación +20 puntos.
  • <100 caracteres +50 puntos.
  • -100 puntos por usar un programa diseñado específicamente para dibujar o animación.

Si tiene sugerencias de criterios, déjelas en los comentarios.

Ejemplo de puerta abierta no funcional:

<?php
$idiots_in_room=true;

if($idiots_in_room)
{

$count=20;
$count2=7;
for($i=0;$i<$count;$i++)
{

if($i==0)
{
echo str_repeat("-",10);
if($i==0){echo ".";}
echo "\n";
}
elseif($i==9)
{
echo str_repeat("-",10);
echo str_repeat(" ",7)."o"."|";
echo "\n";
}
elseif($i<=9)
{

echo str_repeat("-",1).str_repeat(" ",8).str_repeat("-",1);

echo ($i<5) ? str_repeat(" ",$i*2)."\\" : str_repeat(" ",8)."|";
echo "\n";
}
elseif($i<=14)
{
if($i>9){echo str_repeat(" ",$i)."\\";}
echo str_repeat(" ",$count2--)."|";
echo "\n";
}

}
}

Salida de ejemplo:

----------.
-        -  \
-        -    \
-        -      \
-        -        \
-        -        |
-        -        |
-        -        |
-        -        |
----------       o|
          \       |
           \      |
            \     |
             \    |
              \   |
Evento_Horizonte
fuente
¿Tienes algún ejemplo de puerta?
beary605
@ beary605 Ejemplo no funcional proporcionado
Event_Horizon
2
definir una "puerta"
Joel Cornett
¿Qué pasa con el uso de archivos externos para el código ASCII (o imágenes) para las puertas? ¿Cómo cuentan?
jazzpi

Respuestas:

22

JavaScript, 4380 caracteres, 65 puntos (?)

ASCII? Cheque. HTML? Cheque. Es una puerta? Cheque. Puerta que se puede abrir? Cheque. ¿Interactivo? Cheque. ¿Lujoso? Puertas dobles con bisagras colocadas correctamente, espero que eso cuente. ¿Animado? Cheque. ¿Menos de 100 caracteres? Decir ah. ¿No utiliza instalaciones destinadas a dibujar? Cheque.

Demo en vivo. (Nota: en mis pruebas con Firefox, hacer clic en las puertas más de una vez no funciona; por alguna razón, el controlador de eventos no se activa de nuevo y me desconcierta por qué; señalar lo que hice mal sería bienvenido. Sin embargo, es posible que desee ejecutar esto en Chrome de todos modos para un rendimiento JS decente).

<title>Door</title>
<pre onmouseup="turn();" style="display: table; margin: auto; font-family: 'Monaco', monospace; font-size: 0.6em; line-height: 0.7em;">
</pre>
<p>Click doors to open or close.</p>
<script>

  // Appearance of hit surface - global used to avoid allocating a record to return
  var mat;

  // Scene construction tools
  function box(size,ms) {
    return function (x, y, z) {
      var vdist0 = Math.abs(x) - size[0];
      var vdist1 = Math.abs(y) - size[1];
      var vdist2 = Math.abs(z) - size[2];
      mat = vdist0 > vdist1 && vdist0 > vdist2 ? ms[0] :
            vdist1 > vdist0 && vdist1 > vdist2 ? ms[1] :
            ms[2];
      return Math.max(vdist0, vdist1, vdist2);
    };
  }
  function translate(vec, obj) {
    var dx = vec[0];
    var dy = vec[1];
    var dz = vec[2];
    return function (x, y, z) { return obj(x - dx, y - dy, z - dz); };
  }
  function mirror(obj) {
    return function (x, y, z) { return obj(-x, y, z); };
  }
  function spin(obj) {
    return function (x, y, z) {
      var a = Date.now() / 1000;
      var s = Math.sin(a);
      var c = Math.cos(a);
      return obj(
        x * c + z * s,
        y,
        x * -s + z * c
      );
    };
  }
  function doorturn(obj) {
    return function (x, y, z) {
      var a = pos;
      var s = Math.sin(a);
      var c = Math.cos(a);
      return obj(
        x * c + z * s,
        y,
        x * -s + z * c
      );
    };
  }
  function rotx(a, obj) {
    return function (x, y, z) {
      var s = Math.sin(a);
      var c = Math.cos(a);
      return obj(
        x,
        y * c + z * s,
        y * -s + z * c
      );
    };
  }
  function roty(a, obj) {
    return function (x, y, z) {
      var s = Math.sin(a);
      var c = Math.cos(a);
      return obj(
        x * c + z * s,
        y,
        x * -s + z * c
      );
    };
  }
  function union(as, bs) {
    return function (x, y, z) {
      var a = as(x, y, z); var am = mat;
      var b = bs(x, y, z);
      if (a < b) {
        mat = am;
        return a;
      } else {
        return b;
      }
    };
  }

  // Display parameters
  var vw = 80, vh = 80;
  var timestep = 1/30;

  // Scene
  var wallhwidth = 30;
  var wallhheight = 35;
  var wallmat = [";", "\u2014", ":"];
  var dhwidth = 10;
  var dhheight = 20;
  var hthick = 2;
  var door = translate([-dhwidth*2, 0, 0], doorturn(translate([hthick, 0, dhwidth], box([hthick, dhheight, dhwidth], [".", "\u2014", "|"]))));
  var doors = union(door, mirror(door));
  var wall = union(
    union(
      translate([dhwidth*2+wallhwidth, 0, -hthick], box([wallhwidth, wallhheight, hthick], wallmat)),
      translate([-dhwidth*2-wallhwidth, 0, -hthick], box([wallhwidth, wallhheight, hthick], wallmat))),
    translate([0, wallhheight-(wallhheight-dhheight)/2, -hthick], box([dhwidth*2, (wallhheight-dhheight)/2, hthick], wallmat)));
  var floor = translate([0, -dhheight - 1.1, 0], box([100, 1, 100], ["/","/","/"]));
  var sill = translate([0, -dhheight - 1, -hthick], box([dhwidth*2, 1, hthick], ["\\","%","\\"]));
  var sbox = translate([0, 0, -12], spin(box([8, 8, 8], ["x", "y", "z"])))
  var scene = union(sbox, union(union(wall, doors), union(floor, sill)));
  var view = translate([vw/2, vh/2, -100], rotx(0.2, roty(-0.6, scene)));

  // Animation state
  var pos = -Math.PI/2;
  var dpos = 0;
  var interval;

  // Main loop function
  function r() {
    // Update state
    pos += dpos * timestep;
    if (Math.abs(pos) >= Math.PI/2) {
      dpos = 0;
      pos = Math.PI/2 * pos / Math.abs(pos);
      if (pos < 0) { // no animation needed
        clearInterval(interval); interval = undefined;
      }
    }

    // Render scene
    var t = [];
    for (var y = vh - 1; y >= 0; y--) {
      for (var x = 0; x < vw; x++) {
        var z = 0, distance;
        while ((distance = view(x,y,z)) > 0.12) {
          z -= distance;
          if (!isFinite(z) || z < -1000) {
            mat = " ";
            break;
          }
        }
        t.push(mat);
      }
      t.push("\n");
    }
    document.getElementsByTagName("pre")[0].textContent = t.join("");
  }

  // Click handler
  function turn() {
    if (dpos !== 0) {
      dpos *= -1;
    } else {
      dpos = (pos < 0 ? 1 : -1) * 2.3;
    }
    if (!interval) {
      interval = setInterval(r, timestep*1000);
    }
  }

  // Render initial state
  r();
</script>

Cuando está cerrado, las puertas se ven así:

(Captura de pantalla de puertas cerradas).

Kevin Reid
fuente
1
Debo admitir que es un trabajo hermoso allí.
Event_Horizon
1
Eso es asombroso.
MrZander
9

HTML y CSS3, 55 puntos

La puerta animada, interactiva y elegante tiene 55 puntos, creo.

Sí, esto se abre como cualquier otra puerta, pero si una puerta corredera cuenta como elegante, ¿por qué no una giratoria? Si una giratoria no es elegante, bueno, una puerta corredera no es un problema:)

Una demostración está disponible en http://result.dabblet.com/gist/3132160/ac475112dbba493d2dd7d98493d4f4ceaa209a7c . Haga clic en el pomo de la puerta para abrir y cerrar. No hay JavaScript involucrado; Es solo la magia de CSS3.

#wall {
    background-color: #eee;
    bottom: 0;
    left: 0;
    position: absolute;
    right: 0;
    top: 0;
    transform: rotateX(-10deg);
    transform-origin: 0 100%;
    transform-style: preserve-3d;
}

#door-container {
    background-color: black;
    height: 100%;
    margin: 0 auto;
    width: 300px;
}

#door {
    background-color: brown;
    height: 100%;
    margin: auto;
    position: relative;
    transform-origin: 0 0;
    transition: transform 0.5s ease;
    width: 300px;
}

#door .knob {
    background-color: gold;
    border-radius: 10px;
    height: 20px;
    margin-top: -10px;
    position: absolute;
    right: 10px;
    top: 50%;
    width: 20px;
}

#open:target + #wall #door {
    transform: rotateY(-145deg);
}

#open:target + #wall #open-link {
    display: none;
}

#close-link {
    display: none;
}

#open:target + #wall #close-link {
    display: inline;
}
<span id="open"></span>
<div id="wall">
    <div id="door-container">
        <div id="door">
            <a href="#open" id="open-link" class="knob"></a>
            <a href="#closed" id="close-link" class="knob"></a>
        </div>
    </div>
</div>
Ry-
fuente
Por Deslizar me refería originalmente a "Puerta corrediza de vidrio" como para un patio, pero pude ver cómo no se consideraría elegante (especialmente en términos de codificación, ya que es mucho más fácil que una rotación). Además, por puerta giratoria me refería a giratoria. Corregirá
Event_Horizon
6

Mathematica 271 caracteres

Manipulate[a = {0, 0, 0}; b = {0, 0, h}; p = Polygon; c = Cuboid; t = Rotate;Graphics3D[{c@{{-w - 1, 0, 0}, {-w, 1, h}}, c@{{w + 1, 0, 0}, {w, 1, h}},t[p@{a, b, {-w, 0, h}, {-w, 0, 0}}, r, {0, 0, 1}, {- 2 w/3, -w/3, 0}], t[p@{a, b, {w, 0, h}, {w, 0, 0}}, -r, {0, 0, 1}, { 2 w/3, -w/3, 0}]}],{{r, 0}, 0, 3/2}, {{w, 2}, 1, 3}, {{h, 4}, 3, 5}]

puertas

Las puertas dobles

  • abierto por rotación de cero a 90 grados (usando el control deslizante r)
  • los controles deslizantes ( hy w) pueden establecer su altura y anchura .
  • están en un entorno de iluminación 3D
  • puede rotarse interactivamente para verse desde diferentes ángulos.

El código se basa en un programa de Sándor Kabal.

DavidC
fuente
4

Python - 65 puntos, 86 caracteres

Interactivo y menos de 100 caracteres.

Espera entrada y te muestra la puerta . La entrada válida es "abrir" y "cerrar" y "adiós".

g,s=1,'open close'
while g:
 i=raw_input()
 print '_'+'/_ '[s.find(i)/5]+'_'
 g=i in s
daniero
fuente
Probablemente podría configurarlo para alternar abrir / cerrar sin escribir comandos y cumplir con los requisitos; le ahorraría algunos caracteres.
Joel Cornett
2
Probablemente, pero una vez más, esto no es código golf, por lo que realmente no importa;)
daniero
1
bastante aburrido mirando la puerta, pero una gran apariencia ratonera
ardnew
4

Mathematica 127 caracteres

Esta es una implementación más simplificada que la que presenté anteriormente. Tiene una sola puerta. La sola puerta

  • abre por rotación de cero a 90 grados (usando el control deslizante o)
  • está en un entorno de iluminación 3D
  • puede rotarse interactivamente para verse desde diferentes ángulos.

Sin embargo, utiliza una altura y ancho de puerta fijos.

Manipulate[a = {0, 0, 0}; Graphics3D[{Tube[{a, {1, 0, 0}, {1, 0, 2}, {0, 0, 2}, a}, .03],Rotate[Cuboid@{a, {1, -.1, 2}}, o, {0, 0, 1}, a]}], {o, 0, -Pi/2}]

puerta2

DavidC
fuente
Probablemente debería haber editado su envío anterior, en lugar de enviar uno nuevo.
Joe the Person
@ fireDude67 Si esto hubiera sido un desafío de Code Golf, simplemente habría reemplazado mi entrada anterior con el código más corto. Sin embargo, el SO indicó interés tanto en programas cortos como en programas más complicados (puertas con más funciones).
DavidC
oh lo siento, me confundí entonces
Joe the Person
@ fireDude67 No hay problema.
DavidC