Porte porte porte, vieni giù al negozio di porte!


9

La sfida è duplice:

Crea un programma che costruisca una porta. ASCII, HTML o altro

Rendi funzionale la porta. Apre e chiude

O open-grado attraverso input o interazione!

  • Porta non funzionale +5 punti.
  • Solo una porta in grado di aprire +10 punti.
  • Porta interattiva +15 punti.
  • Porta fantasia +20 punti. Ciò significa rotazione, bifold ecc
  • Animato +20 punti.
  • <100 caratteri +50 punti.
  • -100 punti per l'utilizzo di un programma appositamente progettato per il disegno o l'animazione.

Se hai dei criteri, lasciali nei commenti.

Esempio di porta aperta non funzionale:

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

}
}

Esempio di output:

----------.
-        -  \
-        -    \
-        -      \
-        -        \
-        -        |
-        -        |
-        -        |
-        -        |
----------       o|
          \       |
           \      |
            \     |
             \    |
              \   |

Hai qualche esempio di porta?
beary605

@ beary605 Esempio non funzionale fornito
Event_Horizon

2
definire una "porta"
Joel Cornett,

Che dire dell'utilizzo di file esterni per il codice ASCII (o immagini) per le porte? Come contano?
jazzpi,

Risposte:


22

JavaScript, 4380 caratteri, 65 (?) Punti

ASCII? Dai un'occhiata. HTML? Dai un'occhiata. È una porta? Dai un'occhiata. Porta apribile? Dai un'occhiata. Interactive? Dai un'occhiata. Fantasia? Doppie porte con cerniere posizionate correttamente, spero che conta. Animato? Dai un'occhiata. Meno di 100 caratteri? Ha. Non stai usando le strutture destinate al disegno? Dai un'occhiata.

Dimostrazione dal vivo. (Nota: nei miei test con Firefox, fare clic sulle porte più di una volta non funziona - per qualche motivo il gestore dell'evento non si accende di nuovo e sono sconcertato sul perché; sottolineare che ho fatto di sbagliato sarebbe il benvenuto. Tuttavia, potresti voler eseguire questo in Chrome comunque per prestazioni JS decenti.)

<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 sono chiuse, le porte si presentano così:

(Schermata delle porte chiuse.)


1
Devo ammetterlo, ecco un bel lavoro lì.
Event_Horizon

1
Questo è impressionante.
MrZander,

9

HTML e CSS3, 55 punti

Penso che la porta di fantasia, interattiva e animata sia di 55 punti.

Sì, questo si apre come qualsiasi altra porta, ma se una porta scorrevole conta come fantasia, perché non una rotante? Se uno rotante non è elegante, beh, una porta scorrevole non è un problema:)

Una demo è disponibile su http://result.dabblet.com/gist/3132160/ac475112dbba493d2dd7d98493d4f4ceaa209a7c . Fare clic sulla maniglia della porta per aprire e chiudere. Nessun JavaScript coinvolto; è solo la magia di 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>

Inizialmente, per "Scorrevole" intendevo "porta scorrevole in vetro" come per un patio, ma potevo vedere come non sarebbe stato considerato elegante (specialmente in termini di codifica, poiché è molto più facile di una rotazione). Inoltre, per Porta girevole intendevo Revolving. Correggerò.
Event_Horizon

6

Mathematica 271 caratteri

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

porte

Le doppie porte

  • aperto tramite rotazione da zero a 90 gradi (usando il cursore r)
  • possono essere regolati in altezza e larghezza dai cursori ( he w).
  • sono in un ambiente di illuminazione 3D
  • può essere ruotato in modo interattivo per essere visualizzato da diverse angolazioni.

Il codice si basa su un programma di Sándor Kabal.


4

Python - 65 punti, 86 caratteri

Interattivo e meno di 100 caratteri.

Attende input e ti mostra la porta . L'input valido è "open" e "close" e "bye".

g,s=1,'open close'
while g:
 i=raw_input()
 print '_'+'/_ '[s.find(i)/5]+'_'
 g=i in s

Probabilmente potresti impostarlo per attivare / disattivare l'apertura senza digitare i comandi e comunque soddisfare i requisiti: ti risparmierebbe alcuni caratteri.
Joel Cornett,

2
Probabilmente, ma ancora una volta, questo non è code-golf, quindi non importa davvero;)
daniero

1
porta piuttosto noiosa, ma una grande trappola per topi
ardnew

4

Mathematica 127 caratteri

Questa è un'implementazione più snella di quella che ho presentato in precedenza. Ha una sola porta. La singola porta

  • si apre ruotando da zero a 90 gradi (usando il cursore o)
  • è in un ambiente di illuminazione 3D
  • può essere ruotato in modo interattivo per essere visualizzato da diverse angolazioni.

Tuttavia, utilizza un'altezza e una larghezza fisse della 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


Probabilmente avresti dovuto modificare il tuo precedente invio, piuttosto che inviarne uno nuovo.
Joe the Person,

@ fireDude67 Se questa fosse stata una sfida al Code Golf, avrei semplicemente sostituito la mia voce precedente con il codice più breve. Tuttavia, la SO ha indicato interesse sia per i programmi brevi che per i programmi più complicati (porte con più funzioni).
DavidC,

oh scusa mi sono confuso allora
Joe la persona

@ fireDude67 Nessun problema.
DavidC,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.