ฉากหิมะเคลื่อนไหว ASCII


22

จงเขียนโปรแกรมที่สั้นที่สุดที่จะทำให้ชิ้นส่วนของศิลปะ ASCII ใด ๆ ลงในฉากหิมะเคลื่อนไหวที่จะเริ่มขึ้นในรูปแบบจากหิมะตก ( ตัวอย่างที่ไม่แข็งแรงเล่นกอล์ฟ JavaScriptปรับปรุงล่าสุด 2011/12/19)

ข้อมูลจำเพาะของการป้อนข้อมูล : โปรแกรมของคุณจะต้องยอมรับช่องว่าง, เครื่องหมายดอกจันและการขึ้นบรรทัดใหม่โดยพลการ อินพุตจะมีได้สูงสุด 23 บรรทัดและ 80 อักขระต่อบรรทัด จะไม่มีบรรทัดว่างเปล่า แต่บรรทัดอาจประกอบด้วยช่องว่างเท่านั้น ขึ้นบรรทัดใหม่ที่ต่อท้ายเดียวจะรวมอยู่และจะต้องละเว้น

เอาต์พุต : อักขระ ASCII เอาต์พุต (ช่องว่าง, เครื่องหมายดอกจัน) และรหัสควบคุม (carriage return, linefeeds, รหัสหลบหลีก ANSI ฯลฯ ) สำหรับคอนโซลข้อความของระบบปฏิบัติการหรือเทอร์มินัลอีมูเลเตอร์จนกว่าผู้ใช้จะยกเลิกโปรแกรมด้วยตนเอง คุณอาจถือว่าหน้าต่างเทอร์มินัลคือ 80x24 ตัวอักษรหากระบบปฏิบัติการของคุณอนุญาตการตั้งค่านั้น

กฎ :

  • ภาพเคลื่อนไหวจะต้องราบรื่นและรวดเร็ว (ต้องการ 15 fps)
  • ความหนาแน่นของหิมะจะต้องอยู่ระหว่าง 5% ถึง 15%
  • ไม่สามารถเลื่อนหิมะได้มากกว่าหนึ่งหน้าจอต่อวินาที (นั่นหมายความว่าจะไม่มีการเพิ่มหิมะใหม่เกิน 24 บรรทัดในช่วงเวลาหนึ่งวินาทีใดก็ได้)
  • หิมะจะต้องไม่แสดงรูปแบบที่ชัดเจนใด ๆ ขณะที่มันเข้าสู่ด้านบนของหน้าจอ; มันต้องดูสุ่ม
  • โปรแกรมจะต้องเติมทุกแถวของหน้าจอด้วยหิมะโดยเร็วที่สุดเมื่อเริ่มต้น การเติมครั้งแรกของแต่ละแถวของหน้าจอจะต้องไม่ชัดเจนสำหรับผู้ดู
  • มุมซ้ายล่างของศิลปะ ASCII อินพุตจะต้องอยู่ที่มุมซ้ายล่างของหน้าจอ (รูปที่ 1 สำหรับการชี้แจงเพิ่มเติม)
  • พื้นที่ภายในหรือภายใต้ศิลปะ ASCII จะต้องไม่ใส่เครื่องหมายดอกจันอย่างถาวร อย่างไรก็ตามเครื่องหมายดอกจันอาจ (แต่ไม่จำเป็นต้อง) เลื่อนผ่านบริเวณนี้
  • หิมะจะต้องไม่สะสมที่ด้านล่างของหน้าจอหรือด้านบนของหิมะที่มีอยู่ยกเว้นดังแสดงในอินพุต
  • ช่องว่างด้านล่างจะต้องเต็มก่อนส่วนบนเนื่องจากการเติมช่องว่างในลำดับตรงกันข้ามทำให้ภาพเคลื่อนไหวต้นคริสต์มาสดูแตกต่างจากรหัสต้นฉบับของฉันมาก (เพิ่ม 2011-12-20)

สุขสันต์วันหยุด!

รูปที่ 1: พื้นที่ที่มีป้ายกำกับของหน้าจอ 80x24

---------------------------New snow added on this line--------------------------
                                                                             |
                                                                             |
