แอปเปิ้ลกำลังตกลงมา


15

บทนำ

มีลำต้นของต้นแอปเปิลอยู่ในตำแหน่งระหว่าง -2 ถึง 2 บนแกน x ซึ่งแอปเปิ้ลบางตัวตกลงมา:

        |   |
        |   |
<-------|---|------->
       -2   2

ในชีวิตประจำวัน, nแอปเปิ้ลล้มลง แต่ละแอปเปิ้ลยังคงพิกัด xไว้ตรงกับพื้น

แต่ถ้ามันตกลงบนยอดของแอปเปิ้ลตัวอื่นมันจะหมุนไปตามกฎต่อไปนี้จนกว่ามันจะถึงพื้นหรือแอปเปิ้ลเลเยอร์ที่รองรับ:

  1. หากพื้นที่ที่x + 1ที่ความสูงปัจจุบันว่างเปล่าแอปเปิ้ลปัจจุบันจะไปที่นั่น
  2. มิฉะนั้นถ้าช่องว่างที่x-1ว่างเปล่าแอปเปิ้ลปัจจุบันจะไปที่นั่น
  3. มิฉะนั้นแอปเปิ้ลปัจจุบันยังคงอยู่ที่ที่อยู่ด้านบนของแอปเปิ้ลอื่น

ท้าทาย

อินพุตจะเป็นตำแหน่งเริ่มต้นnของแต่ละแอปเปิ้ลตามลำดับ คุณสามารถใช้เป็นอาเรย์หรือแยกตัวเลขหรือวิธีการอื่นที่ถูกต้องเพียงแค่ให้แน่ใจว่าคุณอธิบายมันในคำตอบของคุณ

ผลลัพธ์ควรเป็นรูปวาด ASCII ของลำต้นของต้นไม้และแอปเปิ้ลรอบ ๆ คุณไม่จำเป็นต้องวาดแกน x ไปทางซ้ายของแอปเปิ้ลซ้ายสุดและไปทางขวาของแอปเปิ้ลขวาสุด แต่คุณจำเป็นต้องวาดที่ใดก็ได้ที่อยู่ใต้แอปเปิ้ลบางตัว คุณสามารถขยายต้นไม้เหนือแอปเปิ้ลที่สูงที่สุด

คุณสามารถสันนิษฐานได้ว่าพิกัด xทั้งหมดอยู่ระหว่าง -100 ถึง 100 แต่ไม่ใช่ระหว่าง -2 และ 2

นี่คือ .. คำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ!

ตัวอย่าง

การป้อนข้อมูล: [-3, 5, 5, -4, -4, 5, -3]

เอาท์พุท:

  a|   |
aaa|   | aaa
---|---|----

การป้อนข้อมูล: [3, 3, 3, 3, 8, 9]

เอาท์พุท:

|   |a
|   |aaa  aa
|---|-------

การป้อนข้อมูล: [-5, -5, -5, -5, -5, -5, -5, -5, -5]

เอาท์พุท:

  a  |   |
 aaa |   |
aaaaa|   |
-----|---|


ตัวอย่างของคุณแสดงให้เห็นว่าขอบเขตที่น้อยที่สุดที่เป็นไปได้ในทิศทาง x ควรจะแสดง (ไม่มีพื้นว่างเปล่าทางด้านซ้ายและขวาของต้นไม้และแอปเปิ้ล) นั่นเป็นข้อกำหนดหรือไม่? นอกจากนี้เราได้รับอนุญาตให้พิมพ์ช่องว่างต่อท้ายอย่างน้อยก็เพื่อเอาท์พุทไปยังสี่เหลี่ยม?
Martin Ender

1
โบนัสไม่ได้รับความนิยมมาก ฉันคิดว่าการกำหนดให้เอาต์พุต "มองเห็น" มีค่าน้อยที่สุด (ไม่มีแถวว่างที่ด้านบนไม่มีเซลล์พื้นดินที่ขอบซึ่งว่างเปล่า) ก็ใช้ได้
Martin Ender

นอกจากนี้โบนัสของคุณยังไม่สมเหตุสมผลเนื่องจากสเป็คไม่อนุญาตให้เริ่มต้นรูปแบบเอาต์พุตที่แตกต่างกัน
Martin Ender

2
ฉันจะให้ค่าตอบแทน 100 ตัวแทนให้กับคำตอบแรกใน Marbelous แอปเปิ้ลที่ร่วงหล่นคำนวณได้จากหินอ่อนที่ตกลงมา ... มันพอดีเกินไป
quintopia

คำตอบ:


1

PHP, 230 ไบต์

ฉันได้เพิ่มบรรทัดใหม่สองบรรทัดแรกเพื่อให้สามารถอ่านได้

function($l){for($y=count($l);$y>=0;$f[]="$a|   |$a")$a=str_repeat($y--?$w=' ':'-',99);
foreach($l as$x){for($x+=101,$s=$y=0;!$s;$b[$x]!=$w?$b[$x+1]!=$w?$b[$x-1]!=$w?$s=1:--$x
:++$x:0)$b=$f[$y++];$f[$y-2][$x]=a;}echo join('
',$f);};

Ideone

นี่คือรุ่นที่ไม่ได้แต่งแต้ม:

function drawApples(array $listStartX)
{
    $field = [];
    $maximalHeight = count($listStartX);
    for ($y = $maximalHeight; $y >= 0; --$y)
    {
        $line = str_repeat($y > 0 ? ' ' : '-', 98);
        $field[] = $line .'|   |'. $line;
    }

    foreach ($listStartX as $x)
    {
        $x += 100;
        for ($y = 0; true; ++$y)
        {
            if ($field[$y][$x] === ' ') {
                continue;
            }

            if ($field[$y][$x + 1] === ' ') {
                ++$x;
                continue;
            }

            if ($field[$y][$x - 1] === ' ') {
                --$x;
                continue;
            }

            $field[$y - 1][$x] = 'a';
            break;
        }
    }

    echo implode("\n", $field);
}

1

Python 2.7, 282 ไบต์

from collections import*;a=Counter();a[2]=-1;a[-2]=-1
for d in input():
 while 0<=a[d+1]<a[d]:d+=1
 while 0<=a[d-1]<a[d]:d-=1
 a[d]+=1
m=max(a.values())+1
print'\n'.join(''.join(' '*(m-a[i]-1)+'a'*a[i]+'-'if i**2!=4 else'|'*m for i in range(min(a),max(a)+1))[i::m]for i in range(m))

Ideone

ดี…ฉันพยายาม

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