Türen Türen Türen, komm runter zum Türladen!

9

Die Herausforderung ist zweifach:

Machen Sie ein Programm, das eine Tür baut. ASCII, HTML oder anders

Machen Sie die Tür funktionsfähig. Öffnet und schließt

Entweder durch Eingabe oder Interaktion zu öffnen!

  • Nicht funktionierende Tür +5 Punkte.
  • Nur eine zu öffnende Tür +10 Punkte.
  • Interaktive Tür +15 Punkte.
  • Ausgefallene Tür +20 Punkte. Dies bedeutet Drehen, Bifold etc.
  • Animierte +20 Punkte.
  • <100 Zeichen +50 Punkte.
  • -100 Punkte für die Verwendung eines Programms, das speziell für das Zeichnen oder Animieren entwickelt wurde.

Wenn Sie Kriterienvorschläge haben, lassen Sie diese in den Kommentaren.

Beispiel für eine nicht funktionierende offene Tür:

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

}
}

Beispielausgabe:

----------.
-        -  \
-        -    \
-        -      \
-        -        \
-        -        |
-        -        |
-        -        |
-        -        |
----------       o|
          \       |
           \      |
            \     |
             \    |
              \   |
Ereignishorizont
quelle
Haben Sie Türbeispiele?
Beary605
@ beary605 Nicht funktionierendes Beispiel bereitgestellt
Event_Horizon
2
Definieren Sie eine "Tür"
Joel Cornett
Was ist mit der Verwendung externer Dateien für ASCII-Code (oder Bilder) für die Türen? Wie zählen sie?
Jazzpi

Antworten:

22

JavaScript, 4380 Zeichen, 65 (?) Punkte

ASCII? Prüfen. HTML? Prüfen. Ist eine Tür? Prüfen. Öffnungsfähige Tür? Prüfen. Interaktiv? Prüfen. Schick? Doppeltüren mit richtig positionierten Scharnieren, ich hoffe das zählt. Animiert? Prüfen. Unter 100 Zeichen? Ha. Verwenden Sie keine Einrichtungen zum Zeichnen? Prüfen.

Live-Demo. (Hinweis: Bei meinen Tests mit Firefox funktioniert es nicht, mehrmals auf die Türen zu klicken. Aus irgendeinem Grund wird der Ereignishandler nicht erneut ausgelöst, und ich bin verblüfft, warum. Es wäre willkommen, darauf hinzuweisen, was ich falsch gemacht habe. Möglicherweise möchten Sie dies jedoch trotzdem in Chrome ausführen, um eine anständige JS-Leistung zu erzielen.)

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

Im geschlossenen Zustand sehen die Türen folgendermaßen aus:

(Screenshot von geschlossenen Türen.)

Kevin Reid
quelle
1
Ich muss zugeben, das ist eine schöne Arbeit dort.
Event_Horizon
1
Das ist genial.
MrZander
9

HTML & CSS3, 55 Punkte

Ausgefallene, interaktive, animierte Tür ist 55 Punkte, denke ich.

Ja, dies öffnet sich wie jede andere Tür, aber wenn eine Schiebetür als ausgefallen gilt, warum nicht eine rotierende? Wenn eine rotierende nicht schick ist, ist eine Schiebetür kein Problem:)

Eine Demo finden Sie unter http://result.dabblet.com/gist/3132160/ac475112dbba493d2dd7d98493d4f4ceaa209a7c . Klicken Sie auf den Türknauf, um ihn zu öffnen und zu schließen. Kein JavaScript beteiligt; Es ist nur die Magie von 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-
quelle
Mit Schieben meinte ich ursprünglich "Glasschiebetür" wie für eine Terrasse, aber ich konnte sehen, dass es nicht als schick angesehen werden würde (insbesondere in Bezug auf die Codierung, da es viel einfacher ist als ein Drehen). Mit Drehtür meinte ich auch Drehen. Wird korrigieren.
Event_Horizon
6

Mathematica 271 Zeichen

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

Türen

Die Doppeltüren

  • Öffnen durch Drehen von Null auf 90 Grad (mit dem Schieberegler r)
  • Die Höhe und Breite kann durch Schieberegler ( hund w) festgelegt werden.
  • befinden sich in einer 3D-Beleuchtungsumgebung
  • kann interaktiv gedreht werden, um aus verschiedenen Winkeln betrachtet zu werden.

Der Code basiert auf einem Programm von Sándor Kabal.

DavidC
quelle
4

Python - 65 Punkte, 86 Zeichen

Interaktiv und weniger als 100 Zeichen.

Wartet auf Eingabe und zeigt Ihnen die Tür . Gültige Eingabe ist "Öffnen" und "Schließen" und "Tschüss".

g,s=1,'open close'
while g:
 i=raw_input()
 print '_'+'/_ '[s.find(i)/5]+'_'
 g=i in s
daniero
quelle
Sie könnten es wahrscheinlich so einstellen, dass es ohne Eingabe von Befehlen auf Öffnen / Schließen umschaltet und trotzdem die Anforderungen erfüllt - es würde Ihnen ein paar Zeichen ersparen.
Joel Cornett
2
Wahrscheinlich, aber
andererseits
1
ziemlich langweilig aussehende Tür, aber eine großartig aussehende Mausefalle
ardnew
4

Mathematica 127 Zeichen

Dies ist eine optimierte Implementierung als die, die ich zuvor eingereicht habe. Es hat eine einzige Tür. Die einzige Tür

  • öffnet durch Drehen von Null auf 90 Grad (mit dem Schieberegler o )
  • befindet sich in einer 3D-Beleuchtungsumgebung
  • kann interaktiv gedreht werden, um aus verschiedenen Winkeln betrachtet zu werden.

Es wird jedoch eine feste Türhöhe und -breite verwendet.

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

Tür2

DavidC
quelle
Sie sollten wahrscheinlich Ihre vorherige Einreichung bearbeitet haben, anstatt eine neue einzureichen.
Joe die Person
@ fireDude67 Wenn dies eine Code Golf-Herausforderung gewesen wäre, hätte ich meinen früheren Eintrag einfach durch den kürzeren Code ersetzt. Die SO zeigte jedoch Interesse sowohl an Kurzprogrammen als auch an komplizierteren Programmen (Türen mit mehr Funktionen).
DavidC
Oh, tut mir leid, ich war damals verwirrt
Joe the Person
@ fireDude67 Kein Problem.
DavidC