Cửa ra vào cửa ra vào, hãy xuống cửa hàng!


9

Thách thức có hai mặt:

Tạo một chương trình xây dựng một cánh cửa. ASCII, HTML hoặc cách khác

Làm cho cửa hoạt động. Mở và đóng

Có thể mở thông qua đầu vào hoặc tương tác!

  • Cửa không chức năng +5 điểm.
  • Chỉ cần một cánh cửa có thể mở +10 điểm.
  • Cửa tương tác +15 điểm.
  • Cửa ưa thích +20 điểm. Điều này có nghĩa là quay vòng, bifold vv
  • Hoạt hình +20 điểm.
  • <100 ký tự +50 điểm.
  • -100 điểm để sử dụng một chương trình được thiết kế đặc biệt để vẽ hoặc hoạt hình.

Nếu bạn có tiêu chí gợi ý hãy để lại trong phần bình luận.

Ví dụ mở cửa không chức năng:

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

}
}

Kết quả ví dụ:

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

Bạn có bất kỳ ví dụ cửa?
beary605

@ beary605 Ví dụ không có chức năng được cung cấp
Event_Horiz

2
xác định một "cánh cửa"
Joel Cornett

Còn việc sử dụng các tệp bên ngoài cho mã ASCII (hoặc hình ảnh) cho các cửa thì sao? Làm thế nào để họ đếm?
jazzpi

Câu trả lời:


22

JavaScript, 4380 ký tự, 65 (?) Điểm

ASCII? Kiểm tra. HTML? Kiểm tra. Là một cánh cửa? Kiểm tra. Cửa có thể mở? Kiểm tra. Tương tác? Kiểm tra. Mến? Cửa đôi với bản lề được định vị đúng, tôi hy vọng rằng sẽ được tính. Hoạt hình? Kiểm tra. Dưới 100 ký tự? Hà. Không sử dụng các phương tiện dự định để vẽ? Kiểm tra.

Bản thử trực tiếp. (Lưu ý: Trong thử nghiệm của tôi với Firefox, nhấp vào cửa nhiều lần không hoạt động - vì một số lý do, trình xử lý sự kiện không kích hoạt lại và tôi gặp khó khăn tại sao; chỉ ra những gì tôi đã làm sai sẽ được hoan nghênh. Mặc dù vậy, dù sao đi nữa, bạn có thể muốn chạy cái này trong Chrome để có hiệu suất JS tốt.)

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

Khi đóng cửa, các cửa trông như thế này:

(Ảnh chụp màn hình của cửa đóng.)


1
Phải thừa nhận, đó là một số công việc đẹp ở đó.
Sự kiện_Horiz

1
Điều đó thật tuyệt vời.
MrZander

9

HTML & CSS3, 55 điểm

Fancy, tương tác, cửa hoạt hình là 55 điểm, tôi nghĩ.

Vâng, điều này mở ra như bất kỳ cánh cửa nào khác, nhưng nếu một cánh cửa trượt được coi là lạ mắt, tại sao không phải là một cánh cửa quay? Nếu một cái xoay không lạ mắt, thì, cửa trượt không có vấn đề gì:)

Một bản demo có sẵn tại http://result.dabblet.com/gist/3132160/ac475112dbba493d2dd7d98493d4f4ceaa209a7c . Nhấp vào tay nắm cửa để mở và đóng. Không có JavaScript liên quan; đó chỉ là phép màu của 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>

Theo Sliding ban đầu tôi có nghĩa là "Cửa kính trượt" giống như một cái hiên, nhưng tôi có thể thấy nó sẽ không được coi là lạ mắt (đặc biệt là về thuật ngữ mã hóa, vì nó dễ hơn nhiều so với xoay). Ngoài ra, bằng cách xoay cửa tôi có nghĩa là quay vòng. Sẽ sửa.
Sự kiện_Horiz

6

Toán học 271 ký tự

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

cửa ra vào

Cửa đôi

  • mở bằng cách xoay từ 0 đến 90 độ (sử dụng thanh trượt r)
  • có thể có chiều cao và chiều rộng của chúng được đặt bởi các thanh trượt ( hw).
  • trong môi trường ánh sáng 3D
  • có thể được xoay tương tác để được xem từ các góc độ khác nhau.

Mã này dựa trên một chương trình của Sándor Kabal.


4

Python - 65 điểm, 86 ký tự

Tương tác và ít hơn 100 ký tự.

Chờ đợi đầu vào và cho bạn thấy cánh cửa . Đầu vào hợp lệ là "mở" và "đóng" và "tạm biệt".

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

Bạn có thể có thể thiết lập nó để chuyển đổi mở / đóng mà không cần gõ lệnh và vẫn đáp ứng các yêu cầu - nó sẽ giúp bạn tiết kiệm một vài ký tự.
Joel Cornett

2
Có thể, nhưng sau đó một lần nữa, đây không phải là môn đánh gôn, vì vậy nó không thực sự quan trọng;)
daniero

1
Cửa nhìn khá nhàm chán, nhưng một cái bẫy chuột trông tuyệt vời
ardew

4

Toán học 127 ký tự

Đây là một triển khai hợp lý hơn so với triển khai tôi đã gửi trước đó. Nó có một cánh cửa duy nhất. Cánh cửa đơn

  • mở bằng cách xoay từ 0 đến 90 độ (sử dụng thanh trượt o)
  • trong môi trường ánh sáng 3D
  • có thể được xoay tương tác để được xem từ các góc độ khác nhau.

Tuy nhiên, nó sử dụng chiều cao và chiều rộng cửa cố định.

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

cửa2


Bạn có lẽ nên chỉnh sửa bài nộp trước đó, thay vì gửi bài mới.
Joe the Person

@ fireDude67 Nếu đây là một thử thách Code Golf, tôi chỉ cần thay thế mục nhập trước đó của mình bằng mã ngắn hơn. Tuy nhiên, SO chỉ ra sự quan tâm trong cả chương trình ngắn và chương trình phức tạp hơn (cửa có nhiều tính năng hơn).
DavidC

oh xin lỗi tôi đã nhầm lẫn sau đó
Joe the Person

@ fireDude67 Không có vấn đề.
DavidC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.