----------------------------------------------------------+                  |
                                                    ****  |                  |
    Snow MUST fall  Snow MAY fall ---------------->  **** |                  |
    through this    through these          ****      **** |  Snow MUST fall  |
    area.           areas of a              ****     **** |  through this    |
                    completed   \--------->  ****     ****|  area.           |
        ASCII art   scene.    \     ***        ****   ****|                  |
          area         \       \   *******      ****  ****|                  |
                        \       \    ********     ***  ***|  (ALL CAPS terms |
      (located in        \       \-->   *********  ***    |  have standard   |
       lower left         \     *******     ******  MAY   |     RFC 2119     |
       corner of           \    *************  **   fall  |    meanings.)    |
       screen)              \        ***********    here  |                  |
                         *** +--->          ****  ***     |                  |
                         *** | ****************   ***     |                  |
  | Snow MUST fall       *** | ****************   ***     |                  |
  | through this         *** +--->                ***     |                  |
  | area.                *** | ****************   ***     |                  |
--+---------------------+*** +--->                ***+----+------------------+--
  |   Snow MUST NOT     |****************************|      Snow MUST NOT    |
  V  accumulate here.   |****************************|     accumulate here.  V

ตัวอย่างอินพุต

รหัสแบนเนอร์กอล์ฟ

 ******   *******  ********  ********     ******    *******  **       ******** 
**    ** **     ** **     ** **          **    **  **     ** **       **       
**       **     ** **     ** **          **        **     ** **       **       
**       **     ** **     ** ******      **   **** **     ** **       ******   
**       **     ** **     ** **          **    **  **     ** **       **       
**    ** **     ** **     ** **          **    **  **     ** **       **       
 ******   *******  ********  ********     ******    *******  ******** **       

โลโก้สแต็คล้น

                                                    ****
                                                     ****
                                           ****      ****
                                            ****     ****
                                             ****     ****
                                    ***        ****   ****
                                   *******      ****  ****
                                     ********     ***  ***
                                        *********  ***
                                *******     ******
                                *************  **
                                     ***********
                         ***                ****  ***
                         ***   ****************   ***
                         ***   ****************   ***
                         ***                      ***
                         ***   ****************   ***
                         ***                      ***
                         ****************************
                         ****************************

ต้นคริสต์มาส

                                        *
                                       ***                           *
                *                     *****                         ***
               ***                   *******           *           *****
              *****                 *********         ***            *
                *                  ***********       *****
                       *          *************     *******
        *             ***        ***************       *               *
       ***           *****      *****************                     ***
      *****         *******    *******************                   *****
     *******           *      *********************                 *******
    *********                           *                          *********
        *                                                              *

1
ต้นคริสต์มาสที่สามเสีย
Bobby

ท้าทายมาก! ฉันคิดว่าควรแจกแจงกฎเพื่อการอ้างอิงที่ง่ายขึ้นและฉันไม่เข้าใจกฎข้อที่สามและข้อที่หก ...
hallvabo

@ hallvabo ฉันได้ชี้แจงทั้งสองกฎเหล่านี้หลังโดยการเพิ่มรูปที่มีข้อความ
PleaseStand

ขอชี้แจง: มีการขึ้นบรรทัดใหม่ในความยาวสูงสุด 80 บรรทัดหรือสูงสุด 80 ตัวอักษรและขึ้นบรรทัดใหม่หรือไม่ (ฉันสันนิษฐานว่าหลัง แต่ดูเหมือนว่าจะมีการส่งบางอย่างในอดีต)
Ilmari Karonen

@IlmariKaronen หลัง
กรุณามาถึง

คำตอบ:


5

Perl, ตัวอักษร 196/239

chomp(@p=(@f=($"x80)x24,<>)[-24..-1]);{@s=(join("",map rand>.1?$":"*",1..80),@s);if(@s>23){$t=$f[$_],print$_?$/:"\e[H",($f[$_]|=$s[$_]&$p[$_])|($s[$_]&=~$t^$f[$_])for 0..23;select"","","",.1}redo}

