ประตูประตูประตู c'mon ลงไปที่ร้านขายประตู!


9

ความท้าทายคือสองเท่า:

สร้างโปรแกรมที่สร้างประตู ASCII, HTML หรืออย่างอื่น

ทำให้ประตูทำงานได้ เปิดและปิด

เปิดทั้งผ่านอินพุตหรือการโต้ตอบ!

  • ประตูไม่ทำงาน +5 คะแนน
  • แค่ประตูที่เปิดได้ +10 คะแนน
  • ประตูแบบโต้ตอบ +15 คะแนน
  • ประตูแฟนซี +20 คะแนน ซึ่งหมายถึงการหมุนเวียนหมุนวนไปมา ฯลฯ
  • เคลื่อนไหว 20 คะแนน
  • <100 ตัวอักษร +50 คะแนน
  • -100 คะแนนสำหรับการใช้โปรแกรมที่ออกแบบมาโดยเฉพาะสำหรับการวาดภาพหรือภาพเคลื่อนไหว

หากคุณมีข้อเสนอแนะเกณฑ์ปล่อยไว้ในความคิดเห็น

ตัวอย่างประตูเปิดไม่ทำงาน:

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

}
}

ตัวอย่างผลลัพธ์:

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

คุณมีตัวอย่างประตูหรือไม่?
beary605

@ beary605 ตัวอย่างที่ไม่มีฟังก์ชันให้
Event_Horizon

2
กำหนด "ประตู"
Joel Cornett

สิ่งที่เกี่ยวกับการใช้ไฟล์ภายนอกสำหรับรหัส ASCII (หรือภาพ) สำหรับประตู? พวกเขาจะนับอย่างไร
jazzpi

คำตอบ:


22

JavaScript, 4380 ตัวอักษร, 65 (?) คะแนน

ASCII? ตรวจสอบ HTML ได้ไหม? ตรวจสอบ เป็นประตูหรือไม่? ตรวจสอบ ประตูเปิดได้ไหม ตรวจสอบ เชิงโต้ตอบ? ตรวจสอบ แฟนซี? ประตูคู่พร้อมบานพับในตำแหน่งที่เหมาะสมฉันหวังว่าจะมีค่า ภาพเคลื่อนไหว? ตรวจสอบ ต่ำกว่า 100 ตัวอักษร? ฮ้า หากไม่ได้ใช้สิ่งอำนวยความสะดวกสำหรับการวาดภาพ ตรวจสอบ

การสาธิตสด (หมายเหตุ: ในการทดสอบของฉันกับ Firefox การคลิกที่ประตูมากกว่าหนึ่งครั้งไม่ทำงาน - ด้วยเหตุผลบางประการตัวจัดการเหตุการณ์ไม่ทำงานอีกครั้งและฉันงุนงงว่าทำไม แม้ว่าคุณอาจต้องการเรียกใช้ใน Chrome เพื่อประสิทธิภาพ 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>

เมื่อปิดประตูจะมีลักษณะดังนี้:

(ภาพหน้าจอของประตูที่ปิด)


1
ต้องยอมรับว่านั่นเป็นงานที่สวยงาม
Event_Horizon

1
มันยอดเยี่ยมมาก
MrZander

9

HTML & CSS3, 55 คะแนน

ฉันคิดว่าประตูแฟนซีที่โต้ตอบและเคลื่อนไหวได้ 55 คะแนน

ใช่ประตูนี้เปิดเหมือนประตูอื่น แต่ถ้าประตูบานเลื่อนนับว่าแฟนซีทำไมประตูหมุนไม่ได้? หากประตูหมุนไม่แฟนซีประตูบานเลื่อนก็ไม่มีปัญหา:)

การสาธิตที่มีอยู่ในhttp://result.dabblet.com/gist/3132160/ac475112dbba493d2dd7d98493d4f4ceaa209a7c คลิกลูกบิดประตูเพื่อเปิดและปิด ไม่มี JavaScript ที่เกี่ยวข้อง มันเป็นเพียงความมหัศจรรย์ของ 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>

โดยการเลื่อนฉันเดิมหมายถึง "ประตูกระจกบานเลื่อน" เหมือนชาน แต่ฉันสามารถเห็นว่ามันจะไม่ถือว่าเป็นแฟนซี นอกจากนี้โดยการหมุนประตูฉันหมายถึงการหมุน จะแก้ไขให้ถูกต้อง
Event_Horizon

6

Mathematica 271 ตัวอักษร

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

ประตู

ประตูบานคู่

  • เปิดโดยการหมุนจากศูนย์ถึง 90 องศา (โดยใช้แถบเลื่อนr)
  • สามารถมีความสูงและความกว้างที่กำหนดโดยตัวเลื่อน ( hและw)
  • อยู่ในสภาพแวดล้อมของแสง 3 มิติ
  • สามารถหมุนแบบโต้ตอบเพื่อดูจากมุมที่แตกต่าง

รหัสจะขึ้นอยู่กับโปรแกรมโดยSándor Kabal


4

Python 65 คะแนน, 86 ตัวอักษร

แบบโต้ตอบและน้อยกว่า 100 ตัวอักษร

รอสำหรับการป้อนข้อมูลและแสดงให้เห็นว่าคุณประตู อินพุตที่ถูกต้องคือ "open" และ "close" และ "bye"

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

คุณสามารถตั้งค่าให้สลับเปิด / ปิดโดยไม่ต้องพิมพ์คำสั่งและยังเป็นไปตามข้อกำหนด - มันจะช่วยให้คุณประหยัดได้ไม่กี่ตัวอักษร
Joel Cornett

2
อาจเป็นไปได้ แต่หลังจากนั้นอีกครั้งนี่ไม่ใช่โค้ดกอล์ฟดังนั้นมันจึงไม่สำคัญ;)
daniero

1
สวยน่าเบื่อมองหาประตู แต่ดีมองหากับดักหนู
ardnew

4

Mathematica 127 ตัวอักษร

นี่เป็นการใช้งานที่มีความคล่องตัวมากกว่าการใช้ที่ฉันส่งไปก่อนหน้านี้ มันมีประตูเดียว ประตูเดียว

  • เปิดโดยการหมุนจากศูนย์ถึง 90 องศา (โดยใช้แถบเลื่อนo)
  • อยู่ในสภาพแวดล้อมของแสง 3D
  • สามารถหมุนแบบโต้ตอบเพื่อดูจากมุมที่แตกต่าง

อย่างไรก็ตามมันใช้ความสูงและความกว้างของประตูที่แน่นอน

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


คุณน่าจะแก้ไขการส่งก่อนหน้าของคุณแทนที่จะส่งใหม่
Joe the บุคคล

@ fireDude67 หากนี่เป็นความท้าทายของ Code Golf ฉันจะแทนที่รายการก่อนหน้าของฉันด้วยรหัสที่สั้นกว่า อย่างไรก็ตาม SO นั้นแสดงความสนใจในโปรแกรมระยะสั้นและโปรแกรมที่ซับซ้อนมากขึ้น (ประตูที่มีคุณสมบัติเพิ่มเติม)
DavidC

โอ้ขอโทษฉันสับสนแล้ว
Joe the บุคคล

@ fireDude67 ไม่มีปัญหา
DavidC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.