Portas portas portas, vamos até a loja da porta!

9

O desafio é duplo:

Faça um programa que construa uma porta. ASCII, HTML ou outro

Torne a porta funcional. Abre e fecha

Pode ser aberto através de entrada ou interação!

  • Porta não funcional +5 pontos.
  • Apenas uma porta aberta +10 pontos.
  • Porta interativa +15 pontos.
  • Porta chique +20 pontos. Isso significa rotativo, dobrável etc
  • +20 pontos animados.
  • <100 caracteres +50 pontos.
  • -100 pontos para usar um programa projetado especificamente para desenho ou animação.

Se você tiver sugestões de critérios, deixe-as nos comentários.

Exemplo de porta aberta não 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";
}

}
}

Saída de exemplo:

----------.
-        -  \
-        -    \
-        -      \
-        -        \
-        -        |
-        -        |
-        -        |
-        -        |
----------       o|
          \       |
           \      |
            \     |
             \    |
              \   |
Horizonte de eventos
fonte
Você tem algum exemplo de porta?
22712
@ beary605 Exemplo não funcional fornecido
Event_Horizon 13/07/12
2
definir uma "porta"
Joel Cornett
Que tal usar arquivos externos para código (ou imagens) ASCII para as portas? Como eles contam?
jazzpi

Respostas:

22

JavaScript, 4380 caracteres, 65 pontos (?)

ASCII? Verifica. HTML? Verifica. É uma porta? Verifica. Porta que pode ser aberta? Verifica. Interativo? Verifica. Chique? Portas duplas com dobradiças bem posicionadas, espero que isso conte. Animado? Verifica. Menos de 100 caracteres? Ha. Não utiliza instalações destinadas ao desenho? Verifica.

Demonstração ao vivo.(Nota: Nos meus testes com o Firefox, clicar nas portas mais de uma vez não funciona - por algum motivo, o manipulador de eventos não é acionado novamente e estou confuso sobre o motivo; apontar o que fiz de errado seria bem-vindo. No entanto, convém executar isso no Chrome de qualquer maneira para obter um desempenho decente em JS.)

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

Quando fechadas, as portas ficam assim:

(Captura de tela de portas fechadas.)

Kevin Reid
fonte
11
Tenho que admitir, isso é um belo trabalho lá.
Event_Horizon
11
Isso é incrível.
MrZander
9

HTML e CSS3, 55 pontos

Porta chique, interativa e animada tem 55 pontos, eu acho.

Sim, isso se abre como qualquer outra porta, mas se uma porta deslizante conta como sofisticada, por que não uma porta rotativa? Se um rotativo não é chique, bem, uma porta deslizante não é problema:)

Uma demonstração está disponível em http://result.dabblet.com/gist/3132160/ac475112dbba493d2dd7d98493d4f4ceaa209a7c . Clique na maçaneta da porta para abrir e fechar. Nenhum JavaScript envolvido; é apenas a mágica do 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-
fonte
Ao deslizar, eu originalmente quis dizer "porta de vidro deslizante" como para um pátio, mas pude ver como ela não seria considerada sofisticada (especialmente em termos de codificação, pois é muito mais fácil do que girar). Além disso, ao girar a porta eu quis dizer Revolving. Corrigirá.
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}]

portas

As portas duplas

  • aberto por rotação de zero a 90 graus (usando o controle deslizante r)
  • pode ter sua altura e largura definidas por controles deslizantes ( he w).
  • estão em um ambiente de iluminação 3D
  • pode ser girado interativamente para ser visto de diferentes ângulos.

O código é baseado em um programa de Sándor Kabal.

DavidC
fonte
4

Python - 65 pontos, 86 caracteres

Interativo e menos de 100 caracteres.

Aguarda entrada e mostra a porta . A entrada válida é "aberto" e "fechado" e "tchau".

g,s=1,'open close'
while g:
 i=raw_input()
 print '_'+'/_ '[s.find(i)/5]+'_'
 g=i in s
daniero
fonte
Você provavelmente poderia configurá-lo para alternar entre abrir / fechar sem digitar comandos e ainda atender aos requisitos - isso pouparia alguns caracteres.
Joel Cornett
2
Provavelmente, mas, novamente, isso não é código-golfe, por isso realmente não importa;)
daniero
11
porta muito chata, mas uma ratoeira de ótima aparência
ardnew
4

Mathematica 127 caracteres

Esta é uma implementação mais simplificada do que a que enviei anteriormente. Tem uma única porta. A porta única

  • abre por rotação de zero a 90 graus (usando o controle deslizante o)
  • está em um ambiente de iluminação 3D
  • pode ser girado interativamente para ser visto de diferentes ângulos.

No entanto, utiliza uma altura e largura fixas da porta.

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

door2

DavidC
fonte
Você provavelmente deveria ter editado seu envio anterior, em vez de enviar um novo.
Joe the Person
@ fireDude67 Se este fosse um desafio do Code Golf, eu teria simplesmente substituído minha entrada anterior pelo código mais curto. No entanto, o SO indicou interesse em programas curtos e programas mais complicados (portas com mais recursos).
21412
oh desculpe eu fiquei confuso depois
Joe Pessoa
@ fireDude67 Sem problemas.
21412