วิธีการแก้ปัญหานี้แตกต่างจากตัวอย่าง JS ของคุณในรูปแบบที่เต็มไปจากบนลงล่างมากกว่าจากล่างขึ้นบน แต่ฉันคิดว่าไม่เป็นไรเพราะคุณไม่ได้พูดอะไรเกี่ยวกับมันในกฎ

การลด 1-char ที่ไม่สำคัญสามารถทำได้โดยแทนที่\eด้วยตัวอักษร ESC ตามตัวอักษร แต่นั่นทำให้รหัสอ่านและแก้ไขได้ยากขึ้นมาก


อัปเดต:ฉันได้จัดการกับเวอร์ชันที่เติมรูปแบบจากด้านล่างขึ้นมาและไม่อนุญาตให้หิมะตกผ่านส่วนที่เต็มไปของรูปแบบดังตัวอย่างในการนำไปใช้ของ JS ในราคา 43 ตัวอักษรพิเศษ:

chomp(@p=(@q=@f=($"x80)x24,<>)[-24..-1]);{@s=(join("",map rand>.1?$":"*",1..80),@s);if(@s>23){my$q;$q[-1-$_]=($q|=$p[-$_]&~$f[-$_])for@a=0..23;print$_?$/:"\e[H",($f[$_]|=$s[$_]&$p[$_]&~$q[$_])|($s[$_]&=~$f[$_])for@a;select"","","",.1}redo}

การแทนที่($s[$_]&=~$f[$_])ด้วยเพียงแค่$s[$_]จะบันทึก 11 ตัวอักษรโดยปล่อยให้หิมะตกลงมาผ่านส่วนที่เต็มไปด้วยรูปแบบ (ซึ่งตรงกับข้อมูลจำเพาะ แต่ไม่ใช่ตัวอย่างการนำไปใช้)


ตกลงเนื่องจากฉันยังคงเป็นผู้นำการแข่งขันหลังจากหนึ่งสัปดาห์ฉันคิดว่าฉันควรอธิบายวิธีแก้ปัญหาของฉันทำงานเพื่อส่งเสริมการแข่งขันมากขึ้น (หมายเหตุ: คำอธิบายนี้มีไว้สำหรับรุ่นเติมจากบนลงล่าง 196 ถ่านฉันอาจแก้ไขให้รวมรุ่นอื่นในภายหลัง)

ก่อนอื่นวิธีแก้ปัญหาใหญ่ที่ฉันใช้คือเนื่องจากวิธีการจัดเรียงรหัสอักขระ ASCII, 1 บิตในรหัส ASCII สำหรับพื้นที่ที่เพิ่งเกิดขึ้นเป็นส่วนย่อยของรหัสในรหัส ดอกจัน

ดังนั้นการแสดงออกดังต่อไปนี้เป็นจริง: และ" " & "*" eq " " " " | "*" eq "*"นี่คือสิ่งที่ให้ฉันใช้การทำงานของสายอักขระสองมิติเพื่อรวมส่วนที่เคลื่อนไหวและเคลื่อนไหวของฉากโดยไม่ต้องวนซ้ำอักขระแต่ละตัว

ถ้าอย่างนั้นเราก็ไปดูโค้ดกันดีกว่า นี่คือเวอร์ชั่นที่ไม่มีการตีกอล์ฟ:

