Portes portes portes, allez au magasin de porte!

9

Le défi est double:

Faites un programme qui construit une porte. ASCII, HTML ou autre

Rendez la porte fonctionnelle. Ouvre et ferme

Soit ouvert par entrée ou interaction!

  • Porte non fonctionnelle +5 points.
  • Juste une porte ouverte +10 points.
  • Porte interactive +15 points.
  • Porte fantaisie +20 points. Cela signifie tournant, à deux volets, etc.
  • Animé +20 points.
  • <100 caractères +50 points.
  • -100 points pour l'utilisation d'un programme spécialement conçu pour le dessin ou l'animation.

Si vous avez des suggestions de critères, laissez-les dans les commentaires.

Exemple de porte ouverte non fonctionnelle:

<?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";
}

}
}

Exemple de sortie:

----------.
-        -  \
-        -    \
-        -      \
-        -        \
-        -        |
-        -        |
-        -        |
-        -        |
----------       o|
          \       |
           \      |
            \     |
             \    |
              \   |
Event_Horizon
la source
Avez-vous des exemples de portes?
beary605
@ beary605 Exemple non fonctionnel fourni
Event_Horizon
2
définir une "porte"
Joel Cornett
Qu'en est-il de l'utilisation de fichiers externes pour le code ASCII (ou des images) pour les portes? Comment comptent-ils?
jazzpi

Réponses:

22

JavaScript, 4380 caractères, 65 (?) Points

ASCII? Vérifier. HTML? Vérifier. Est une porte? Vérifier. Porte ouvrable? Vérifier. Interactif? Vérifier. Fantaisie? Portes doubles avec charnières correctement positionnées, j'espère que cela compte. Animé? Vérifier. Moins de 100 caractères? Ha. Vous n'utilisez pas les installations destinées au dessin? Vérifier.

Démo en direct. (Remarque: lors de mes tests avec Firefox, cliquer sur les portes plus d'une fois ne fonctionne pas - pour une raison quelconque, le gestionnaire d'événements ne se déclenche plus et je suis perplexe quant à la raison; souligner ce que j'ai fait de mal serait le bienvenu. Cependant, vous voudrez peut-être l'exécuter dans Chrome pour des performances JS décentes.)

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

Lorsqu'elles sont fermées, les portes ressemblent à ceci:

(Capture d'écran de portes fermées.)

Kevin Reid
la source
1
Je dois l'admettre, c'est du beau travail là-bas.
Event_Horizon
1
C'est génial.
MrZander
9

HTML et CSS3, 55 points

Fantastique, interactive, la porte animée est de 55 points, je pense.

Oui, cela s'ouvre comme n'importe quelle autre porte, mais si une porte coulissante compte comme fantaisie, pourquoi pas une porte rotative? Si une rotative n'est pas sophistiquée, eh bien, une porte coulissante n'est pas un problème:)

Une démo est disponible sur http://result.dabblet.com/gist/3132160/ac475112dbba493d2dd7d98493d4f4ceaa209a7c . Cliquez sur la poignée de porte pour ouvrir et fermer. Aucun JavaScript n'est impliqué; c'est juste la magie 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-
la source
Par coulissant, je voulais dire à l'origine "porte coulissante en verre" comme pour un patio, mais je pouvais voir comment cela ne serait pas considéré comme fantaisie (en particulier en termes de codage, car c'est beaucoup plus facile qu'une rotation). De plus, par porte pivotante, je voulais dire tournante. Corrigera.
Event_Horizon
6

Mathematica 271 caractères

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

des portes

Les doubles portes

  • ouvert par rotation de zéro à 90 degrés (à l'aide du curseur r)
  • la hauteur et la largeur peuvent être définies par des curseurs ( het w).
  • sont dans un environnement d'éclairage 3D
  • peut être pivoté interactivement pour être vu sous différents angles.

Le code est basé sur un programme de Sándor Kabal.

DavidC
la source
4

Python - 65 points, 86 caractères

Interactif et moins de 100 caractères.

Attend l'entrée et vous montre la porte . L'entrée valide est "open" et "close" et "bye".

g,s=1,'open close'
while g:
 i=raw_input()
 print '_'+'/_ '[s.find(i)/5]+'_'
 g=i in s
daniero
la source
Vous pourriez probablement le configurer pour basculer entre l'ouverture et la fermeture sans taper de commandes et toujours répondre aux exigences - cela vous ferait économiser quelques caractères.
Joel Cornett
2
Probablement, mais là encore, ce n'est pas du golf de code, donc ça n'a pas vraiment d'importance;)
daniero
1
porte assez ennuyeuse, mais une superbe souricière
ardnew
4

Mathematica 127 caractères

Il s'agit d'une mise en œuvre plus rationalisée que celle que j'ai soumise plus tôt. Il a une seule porte. La porte unique

  • s'ouvre par rotation de zéro à 90 degrés (à l'aide du curseur o)
  • est dans un environnement d'éclairage 3D
  • peut être pivoté interactivement pour être vu sous différents angles.

Cependant, il utilise une hauteur et une largeur de porte fixes.

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

porte2

DavidC
la source
Vous auriez probablement dû modifier votre soumission précédente, plutôt que d'en soumettre une nouvelle.
Joe the Person
@ fireDude67 Si cela avait été un défi de Code Golf, j'aurais simplement remplacé mon entrée précédente par le code plus court. Cependant, l'ER a indiqué son intérêt pour les programmes courts et les programmes plus compliqués (portes avec plus de fonctionnalités).
DavidC
oh désolé, je suis devenu confus alors
Joe la personne
@ fireDude67 Aucun problème.
DavidC