chomp(@p = (@f = ($" x 80) x 24, <ARGV>)[-24..-1]);
{
    @s = (join('', map((rand > 0.1 ? $" : '*'), 1..80)), @s);
    if (@s > 23) {
        foreach (0 .. 23) {
            $t = $f[$_];
            print( $_ ? $/ : "\e[H" );
            print( ($f[$_] |= $s[$_] & $p[$_]) | ($s[$_] &= ~$t ^ $f[$_]) );
        }
        select '', '', '', 0.1;
    }
    redo;
}

บรรทัดแรกตั้งค่าอาร์เรย์@f(สำหรับ "คงที่") และ@p(สำหรับ "รูปแบบ") @fจะจัดรูปแบบส่วนที่คงที่ของจอแสดงผลและเริ่มต้นที่ไม่มีอะไรนอกจากช่องว่างในขณะ@pที่ซึ่งไม่ได้แสดงโดยตรงจะมีรูปแบบการป้อนข้อมูล เป็นเงินที่เคลื่อนไหวเราจะเพิ่มเครื่องหมายดอกจันมากขึ้นจนในที่สุดก็มีลักษณะเช่นเดียว@f@p

โดยเฉพาะ@f = ($" x 80) x 23ตั้งค่า@f24 สาย 80 ช่องว่าง ( $"เป็นตัวแปร Perl พิเศษที่มีค่าเริ่มต้นเป็นช่องว่าง) จากนั้นเราจะนำรายการนี้ผนวกบรรทัดอินพุตไปยังมันโดยใช้ตัวดำเนินการ readline <>ใช้ 24 บรรทัดสุดท้ายของรายการที่รวมกันนี้และกำหนดให้กับ@p: นี่คือ วิธีที่กะทัดรัดในการรอง@pด้วยบรรทัดว่างเพื่อให้รูปแบบปรากฏในตำแหน่งที่ควร สุดท้ายเราจะchompใส่บรรทัด@pเพื่อลบบรรทัดใหม่ที่ต่อท้ายเพื่อไม่ให้เกิดปัญหาในภายหลัง

ทีนี้ลองดูที่ลูปหลัก ปรากฎว่า{...;redo}เป็นวิธีที่สั้นกว่าในการเขียนลูปที่ไม่มีที่สิ้นสุดกว่าwhile(1){...}หรือแม้กระทั่งfor(;;){...}โดยเฉพาะอย่างยิ่งถ้าเราไม่ใช้เครื่องหมายอัฒภาคก่อนหน้านี้redoเนื่องจากมันตามifบล็อกทันที

บรรทัดแรกของลูปหลักแนะนำอาร์เรย์@s(สำหรับ "สโนว์" แน่นอน) ซึ่งจะเป็นการเติมสตริง 80 อักขระแบบสุ่มของช่องว่าง 90% และ 10% ของดอกจันในทุกการวนซ้ำ (เพื่อบันทึกตัวอักษรสองสามตัวฉันไม่เคยปรากฏเส้นพิเศษออกจากตอนท้ายของ@sอาร์เรย์ดังนั้นมันจึงจะยาวขึ้นเรื่อย ๆ ในที่สุดมันจะบดขยี้โปรแกรมให้หยุดชะงักเนื่องจากอาร์เรย์ยาวเกินไปที่จะใส่ในหน่วยความจำ จะใช้เวลานานกว่าคนส่วนใหญ่ที่เคยดูภาพเคลื่อนไหวนี้สำหรับการเพิ่มpop@s;คำสั่งก่อนที่selectจะแก้ไขได้ที่ค่าใช้จ่ายเจ็ดตัวอักษร)

ส่วนที่เหลือของลูปหลักถูกห่อในifบล็อกเพื่อให้มันทำงานได้เฉพาะเมื่อ@sอาร์เรย์มีอย่างน้อย 24 บรรทัด นี่เป็นวิธีที่ง่ายในการปฏิบัติตามข้อมูลจำเพาะซึ่งต้องการการแสดงผลทั้งหมดเพื่อให้เต็มไปด้วยหิมะที่ตกลงมาจากจุดเริ่มต้น

ถัดมาเป็นforeachวงซึ่งในเวอร์ชั่น golfed เป็นจริงประโยคเดียวที่มีfor 0..23ตัวแก้ไข เนื่องจากเนื้อหาของลูปอาจต้องการคำอธิบายบางอย่างฉันจะแกะกล่องอีกเล็กน้อยด้านล่าง:

foreach (0 .. 23) {
    print $_ ? $/ : "\e[H";     # move cursor top left before first line, else print newline
    $t = $f[$_];                # save the previous fixed snowflakes
    $f[$_] |= $s[$_] & $p[$_];  # snowflakes that hit the pattern become fixed 
    $s[$_] &= ~$t ^ $f[$_];     # ...and are removed from the moving part
    print $f[$_] | $s[$_];      # print both moving and fixed snowflakes ORed together
}

ก่อนอื่น$_เป็นตัวแปรตัวนับลูปเริ่มต้นใน Perl ยกเว้นว่ามีการระบุตัวแปรอื่น ที่นี่มันวิ่งจาก 0 ถึง 23 คือมากกว่า 24 บรรทัดในกรอบการแสดงผล $foo[$_]หมายถึงองค์ประกอบดัชนีโดยในอาร์เรย์$_@foo

ในบรรทัดแรกของลูป de-golfed เราจะพิมพ์ newline (รับมาจาก$/ตัวแปรพิเศษ) หรือเมื่อ$_เท่ากับ 0 สตริง"\e[H"ที่ซึ่ง\eแสดงถึงอักขระ ESC นี่คือรหัสควบคุมเทอร์มินัล ANSIที่เลื่อนเคอร์เซอร์ไปที่มุมซ้ายบนของหน้าจอ ในทางเทคนิคเราสามารถละเว้นได้ว่าถ้าเราสมมติขนาดหน้าจอที่เฉพาะเจาะจง แต่ฉันเก็บไว้ในรุ่นนี้เพราะมันหมายความว่าฉันไม่จำเป็นต้องปรับขนาดเทอร์มินัลของฉันเพื่อเรียกใช้ภาพเคลื่อนไหว

ใน$t = $f[$_]บรรทัดเราเพิ่งบันทึกค่าปัจจุบันของ$f[$_]ในตัวแปร "ชั่วคราว" (ดังนั้น$t) ก่อนที่จะเปลี่ยนในบรรทัดถัดไปโดย$s[$_] & $p[$_]ให้จุดตัด (bitwise AND) ของหิมะที่ตกลงมาและรูปแบบอินพุตและ|=โอเปอเรเตอร์ OR $f[$_]ที่เป็นสายการส่งออกคงที่

ในบรรทัดด้านล่างนั้น$t ^ $f[$_]ให้ค่าบิต XOR ของค่าก่อนหน้าและปัจจุบันของ$f[$_]คือรายการของบิตที่เราเปลี่ยนไปในบรรทัดก่อนหน้าถ้ามีและคัดค้านสตริงอินพุตอย่างใดอย่างหนึ่งด้วย~negates เอาท์พุท ดังนั้นสิ่งที่เราได้รับคือ bitmask ที่ bit ทั้งหมดตั้งค่าเป็น 1 ยกเว้นที่เราเพิ่งเพิ่มเข้าไป$f[$_]ในบรรทัดก่อนหน้า ANDING bitmask $s[$_]นั้นจะลบบิตเหล่านั้นออกจากมัน ผลหมายความว่าเมื่อเกล็ดหิมะตกลงมาในหลุมในรูปแบบคงที่มันจะถูกลบออกจากแถวหิมะที่ตกลงมา

ในที่สุดprint $f[$_] | $s[$_](ซึ่งในเวอร์ชัน golfed ถูกนำมาใช้โดยเพียงแค่ ORing สองบรรทัดก่อนหน้านี้ด้วยกัน) เพียงพิมพ์ยูเนี่ยน (bitwise OR) ของเกล็ดหิมะที่คงที่และเคลื่อนที่บนบรรทัดปัจจุบัน

อีกสิ่งที่เหลือที่จะอธิบายคือselect '', '', '', 0.1ด้านล่างวงด้านใน นี่เป็นเพียงวิธี klugy ที่จะนอนหลับ 0.1 วินาทีใน Perl; ด้วยเหตุผลทางประวัติศาสตร์บางคนโง่ที่ Perl มาตรฐานsleepคำสั่งมีความละเอียดหนึ่งสองและนำเข้าที่ดีกว่าsleepจากTime::HiResโมดูลต้องใช้ตัวอักษรมากกว่าเหยียดหยาม4 หาเรื่องselect


ดูเหมือนว่าจะมีข้อผิดพลาดเล็กน้อย: ไม่ใช้บรรทัดที่ 24 และบรรทัดล่างสุดของ ASCII art คือบรรทัดที่ 23 และควรเติมเต็มช่องว่างด้านล่างก่อนที่มันจะเติมเต็มส่วนบนแม้ว่าฉันไม่ได้ระบุว่า
กรุณามาถึง

@ PleaseStand: ฉันเปลี่ยนรหัสเพื่อใช้ทั้ง 24 บรรทัด (และโดยไม่ได้ตั้งใจกำจัดsay) ที่ค่าใช้จ่ายของ 2 ตัวอักษรพิเศษ ฉันไม่คิดว่าฉันจะเปลี่ยนคำสั่งเติมได้อย่างง่ายดาย การติดตั้งของฉันค่อนข้างเชื่อมโยงกับพื้นฐาน
Ilmari Karonen

คำอธิบายที่ดี! ฉันหวังว่าฉันจะสามารถลงคะแนนรายการนี้ได้อีกครั้ง
Dillon Cower

@PleaseStand: ที่จริงผมไม่จัดการเพื่อให้ด้านล่างขึ้นรุ่นไส้ซึ่งขณะนี้ดูสวยมากเช่นเดียวกับตัวอย่าง JS ของคุณ มันยาวกว่ารายการจากบนลงล่างเล็กน้อย แต่ก็ยังสั้นกว่ารายการอื่น ๆ
Ilmari Karonen

3

HTML และ JavaScript, 436 ตัวอักษร

เตรียมไปที่อินพุต:

<body onload="for(a=[],b=[],c=document.body.firstChild,e=c[H='innerHTML'].split(N='\n'),f=e.length-1,g=24,h=g-f;f--;)for(X=80;X--;)b[80*(h+f)+X]='*'==e[f][X];for(setInterval(F='for(y=24;y--;)for(x=80;x--;)if(a[w=80*y+x]){d=1;if(b[w])for(d=0,z=y+1;24>z;++z)b[s=80*z+x]&&!a[s]&&(d=1);d&&(a[w]=0,a[w+80]=1)}for(x=80;x--;).1>Math.random(i=0)&&(a[x]=1);for(t=\'\';1920>i;++i)t+=\'* \'[+!a[i]],79==i%80&&(t+=N);c[H]=t',67);g--;)eval(F)"><pre>

ดูมันทำงานสำหรับแต่ละตัวอย่างเช่น: กอล์ฟรหัส , Stack มากเกินโลโก้ , ต้นคริสต์มาส ผู้ใช้ Internet Explorer จำเป็นต้องเรียกใช้เวอร์ชัน 9 และตั้งค่า "โหมดเอกสาร" เป็น "มาตรฐาน IE9" (ใช้เครื่องมือสำหรับนักพัฒนา F12) เพื่อให้การส่งนี้ทำงานได้อย่างถูกต้อง


1
ทั้ง 3 คนดูเหมือนจะแตกใช่ไหม pasteall.org/pic/show.php?id=66297
CoDEmanX

1

Python, 299 ตัวอักษร

สิ่งนี้ควรเป็นไปตามกฎสมมติว่าบรรทัดใหม่รวมอยู่ในขีด จำกัด 80 อักขระ

import random,sys,time
C=1920
v=_,x=' *'
a=['']*C
f=lambda n:[random.choice(e*9+x)for e in _*n]
for e in sys.stdin:a+="%-80s"%e
a=a[-C:]
s=f(C)
while 1:
 z=0;t=''
 for e in s:
    t+=v[x<a[z]or e>_]
    if(e>_<a[z])>(x in a[z+80::80]):a[z]='+'
    t+=z%80/79*'\n';z+=1
 print t;s=f(80)+s[:-80];time.sleep(.1)

เอาต์พุตของคุณจะเมาถ้าอินพุตมีบรรทัดใด ๆ ที่มีความยาว 80 ตัวอักษร (บวกขึ้นบรรทัดใหม่) ฉันขอให้ PleaseStand ให้ความกระจ่างว่าไม่เป็นไร
Ilmari Karonen

นี่เป็นเพราะฉันมีการขึ้นบรรทัดใหม่ในตอนท้ายของแต่ละบรรทัด 80-char คำอธิบายมีความคลุมเครือที่นี่เนื่องจากระบุว่าต้องมีการขึ้นบรรทัดใหม่ แต่อาจมีการสันนิษฐานว่าเทอร์มินัลนั้นมีความกว้าง 80 ตัวอักษร (ในกรณีที่หนึ่งอาจละเว้นการขึ้นบรรทัดใหม่และขึ้นอยู่กับการตัดอัตโนมัติ)
hallvabo

ฉันคิดว่าปัญหาที่แท้จริงคือคุณไม่ต้องตัดการขึ้นบรรทัดใหม่ก่อนที่จะเติมบรรทัดอินพุตให้เป็น 80 ตัวอักษรเพื่อให้อินพุตแบบ 80 ตัวอักษร - บวก - ขึ้นบรรทัดใหม่จบลงด้วยการผนวก 81 ตัวอักษรaและทำให้การทำดัชนียุ่งเหยิง ฉันลองแล้วดูเหมือนว่าการแทนที่%eด้วย%e.rstrip()ในบรรทัดที่ 6 จะช่วยแก้ปัญหาได้ (แน่นอนอาจมีการแก้ไขที่สั้นกว่านี้ฉันไม่เก่งใน Python Golf)
Ilmari Karonen

หากคุณต้องการที่จะสนับสนุน 81 ถ่านบรรทัดเพียงแค่เปลี่ยนตัวเลขและมันก็ใช้ได้ดี ตราบใดที่คุณอยู่ต่ำกว่า 100 ตัวอักษรต่อบรรทัดมันจะไม่เปลี่ยนจำนวนถ่าน :-)
hallvabo

ถ้าฉันเปลี่ยนรหัสของคุณเพื่อใช้สาย 81-char มันจะไม่ทำงานอย่างถูกต้องในสถานี 80 คอลัมน์ตอนนี้มันจะได้หรือไม่ คุณสร้างเอาต์พุต 80 คอลัมน์ได้ดี แต่เป็นเพียงว่าคุณไม่ยอมรับอินพุต 80 คอลัมน์อย่างถูกต้อง ลองทำ: สร้างไฟล์อินพุตพร้อมสองบรรทัดที่มี 80 ดอกจันในแต่ละอันและดูว่าเกิดอะไรขึ้น ไม่ควรยากขนาดนี้โซลูชันของฉันจัดการได้ดี
Ilmari Karonen

0

Java, 625 ตัวอักษร

import java.io.*;import java.util.*;class s extends TimerTask {int _c,_k;char _i[],_o[];boolean _b[];public s(String f) throws IOException {_i=new char[23*80];_o=new char[80];_b=new boolean [23*80];BufferedReader br = new BufferedReader(new FileReader(f));while (br.read(_i,_c++*80,80)!=-1);} public void run(){_k=--_k<0?_c:_k;for(int i=0;i<80;_b[_k*80+i]=Math.random()>0.9?true:false,i++);for(int m=0;m<_c;m++){for(int n=0;n<80;_o[n]=_b[(_k+m)%_c*80+n]?'*':_i[m*80+n],n++);System.out.println(_o);}}public static void main(String[] a) throws IOException{Timer timer=new Timer();timer.scheduleAtFixedRate(new s(a[0]),0,500);}}

ทางออกที่ง่ายใน Java


เยี่ยมมาก แต่ฉันไม่คิดว่าคุณจะทำตามข้อกำหนด โดยเฉพาะอย่างยิ่งคุณแสดงรูปแบบทั้งหมดจากจุดเริ่มต้น - มันไม่ได้ "รูปแบบจากหิมะตก" ในการสาธิตตัวอย่าง (เป็นที่ยอมรับนี่อาจอธิบายได้ดีกว่าในคำถามคุณต้องดูการสาธิตเพื่อทำความเข้าใจสิ่งที่ควรทำ) นอกจากนี้ framerate ของคุณช้าเกินไปคุณไม่เริ่มต้นด้วยหน้าจอที่เต็มไปด้วยหิมะคุณดูเหมือนจะ สมมติว่ารูปแบบอินพุตแตกต่างจากตัวอย่างที่ให้ไว้และคุณควรรีเซ็ตตำแหน่งเคอร์เซอร์ระหว่างเฟรม ( "\033[H"ควรทำการพิมพ์)
Ilmari Karonen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.