1, 2, Fizz, 4, Buzz


148

บทนำ

ในความพยายามล่าสุดของเราในการรวบรวมแคตตาล็อกของโซลูชั่นที่สั้นที่สุดสำหรับแบบฝึกหัดการเขียนโปรแกรมมาตรฐานนี่คือความท้าทายวานิลลาครั้งแรกของ PPCG หากคุณต้องการที่จะเห็นความท้าทายแคตตาล็อกอื่น ๆ มี"Hello World!" และ"ตัวเลขนี้สำคัญหรือไม่" .

ท้าทาย

เขียนโปรแกรมที่พิมพ์ตัวเลขทศนิยมตั้งแต่ 1 ถึง 100 แต่สำหรับทวีคูณของสามพิมพ์ "Fizz" แทนจำนวนและสำหรับทวีคูณของห้าพิมพ์ "Buzz" สำหรับตัวเลขที่เป็นทวีคูณของทั้งสามและห้าพิมพ์“ FizzBuzz”

เอาท์พุต

ผลลัพธ์จะเป็นรายการของตัวเลข (และ Fizzes, Buzzes และ FizzBuzzes) คั่นด้วยบรรทัดใหม่ (อย่างใดอย่างหนึ่ง\nหรือ\r\n) บรรทัดใหม่ต่อท้ายเป็นที่ยอมรับ แต่ขึ้นบรรทัดใหม่นำหน้าไม่ได้ นอกเหนือจากการเลือกบรรทัดใหม่ของคุณผลลัพธ์ควรมีลักษณะเช่นนี้:

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz

ข้อยกเว้นสำหรับกฎนี้เท่านั้นคือเอาต์พุตแบบคงที่ของล่ามภาษาของคุณที่ไม่สามารถระงับได้เช่นคำทักทายรหัสสี ANSI หรือการเยื้อง

กฎเพิ่มเติม

  • นี่ไม่เกี่ยวกับการค้นหาภาษาด้วยวิธีที่สั้นที่สุดสำหรับการเล่น FizzBuzz นี่คือเกี่ยวกับการค้นหาวิธีที่สั้นที่สุดในทุกภาษา ดังนั้นจะไม่มีการทำเครื่องหมายคำตอบว่าเป็นที่ยอมรับ

  • สิ่งที่ส่งมาจะถูกทำคะแนนเป็นไบต์ในการเข้ารหัสที่มีมาก่อนโดยปกติ (แต่ไม่จำเป็น) UTF-8 บางภาษาเช่นโฟลเดอร์มีความยุ่งยากเล็กน้อยในการให้คะแนน - หากมีข้อสงสัยกรุณาถาม Meta

  • ไม่มีอะไรสามารถพิมพ์ไปยัง STDERR

  • แตกต่างจากกฎทั่วไปของเราอย่าลังเลที่จะใช้ภาษา (หรือรุ่นภาษา) แม้ว่าจะใหม่กว่าความท้าทายนี้ หากใครต้องการที่จะใช้สิ่งนี้ในทางที่ผิดโดยการสร้างภาษาที่โปรแกรมว่างสร้าง FizzBuzz เอาไว้ขอแสดงความยินดีสำหรับการปูทางสำหรับคำตอบที่น่าเบื่อมาก

    โปรดทราบว่าจะต้องมีล่ามเพื่อให้สามารถส่งการทดสอบได้ ได้รับอนุญาต (และสนับสนุนให้) เขียนล่ามนี้ด้วยตัวคุณเองสำหรับภาษาที่ยังไม่ได้ใช้งานมาก่อน

  • หากภาษาที่คุณเลือกนั้นแตกต่างจากภาษาอื่น (อาจเป็นที่นิยมมากกว่า) ซึ่งมีคำตอบอยู่แล้ว (คิดว่าภาษาเบสิกหรือภาษา SQL, เชลล์ Unix หรืออนุพันธ์ Brainfuck ที่น่าสนใจอย่าง Alphuck และ ???) ให้เพิ่มข้อความลงไป ตอบว่าวิธีแก้ปัญหาที่เหมือนกันหรือคล้ายกันมากนั้นก็สั้นที่สุดในภาษาอื่นเช่นกัน

  • เนื่องจากการส่งออกได้รับการแก้ไขคุณอาจฮาร์ดโค้ดเอาท์พุท (แต่นี่อาจไม่ใช่ตัวเลือกที่สั้นที่สุด)

  • คุณอาจใช้วิธีแก้ปัญหาที่มีอยู่ก่อนตราบใดที่คุณให้เครดิตผู้แต่งดั้งเดิมของโปรแกรม

  • ช่องโหว่มาตรฐานไม่ได้รับอนุญาตเป็นอย่างอื่น

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

แค็ตตาล็อก

var QUESTION_ID=58615;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk";var OVERRIDE_USER=30525;var answers=[],answers_hash,answer_ids,answer_page=1,more_answers=true,comment_page;function answersUrl(index){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(index,answers){return"https://api.stackexchange.com/2.2/answers/"+answers.join(';')+"/comments?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){answers.push.apply(answers,data.items);answers_hash=[];answer_ids=[];data.items.forEach(function(a){a.comments=[];var id=+a.share_link.match(/\d+/);answer_ids.push(id);answers_hash[id]=a});if(!data.has_more)more_answers=false;comment_page=1;getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){data.items.forEach(function(c){if(c.owner.user_id===OVERRIDE_USER)answers_hash[c.post_id].comments.push(c)});if(data.has_more)getComments();else if(more_answers)getAnswers();else process()}})}getAnswers();var SCORE_REG=/<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;var OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(a){return a.owner.display_name}function process(){var valid=[];answers.forEach(function(a){var body=a.body;a.comments.forEach(function(c){if(OVERRIDE_REG.test(c.body))body='<h1>'+c.body.replace(OVERRIDE_REG,'')+'</h1>'});var match=body.match(SCORE_REG);if(match)valid.push({user:getAuthorName(a),size:+match[2],language:match[1],link:a.share_link,});else console.log(body)});valid.sort(function(a,b){var aB=a.size,bB=b.size;return aB-bB});var languages={};var place=1;var lastSize=null;var lastPlace=1;valid.forEach(function(a){if(a.size!=lastSize)lastPlace=place;lastSize=a.size;++place;var answer=jQuery("#answer-template").html();answer=answer.replace("{{PLACE}}",lastPlace+".").replace("{{NAME}}",a.user).replace("{{LANGUAGE}}",a.language).replace("{{SIZE}}",a.size).replace("{{LINK}}",a.link);answer=jQuery(answer);jQuery("#answers").append(answer);var lang=a.language;lang=jQuery('<a>'+lang+'</a>').text();languages[lang]=languages[lang]||{lang:a.language,lang_raw:lang.toLowerCase(),user:a.user,size:a.size,link:a.link}});var langs=[];for(var lang in languages)if(languages.hasOwnProperty(lang))langs.push(languages[lang]);langs.sort(function(a,b){if(a.lang_raw>b.lang_raw)return 1;if(a.lang_raw<b.lang_raw)return-1;return 0});for(var i=0;i<langs.length;++i){var language=jQuery("#language-template").html();var lang=langs[i];language=language.replace("{{LANGUAGE}}",lang.lang).replace("{{NAME}}",lang.user).replace("{{SIZE}}",lang.size).replace("{{LINK}}",lang.link);language=jQuery(language);jQuery("#languages").append(language)}}
body{text-align:left!important}#answer-list{padding:10px;width:290px;float:left}#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table>


1
Nothing can be printed to STDERR. นี่คือความจริงเฉพาะเมื่อทำงานหรือยังเมื่อรวบรวม (สมมติว่าเป็นขั้นตอนที่แยกต่างหาก?)
AShelly

@ AShelly เฉพาะเมื่อทำงาน
เบต้าของการสลายตัว

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

6
@Timwi ในขณะที่ฉันยอมรับว่ามันจะทำให้มันน่าสนใจมากขึ้น (เพียงเล็กน้อย) ฉันมักจะเห็น FizzBuzz อย่างเคร่งครัดเช่น 1 ถึง 100 (บน Wikipedia และ Rosetta Code เป็นต้น) หากเป้าหมายคือการท้าทาย FB แบบ "บัญญัติ" มันสมเหตุสมผลดี
Geobits

58
"วานิลลา fizzbuzz" ฟังดูอร่อย
iamnotmaynard

คำตอบ:


76

Python 2, 56

i=0;exec"print i%3/2*'Fizz'+i%5/4*'Buzz'or-~i;i+=1;"*100

6
แดงนั่นคืออัจฉริยะเลือด ฉันสามารถขโมยความคิดของคุณเพื่อทวีคูณสตริงด้วย mod-result ได้หรือไม่?
AdmBorkBork

@ TimmyD ไปข้างหน้า
feersum

15
วิธีการที่แตกต่างกัน 56 (จากที่นี่i=1;exec"print'FizzBuzz'[i%-3&4:12&8-i%5]or i;i+=1;"*100 ): ทุกคนต้องการลบเลือนนิพจน์การค้นหาเพื่อพยายามเพิ่มประสิทธิภาพบิต bashing หรือไม่
xnor

1
เทคนิคที่ดีมากฉันชอบการแบ่งผลลัพธ์แบบโมดูโลเพื่อให้เป็นแบบไบนารี! ฉันได้รับการปรับปรุงเพื่อให้วิธีการของคุณลงไปที่ 54 ตัวอักษร ... แน่นอนฉันจะไม่โพสต์เป็นคำตอบโดยไม่ได้รับอนุญาต (เนื่องจากเป็นคำตอบของคุณ ~ 95%);)
Tersosauros

2
@ Tersosauros ไปข้างหน้า ... วิธีการของฉันหายากมากและไม่ต้องสงสัยเลยว่ามีคนค้นพบด้วยตนเองมากมาย
feersum

76

Hexagony , 91 ไบต์

ขอบคุณสำหรับความโปรดปราน :)

ว้าวฉันไม่เคยจินตนาการเลยว่าจะสามารถเอาชนะโซลูชัน Hexagony ของ Martinได้ แต่ - ใครจะได้มัน - ฉันทำมันเสร็จแล้ว หลังจากความล้มเหลวหลายวันเพราะฉันไม่มี Hexagony colorer หรือEsotericIDEเพื่อตรวจสอบวิธีแก้ไขของฉัน ฉันมีข้อมูลจำเพาะหลายด้านที่ไม่ถูกต้องดังนั้นฉันจึงสร้าง“ โซลูชัน” ที่ผิดพลาดเพียงแค่ใช้ปากกาและกระดาษและโปรแกรมแก้ไขข้อความ ในที่สุดฉันก็เอาชนะความเกียจคร้านของฉันและโคลนทั้งแหล่งเก็บข้อมูลดาวน์โหลด VisualStudio และรวบรวมพวกเขา ว้าวเครื่องมือที่มีประโยชน์คืออะไร! อย่างที่คุณเห็นฉันอยู่ไกลจากการเป็นคนที่คุณโทรหาโปรแกรมเมอร์ (ฉันหมายความว่ามาเลยฉันไม่ได้ติดตั้ง VisualStudio และไม่มีเงื่อนงำเกี่ยวกับวิธีการคอมไพล์โปรแกรม);

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

Fizzbuzz ในรูปหกเหลี่ยมขนาด 6:

3}1"$.!$>)}g4_.{$'))\<$\.\.@\}F\$/;z;u;<%<_>_..$>B/<>}))'%<>{>;e"-</_%;\/{}/>.\;.z;i;..>(('

เค้าโครงหกเหลี่ยม:

      3 } 1 " $ .
     ! $ > ) } g 4
    _ . { $ ' ) ) \
   < $ \ . \ . @ \ }
  F \ $ / ; z ; u ; <
 % < _ > _ . . $ > B /
  < > } ) ) ' % < > {
   > ; e " - < / _ %
    ; \ / { } / > .
     \ ; . z ; i ;
      . . > ( ( '

และการแปลที่สวยงามต้องขอบคุณ Hexagony Colorer ของTimwi :

วิธีแก้ปัญหา Colorizz Hexagony FizzBuzz

ดังนั้นนี่คือแอนิเมชั่น GIF ที่มีความยาว 110 วินาทีที่ 2 fps แสดงการไหลของโปรแกรมในช่วง 6 หมายเลข1, 2, Fizz, 4, Buzz, Fizzแรกคือ 220 ticks แรกของโปรแกรม (คลิกที่ภาพเพื่อขนาดเต็ม):

ป้อนคำอธิบายรูปภาพที่นี่

ความดีของฉันขอบคุณซอฟต์แวร์คอมโพสิตของ Natron ภาพเคลื่อนไหวของตัวชี้ยังคงน่าเบื่อในการสร้าง แต่สามารถจัดการได้ การบันทึกภาพในหน่วยความจำ 260 ภาพสนุกน้อยลง น่าเสียดายที่ EsotericIDE ไม่สามารถทำได้โดยอัตโนมัติ ต่อไปเพลิดเพลินกับภาพเคลื่อนไหว!

ท้ายที่สุดเมื่อคุณพันศีรษะของคุณรอบ ๆ โมเดลหน่วยความจำและการตัดเส้นทางที่ใช้งานง่ายซึ่งข้ามเส้นขอบของรูปหกเหลี่ยม Hexagony ไม่ใช่เรื่องยากที่จะทำงานด้วย แต่การตีกอล์ฟอาจเป็นความเจ็บปวดที่ก้น ;)

มันสนุก!


1
ดีมาก! :) นั่นคือสิ่งที่ฉันพยายามลืมที่จะลองความยาวด้าน 6 ;) (น่าสนใจเพื่อดูว่าโซลูชันของฉันเหมาะสมกับความยาวด้าน 6 ได้ง่ายขึ้นหรือไม่)
Martin Ender

@ MartinBüttnerฉันชอบที่จะเห็นมัน :)
ML

2
ฉันเป็นโปรแกรมเมอร์น้อยกว่าคุณเพราะ Visual Studio คืออะไร : P
Rɪᴋᴇʀ

5
น่าเสียดายที่ EsotericIDE ไม่สามารถทำได้โดยอัตโนมัติ - กรุณาไปทางขวาไปข้างหน้าและยื่นข้อเสนอแนะคุณลักษณะที่ผมอาจจะได้รับรอบเพื่อทำที่บางวัน :)
Timwi

1
(อุ๊ปส์จะเกิดขึ้นหลังจาก 6 เดือนของการตอบครั้งสุดท้าย) คุณสามารถตี 1 ไบต์จากจุดสิ้นสุดของโปรแกรมโดยเลื่อนทางสีเทาไป 1 ไบต์และวาง "Canceling op" ในเส้นทางสีส้มเช่น3}1"$.!$>)}g4_'{$))}\<$\.\.@\;F\$/;z;u;<%<_>_..$>B/<>}))'%<>{>;e"-</_%;\/{}/>.\)(z;i;..>('ตอนนี้มีสิ่งพิเศษ (หลังจาก z ซึ่งสามารถ "ยกเลิก" ด้วย a) หรือโดยการใส่ z ที่นั่น ตอนนี้มันคือ a) ซึ่งดันคำสั่งทั้งหมดบนเส้นทางสีส้ม 1 ขีดในภายหลังและกลับมาพร้อมกับ no-op ที่อยู่บนบรรทัดที่ 3 Btw ฉันยังติดตั้ง Visual Studio เพียงเพราะ Hexagony Colorer และ Esoteric IDE: P
Sunny Pun

44

เขาวงกต , 94 ไบต์

"):_1
\ } 01/3%70.105
" :   @ "     .
"  =";_""..:221
+  _
"! 5%66.117
_:= "     .
="*{"..:221

Sub-100! นี่เป็นเรื่องสนุก

คำอธิบาย

เริ่มจากไพรเมอร์สั้น ๆ บน Labyrinth อย่าลังเลที่จะข้ามสิ่งนี้หากคุณคุ้นเคยกับพื้นฐานแล้ว:

  • เขาวงกตมีสองกอง - กองหลักและกองเสริม ทั้งสองกองมีจำนวนศูนย์ที่ด้านล่างเช่น+ในกองที่ว่างเปล่าเพิ่มศูนย์สองศูนย์ดังนั้นจึงผลักศูนย์

  • โฟลว์ควบคุมใน Labyrinth นั้นตัดสินโดย junctions ซึ่งดูที่ด้านบนของสแต็กเพื่อกำหนดตำแหน่งที่จะไปต่อไป หมายถึงลบเลี้ยวซ้ายหมายถึงศูนย์ไปข้างหน้าและบวกหมายถึงเลี้ยวขวา ... แต่ถ้าเราชนกำแพงแล้วเรากลับทิศทาง ตัวอย่างเช่นหากตรงไปข้างหน้าและเลี้ยวซ้ายเป็นไปได้ แต่ด้านบนของสแต็คเป็นบวกจากนั้นเราไม่สามารถเลี้ยวขวาเราเลี้ยวซ้ายแทน

  • ตัวเลขในป๊อปเขาวงกตxแล้วดัน10*x + <digit>ซึ่งทำให้ง่ายต่อการสร้างจำนวนมาก อย่างไรก็ตามนี่หมายความว่าเราต้องการคำแนะนำในการกด 0 เพื่อเริ่มหมายเลขใหม่ซึ่งเป็น_Labyrinth

ตอนนี้เรามาถึงรหัสที่แท้จริง!

ป้อนคำอธิบายรูปภาพที่นี่

สีแดง

การดำเนินการเริ่มต้นจาก"ในมุมบนซ้ายซึ่งเป็น NOP ถัดไปคือการ)เพิ่มส่วนบนสุดของสแต็กกด 1 ในการผ่านครั้งแรกและการเพิ่มขึ้นnในทุกการผ่าน

ต่อไปเราซ้ำกับn :ตั้งแต่nเป็นบวกเราเลี้ยวขวารัน}(บนสุดของสแต็คกะหลักในการเสริม) :และ เราเข้าสู่จุดตายดังนั้นเราจึงหันหลังกลับและดำเนินการ}และ:อีกครั้งโดยทิ้งกองไว้เช่นนั้น

Main [ n n | n n ] Aux

อีกครั้งnเป็นบวกและเราเลี้ยวขวาการดำเนินการ_101/ที่หารnด้วย 101 ถ้าnเป็น 101 แล้วn/101 = 1และเราจะกลายเป็น@ซึ่งยุติโปรแกรม มิฉะนั้นสถานการณ์ปัจจุบันของเราคือ

Main [ n 0 | n n ] Aux

ส้ม 1 (mod 3)

3เปลี่ยนศูนย์บนสุดเป็น 3 ( 10*0 + 3 = 3) และ%ดำเนินการโมดูโล หากเป็นบวกเราเลี้ยวขวาเข้าสีเหลืองn%3 "มิฉะนั้นเราดำเนินการซึ่งเอาท์พุท70.105.122:.. Fizzโปรดทราบว่าเราไม่จำเป็นต้องกดค่าศูนย์ใหม่_เนื่องจากn%3มีค่าเป็นศูนย์ในกรณีนี้ดังนั้นเราจึงสามารถใช้ประโยชน์จากศูนย์ที่ไม่มีที่สิ้นสุดที่ด้านล่างของสแต็ก ทั้งสองเส้นทางพบกันอีกครั้งที่แสงสีฟ้า

ฟ้าอ่อน

ด้านบนของสแต็คในขณะนี้n%3ซึ่งอาจจะเป็นบวกดังนั้นเพียงแค่ผลักดันให้เป็นศูนย์และทันทีที่ปรากฏเพื่อให้แน่ใจว่าเราจะไปตรงไปข้างหน้าแทนการเปลี่ยนเข้าสู่_; @จากนั้นเราจะใช้=เพื่อสลับยอดของหลักและสแต็คเสริมให้:

Main [ n | n%3 n ] Aux

ส้ม 2 (mod 5)

นี่เป็นสถานการณ์ที่คล้ายกันมาก่อนยกเว้นว่าจะเป็น66.117.122:..ผลลัพธ์Buzzถ้าn%5เป็นศูนย์

น้ำเงิน

ส่วนก่อนหน้าจะออกจากสแต็คเช่น

Main [ n%5 | n%3 n ] Aux

{เลื่อนn%3กลับไปที่สแต็กหลักและ*คูณสองโมดูโล

ถ้าโมดูโลเป็นศูนย์ผลิตภัณฑ์จะเป็นศูนย์ดังนั้นเราจึงตรงไปเป็นสีเหลือง =สลับด้านบนของสแต็คและ_ดันศูนย์เพื่อให้แน่ใจว่าเราไปข้างหน้าโดยให้

Main [ n 0 | 0 ] Aux

มิฉะนั้นถ้าทั้งโมดูโลสไม่ใช่ศูนย์ดังนั้นผลิตภัณฑ์จะไม่ใช่ศูนย์และเราเลี้ยวขวาเป็นสีเขียว =สลับยอดของกองให้

Main [ n | (n%5)*(n%3) ] Aux

หลังจากที่เราใช้ใน:การทำซ้ำnเลี้ยวขวาแล้วใช้เพื่อการส่งออก!n

สีม่วง

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

การวนซ้ำแต่ละครั้งจะเพิ่มส่วนเสริม(n%5)*(n%3)ลงในสแต็กเสริม แต่ไม่เช่นนั้นเราก็ทำสิ่งเดียวกันซ้ำแล้วซ้ำอีก


7
รักคำอธิบาย
The_Basset_Hound

29

Perl 5, 49 ไบต์

สคริปต์ 46 ไบต์ + 3 ไบต์ -E"..."

การใช้say(ซึ่งต้องใช้-E"...") สามารถลดขนาดลงเหลือ 46 ไบต์เนื่องจากsayมีการขึ้นบรรทัดใหม่โดยอัตโนมัติ (ขอบคุณ@Dennis !):

say'Fizz'x!($_%3).Buzz x!($_%5)||$_ for 1..100

Perl 5, 50 ไบต์

print'Fizz'x!($_%3).Buzz x!($_%5)||$_,$/for 1..100

sayคุณสามารถบันทึกไม่กี่ไบต์โดยใช้
เดนนิส

คุณทำลายกระดานคะแนน ...
LegionMammal978

@ LegionMammal978 ใช่ ใช่ฉันทำ ... ฉันจะลองอีกครั้งและคำชื่อเรื่องแล้ว! โอ๊ะ!
Dom Hastings

ไม่ใช่-E"..."8 ไบต์? Space + Dash + Option + อาร์กิวเมนต์ (+ Quoting)
Erik the Outgolfer

1
@EriktheGolfer ดังนั้นตั้งแต่ผมโพสต์นี้เป็นเอกฉันท์ว่า-Eเป็น 0 ไบต์ แต่เนื่องจากคำตอบของพรีโม่เป็นฝ่ายไม่รวมคำพูดที่ฉันเลือกที่จะทำให้มันเป็นธรรมและรวมถึงคำพูดในเหมืองและ +1 -Eสำหรับ เหตุผลก็คือยอมรับเป็นฟรี Perl มักจะทำงานผ่านperl -eและperl -Eไม่เกินไบต์ (ฉันคิดว่า-M5.010หรือuse 5.010สามารถเป็นฟรีเช่นกัน แต่อาจจะไม่อ่านเมตาโพสต์อีกครั้ง) เมื่อมีการเพิ่ม-pหรือ-nนี้จะนับเป็น 1 perl -peในขณะที่คุณจะทำงานกับ หวังว่าจะช่วย! การอ้างอิง Meta: meta.codegolf.stackexchange.com/a/7539
Dom Hastings

27

Ruby, 50 ไบต์

ต้องใช้รุ่น 1.8 ซึ่งดูเหมือนจะเป็นที่นิยมในหมู่นักกอล์ฟ:

1.upto(?d){|n|puts'FizzBuzz
'[i=n**4%-15,i+13]||n}

ใน Ruby รุ่นใหม่คุณจะแทนที่?dด้วย100โซลูชันขนาด 51 ไบต์

นี่น่าจะเป็นสถิติโลก


1
นั่นคือโหดร้ายรักมัน
Camden Narzt

?d100เป็นเพียง FizzBuzzสตริงมีการขึ้นบรรทัดใหม่ในนั้นนี้เป็นที่ถูกต้องในทับทิม string[i, s]เป็นชิ้นเริ่มต้นที่ตัวอักษรi(ดัชนี 0) ไปสำหรับsตัวอักษรละเว้นดัชนีชี้ไปนอกสตริง หากการโต้เถียงputsมีการขึ้นบรรทัดใหม่ก็จะถูกตัดออก สูตรควรอ่านง่ายหรือไม่ มันทำงานได้ทั้งหมดที่นี่ ฉันจะไม่พบมันโดยปราศจากความช่วยเหลือจากนักกอล์ฟมืออาชีพอย่าง Ruby
ลินน์

หมายเหตุด้านข้าง: หากคุณได้รับอนุญาตให้เพิ่ม 0 ที่จุดเริ่มต้นของการป้อนข้อมูล (คุณไม่ได้) จะสามารถบันทึก 2 ไบต์โดยใช้?e.timesแทน
Shelvacu

คุณช่วยอธิบายชิ้น[i=n**4%-15,i+13]ส่วนได้มั้ย ดูเหมือนจะไม่ห่อหัวฉันไว้รอบตัว
Piccolo

2
@Piccolo ตัวอย่างนี้ช่วยได้ไหม หากชิ้นคือออกไปจากตัวเราจึงได้รับi==-14 nilถ้าi==-9เราตัดi+13==4ตัวละครที่เริ่มต้นจากตัวละครที่ 9 'Fizz'จากจุดสิ้นสุดดังนั้น ถ้าi==-5เราหั่น 8 ตัวอักษรเริ่มต้นจากตัวละครที่ 5 'Buzz\n'จากท้ายที่สุดเพื่อให้ (เราพยายามที่จะหั่น 8 แต่มีเพียง 5 ดังนั้นเราจึงได้ 5) และอื่น ๆ
ลินน์

26

Java, 130 ไบต์

นี่สำหรับรุ่น Java ล่าสุด (7+) ในรุ่นเก่าคุณสามารถโกนออกได้มากกว่าโดยใช้enumเล่ห์เหลี่ยม แต่ฉันไม่คิดว่าตรรกะจะสั้นกว่านี้ (86 ข้างในmain)

class F{public static void main(String[]a){for(int i=0;i++<100;)System.out.println((i%3<1?"Fizz":"")+(i%5<1?"Buzz":i%3<1?"":i));}}

ฉันไม่คิดว่าเคล็ดลับการเริ่มต้นบล็อกช่วยได้ที่นี่เนื่องจากคำถามระบุ stderr ว่าง
feersum

อืมมม ฉันรู้ว่าเคล็ดลับคงที่พิมพ์ไปยัง stderr แต่ฉันคิดว่า Enum วิ่งอย่างหมดจด เป็นการดีที่จะทราบ :)
Geobits

4
เอาชนะฉันด้วย 14 ไบต์! การใช้ <1 แทน == 0 เป็นวิธีที่ดีในการบันทึก!
ESP

2
class F{public static-> interface F{staticใน java 8
TheNumberOne

1
ที่ไม่ได้ค่อนข้างวิธี enums ทำงาน คุณต้องทำenum F{;public...ดังนั้นคุณจะไม่ได้รับการบันทึกไบต์ใด ๆ
HyperNeutrino

23

Pyth, 30

VS100|+*!%N3"Fizz"*!%N5"Buzz"N

ลองที่นี่

คำอธิบาย:

VS100|+*!%N3"Fizz"*!%N5"Buzz"N
VS100                            : for N in range(1,101)
     |                           : logical short-circuiting or
      +*!%N3"Fizz"               : add "Fizz" * not(N % 3)
                                 : Since not gives True/False this is either "" or "Fizz"
                  *!%N5"Buzz"    : Same but with 5 and Buzz
                             N   : Otherwise N
                                 : The output of the | is implicitly printed with a newline

23

Retina , 317 139 134 132 70 63 60 55 ไบต์

.100{`^
_
*\(a`(___)+
Fi;$&
\b(_{5})+$
Bu;
;_*
zz
'_&`.

ลองออนไลน์!

คำอธิบาย

.100{`^
_

.เป็นธงเงียบของโลกซึ่งจะปิดการส่งออกโดยปริยายในตอนท้ายของโปรแกรม 100{ล้อมรอบส่วนที่เหลือของโปรแกรมในลูปซึ่งจะถูกดำเนินการสำหรับการวนซ้ำ 100 รอบ ในที่สุดสเตจของตัวเองเพิ่งแทรก a _ที่จุดเริ่มต้นของสตริงซึ่งมีประสิทธิภาพเพิ่มตัวนับลูป unary

*\(a`(___)+
Fi;$&

การกำหนดค่าเพิ่มเติม *\(ล้อมรอบส่วนที่เหลือของโปรแกรมในกลุ่มพิมพ์ผลลัพธ์ด้วยการป้อนบรรทัดท้าย แต่ยังให้ทั้งกลุ่มอยู่ในระยะแห้งซึ่งหมายความว่าผลลัพธ์ของมันจะถูกทิ้งหลังจากพิมพ์เพื่อให้ตัวนับวนรอบของเราไม่ได้ถูกแก้ไขจริง . aเป็นตัวปรับแต่ง regex แบบกำหนดเองซึ่งจะผูกโยง regex ให้กับสตริงทั้งหมด (ซึ่งจะบันทึกไบต์ในการใช้^และ$อย่างชัดเจน)

Fizzขั้นตอนอะตอมตัวเองดูแล การหารด้วย3สามารถตรวจสอบได้ง่ายใน unary: เพียงทดสอบว่าหมายเลขนั้นสามารถเขียนซ้ำ___ได้หรือไม่ หากเป็นกรณีนี้เราFi;จะเติมลงในสตริง เครื่องหมายอัฒภาคคือเพื่อให้ยังคงมีคำที่อยู่ด้านหน้าของหมายเลขสำหรับขั้นตอนถัดไป ถ้าเราเปลี่ยนเส้นให้อยู่Fizz___...ในตำแหน่งระหว่างzและ_จะไม่ถือว่าเป็นขอบเขตเพราะ regex จะถือว่าทั้งตัวอักษรและขีดล่างเป็นตัวอักษรคำ อย่างไรก็ตามอัฒภาคยังช่วยให้เราในการลบzzความซ้ำซ้อนจากและFizzBuzz

\b(_{5})+$
Bu;

เราทำอย่างเดียวกันกับการหารด้วย5และBu;ถึงแม้ว่าเราไม่จำเป็นต้องรักษา_เวลาไว้ ดังนั้นเราจะได้ผลลัพธ์เช่น

_
__
Fi;___
____
Bu;
Fi;______
...
Fi;Bu;
...

สิ่งนี้ทำให้ง่ายต่อการกำจัดขีดล่างในบรรทัดที่มีอยู่Fizzในขณะที่ยังเติมzzs:

;_*
zz

นั่นคือเราเปลี่ยนเซมิโคลอนแต่ละตัวเป็นzzแต่เราก็กินทุกอย่าง_ทันทีหลังจากนั้น ณ จุดนี้เราทำกับ FizzBuzz เป็นอันมาก แต่ความท้าทายต้องการเอาท์พุททศนิยม

'_&`.

&บ่งบอกถึงเงื่อนไข: ขั้นตอนนี้จะดำเนินการเฉพาะถ้าสตริงมีขีดล่าง ดังนั้นFizz, BuzzและFizzBuzzการทำซ้ำที่เหลือไม่มีใครแตะต้อง ในการวนซ้ำอื่น ๆ ทั้งหมด (เช่นที่ไม่หารด้วย 3 หรือ 5) เราแค่นับจำนวนตัวอักษรแปลงผลลัพธ์เป็นทศนิยม


20

gs2 , 1

f

อ้างจากมาร์ทผู้สร้าง GS2 นี้:

ฉันต้องการหนึ่งไบต์ของgorubyขนาด 1 ไบต์Hello, world!ดังนั้น ... สิ่งนี้พิมพ์"1\n2\nFizz\n4\nBuzz\n..."ออกมา :)

ปรับปรุง : เพิ่ม 27 ไบต์คำตอบfที่ไม่ได้ใช้


20

Perl 5, 45 ไบต์

say((Fizz)[$_%3].(Buzz)[$_%5]or$_)for+1..100

ต้องใช้-Eตัวเลือกนับเป็นหนึ่ง สิ่งนี้จะต้องถูกเรียกใช้จากบรรทัดคำสั่งเช่น:

perl -Esay((Fizz)[$_%3].(Buzz)[$_%5]or$_)for+1..100

คำพูดรอบคำสั่งที่ไม่จำเป็นหากหลีกเลี่ยงการใช้ช่องว่างหรือตัวอักษรอื่นใดที่สามารถทำหน้าที่เป็นตัวคั่นบรรทัดคำสั่ง ( |, <, >, &ฯลฯ )


Perl 5, 48 ไบต์

print+(Fizz)[$_%3].(Buzz)[$_%5]||$_,$/for 1..100

หากตัวเลือกบรรทัดคำสั่งถูกนับเป็นตัวเลือกแต่ละตัว-lจะบันทึกหนึ่งไบต์ (โดยแทนที่$/) อย่างไรก็ตามด้วยกฎ Perlgolf แบบคลาสสิกสิ่งนี้จะนับ 3: หนึ่งสำหรับ-หนึ่งสำหรับlหนึ่งและสำหรับพื้นที่ที่จำเป็น


คุณสามารถใช้sayกับ-Eสวิตช์ซึ่งมีระยะการแก้ไข 1 ถึง-eดังนั้นควรนับเป็น 1 ไบต์
เดนนิส

เฮ้พรีโม่ฉันรู้สึกว่าฉันกำลังโกงในคำตอบของฉันสำหรับการใช้sayงานฉันคิดว่า-Eสามารถใช้แทน-eซึ่งจะทำให้คุณลดลงถึง 44 แทนที่จะเป็น 46 ฉันไม่คิดว่ามันยุติธรรมที่จะให้คะแนน แตกต่างจากคุณกลไกการให้คะแนนที่ต้องการคืออะไร ฉันมักจะใช้printเพื่อหลีกเลี่ยงปัญหานี้! ที่อยู่ใกล้กับฉันทามติจะเป็นนี้ ?
Dom Hastings

ใช้เวลาส่วนตัวของฉันคือว่าทุกไบต์เพิ่มเติมเกี่ยวกับบรรทัดคำสั่งควรคะแนน 1. โดยเฉพาะอย่างยิ่งสำหรับsayถ้ารหัสของคุณสามารถเขียนได้ในหนึ่งบรรทัดหลีกเลี่ยงการแยกระบบปฏิบัติการใด ๆ คะแนน -E1 หากคุณจำเป็นต้องใช้คำพูดเช่น-E"$a||$b"คะแนน 3. ถ้าคุณไม่สามารถได้รับมันในหนึ่งบรรทัดคะแนน -M5.015 -lแต่ในจุดที่คุณต้องการอาจจะดีกว่าการใช้ ฉันไม่เห็นด้วยว่าควรจะให้บริการฟรีตามค่าเริ่มต้นด้วยเหตุผลสองประการ: 1) การปรับปรุงเล็กน้อยและไม่น่าสนใจและ 2) ไม่มีรุ่นของล่ามซึ่งจะเปิดใช้งานตามค่าเริ่มต้น
โม่

20

ขี้ผึ้ง ,104 89 81 ไบต์

อนุญาตให้บรรจุแบบหนาแน่นมากขึ้นสำหรับการตัดอีก 8 ไบต์

วิธีแก้ปัญหาที่สั้นที่สุด (81 ไบต์) การไหลของโปรแกรมเดียวกันการบรรจุที่แตกต่างกัน

p?@<
p?{@b'gA<
p@`zzuB`d'%~5F@<f`z`<
 >~P"#"_"1F3~%'d`Fiz`b
 d;"-~@~.<
>?N@9P~0+d

การเปลี่ยนแนวคิดทำให้ฉันสามารถลดรหัสได้ 15 ไบต์ ฉันต้องการกำจัดการทดสอบ double mod 5 ในโซลูชันดังนั้นฉันจึงติดตั้งแฟล็ก

คำอธิบายสั้น ๆ :

หากn%3=0Fizz ได้รับการพิมพ์และตั้งค่าสถานะ การรับรู้สถานะทำได้ง่าย ๆ เพียงแค่กดค่า lstack สูงสุดลงบน gstack (คำสั่งf)

ถ้าเป็นn%5=0เช่นนั้นn%3=0(กรณี FizzBuzz) หรือn%3>0(กรณี Buzz) ในทั้งสองกรณี Buzz จะถูกพิมพ์และการตั้งค่าสถานะใหม่โดยการเปิดสแต็คจนกว่าจะว่างเปล่า (คำสั่ง?)

ตอนนี้กรณีที่น่าสนใจ:

ถ้าn%5>0อย่างนั้นเราก็มีn%3=0(พิมพ์กรณี Fizz, n ต้องไม่ถูกพิมพ์) หรือn%3>0(ไม่พิมพ์ Fizz ดังนั้นต้องพิมพ์ n) ใช้เวลาในการตรวจสอบธง นี่คือความตระหนักโดยการผลักดันความยาวของ gstack ที่ด้านบนของ gstack (คำแนะนำA) หากn%3 was 0ความยาวของ gstack เท่ากับ> 0 หากn%3 was >0ความยาวของ gstack เท่ากับ 0 การกระโดดตามเงื่อนไขอย่างง่ายทำให้แน่ใจว่าจะได้รับการพิมพ์ n หากความยาวของ gstack เท่ากับ 0

อีกครั้งหลังจากพิมพ์ใด ๆ ของ n, Fizz และ / หรือ Buzz และขึ้นบรรทัดใหม่ gstack จะถูกตอกสองครั้งเพื่อให้แน่ใจว่าว่างเปล่า gstack ว่างเปล่า[]ซึ่งนำไปสู่[0]หลังจากการสอนA(push length ของ gstack บน gstack) หรือมีหนึ่งศูนย์ ( [0]ซึ่งเป็นผลมาจาก n% 3) ซึ่งนำไปสู่[0 1]เนื่องจาก [0] มีความยาว 1 โผล่ขึ้นมาจาก สแต็กที่ว่างเปล่าไม่เปลี่ยนสแต็กดังนั้นจึงปลอดภัยที่จะปรากฏสองครั้ง

หากคุณมองใกล้คุณจะเห็นว่าโดยหลักการแล้วฉันพับ

>      q
d`Fizz`f>

เข้าไป

<f`z`<
d`Fiz`b

ซึ่งช่วยกำจัดช่องว่างที่สูญเปล่าทั้งหมดระหว่างAและ<ท้ายแถวต่อไปนี้ในโซลูชันเก่าด้านล่าง:

q?{@b'gA<       p      <

โซลูชั่นแนวคิดใหม่ (89 ไบต์) รวมถึงคำอธิบายแบบเคลื่อนไหว:

q?@ <
 q?{@b'gA<       p      <
p?<@`zzuB`b'%~5F@<f`zziF`b'<
>N@9P~0+.~@~-";~P"#"_"1F3~%d

เค้าโครงหกเหลี่ยม:

   q ? @   <
    q ? { @ b ' g A <               p             <
 p ? < @ ` z z u B ` b ' % ~ 5 F @ < f ` z z i F ` b ' <
> N @ 9 P ~ 0 + . ~ @ ~ - " ; ~ P " # " _ " 1 F 3 ~ % d

แอนิเมชันของเห็บ 326 ตัวแรกที่ 2 fps ด้วยสแต็คท้องถิ่นและทั่วโลกและส่งออกไปยัง STDOUT

ภาพเคลื่อนไหวขี้ผึ้ง FizzBuzz


สำหรับการเปรียบเทียบด้านล่างนี้เป็นเส้นทางซ้อนทับของโซลูชันที่เก่ากว่าและซับซ้อนกว่า อาจเป็นโซลูชันที่สวยกว่าจากมุมมองของภาพ)

โปรแกรมที่มีการแสดงข้อมูลเส้นทาง


2
นี่มันบ้าและสวยงามเหมือน Hexagony มี +1!
ETHproductions

@ ETHproductions ฉันยังคงต้องลอง Hexagony แต่จากสิ่งที่ฉันสามารถบอกได้จากสเปคภาษาขี้ผึ้งของฉันไม่ได้เข้าใกล้ความบ้าคลั่งของ Hexagony
ML

ขอให้เรายังคงอภิปรายนี้ในการแชท
ML

คุณสร้างภาพเคลื่อนไหวเหล่านั้นได้อย่างไร?
baordog

18

> <> , 68 66 65 64 ไบต์

1\2+2foooo "Buzz"<
o>:::3%:?!\$5%:?!/*?n1+:aa*)?;a
o.!o"Fizz"/oo

เคล็ดลับเดียวคือการคูณที่เหลือเป็นเงื่อนไขในการพิมพ์หมายเลข ด้วยวิธีนี้หากหนึ่งในนั้นคือ 0 เราจะไม่พิมพ์หมายเลข

คุณสามารถทดลองใช้งานได้ที่นี่

บันทึกหนึ่งไบต์ด้วย Sp3000 และขอบคุณ randomra ขอบคุณมาก!


1
เล่นกอล์ฟได้ดีมากฉันชอบการนำ "\" กลับมาใช้ใหม่ในบรรทัดแรกและอีกบรรทัดในบรรทัดที่สอง
โคล

1
-1 ไบต์ถ้าคุณย้ายoจุดสิ้นสุดของบรรทัดที่สองไปยังพื้นที่ว่างที่จุดเริ่มต้นของบรรทัดฉันเชื่อว่า
Sp3000

@ Sp3000 แน่นอนฉันใช้เวลากับการเล่นกอล์ฟมากฉันไม่รู้ว่าสิ่งนี้ไม่ได้เกิดขึ้นในใจ
Aaron

1
ใครต้องการฉวัดเฉวียนฟองเมื่อคุณสามารถมีfoooo Buzz?
caird coinheringaahing

17

gs2 , 28 27 (ไม่รวมf)

hex:

1b 2f fe cc 04 46 69 7a 7a 09 07 42 75 7a 7a 19 06 27 2d d8 62 32 ec 99 dc 61 0a

คำอธิบาย:

1b    100
2f    range1 (1..n)
fe    m: (map rest of program)

cc    put0 (pop and store in register 0)
04    string-begin
Fizz
09    9
07    string-separator
Buzz
19    25
06    string-end-array (result: ["Fizz"+chr(9) "Buzz"+chr(25)])

27    right-uncons
2d    sqrt
d8    tuck0 (insert value of register 0 under top of stack)
62    divides
32    times (string multiplication)
ec    m5 (create block from previous 5 tokens, then call map)

99    flatten
dc    show0 (convert register 0 to string and push it)
61    logical-or
0a    newline

การฝัง 3 และ 5 ลงในค่าคงที่สตริงใช้ไม่ได้เพราะ\x05สิ้นสุดตัวอักษรของสตริง

หมายเหตุ: ปัญหานี้สามารถแก้ไขได้ใน1 ไบต์มี GS2 fใช้ในตัว


16

C, 85 ไบต์

i;main(){for(;i++<=99;printf("%s%s%.d\n",i%3?"":"Fizz",i%5?"":"Buzz",(i%3&&i%5)*i));}

-2 ขอบคุณคลื่นไส้


กำลังพยายามรวบรวมที่นี่ แต่gccไม่รู้จักบรรทัดใหม่ภายในสตริงเป็น \ n มันทำให้ฉันมีข้อผิดพลาดในการรวบรวม ฉันจำเป็นต้องส่งพารามิเตอร์ใด ๆ ไปยังคอมไพเลอร์หรือไม่ BTW คุณพลาด<=โพสต์ของคุณ (ฉันนับ 88 ไบต์ด้วย <= ... ดังนั้นฉันคิดว่ามันหายไป)
wendelbsilva

อุ่ย พลาดข้อผิดพลาดในคำเตือน เพิ่ม 2 ตัวอักษร
AShelly

ตัวแปรโกลบอลนั้นเริ่มต้นได้ที่ศูนย์ดังนั้นmain(i)ลองi;main()แทน จากนั้นคุณสามารถกำจัดi--จุดเริ่มต้นของfor()ลูปได้ คุณไม่จำเป็นต้องมีตัวแบ่งบรรทัด ที่ควรนำมานับไบต์ลงไปที่ 85
squeamish ossifrage

2
ขึ้นอยู่กับวิธีที่คุณต้องการรับ UB คุณสามารถทำ 73, 74 หรือ 75 ไบต์ นี่คือคำตอบที่ 74 ไบต์ของฉัน
ลินน์

1
OMG ฉันใช้เวลา 3 ชั่วโมงในการพยายามทำให้สิ่งนี้เล็กลงเพียงหนึ่งไบต์ ไปเลย แทนที่(i%3&&i%5)*iด้วยi%3*i%5?i:0ฉันจะเข้านอน
Albert Renshaw

16

CJam, 35 ไบต์

100{)_[Z5]f%:!"FizzBuzz"4/.*s\e|N}/

ลองใช้ออนไลน์ในล่าม CJam

มันทำงานอย่างไร

100{)_[Z5]f%:!"FizzBuzz"4/.*s\e|N}/
100{                             }/  For each integer I between 0 and 99:
    )_                                 Increment I and push a copy.
      [Z5]                             Push [3 5].
          f%                           Map % to push [(I+1)%3 (I+1)%5].
            :!                         Apply logical NOT to each remainder.
              "FizzBuzz"4/             Push ["Fizz" "Buzz"].
                          .*           Vectorized string repetition.
                            s\         Flatten the result and swap it with I+1.
                              e|       Logical OR; if `s' pushed an empty string,
                                       replace it with I+1.
                                N      Push a linefeed.

3
วิธีแก้ปัญหาที่ตรงไปตรงมามากขึ้น:100{):I3%!"Fizz"*I5%!"Buzz"*+Ie|N}/
aditsu

16

MUMPS, 56 54 ไบต์

f i=1:1:100 w:i#5=0 "Fizz" w:i#3=0 "Buzz" w:$X<3 i w !

สิ่งนี้คือw:$X<3 iสิ่งที่คุณถาม? $Xเป็นตัวแปรเวทย์มนตร์ ("ภายใน") ที่เก็บตำแหน่งแนวนอนของเคอร์เซอร์เอาท์พุท (เป็นจำนวนตัวอักษรจากขอบซ้ายของเทอร์มินัล) wเป็นรูปแบบย่อของWRITEคำสั่ง ไวยากรณ์command:condition argsคือ postconditional - "if condition, then do command args"

ดังนั้นเรากำลังตรวจสอบว่าเคอร์เซอร์เอาต์พุตได้รับการพัฒนามากกว่าสองตัวอักษร (ซึ่งหมายความว่าอย่างน้อยหนึ่งในนั้น"Fizz"หรือ"Buzz"ถูกเขียนไปยังเทอร์มินัล) และถ้าไม่เขียนiไปที่เทอร์มินัล $Xตัวแปร - และด้วยเหตุนี้การเรียงลำดับของการแบ่งแยกไม่ลึกจากสถานีนี้ - เป็นคุณลักษณะที่ชั้นแรกของคางทูม Yikes


15

เยลลี่ , 24 20 ไบต์

³µ3,5ḍTị“¡Ṭ4“Ụp»ȯµ€G

ลองออนไลน์!

มันทำงานอย่างไร

³µ3,5ḍTị“¡Ṭ4“Ụp»ȯµ€G  Main link. No input.

³                     Yield 100.
 µ                    Begin a new, monadic chain.
                 µ€   Apply the preceding chain to all integers n in [1, ..., 100].
  3,5ḍ                Test n for divisibility by 3 and 5.
      T               Get all truthy indices.
                      This yields [1] (mult. of 3, not 5), [2] (mult. of 5, not 3),
                      [1, 2] (mult. of 15) or [].
        “¡Ṭ4“Ụp»      Yield ['Fizz', 'Buzz'] by indexing in a dictionary.
       ị              Retrieve the strings at the corr. indices.
                ȯ     Logical OR hook; replace an empty list with n.
                   G  Grid; join the list, separating by linefeeds.

ไม่มีใครออกเดน
นิส golfed

15

brainfuck, 206 ไบต์

++>+++++>>>>>++++++++++[>+>>+>>+>+<<<[++++<-<]<,<,-<-<++<++++[<++>++++++>]++>>]>
[+[[<<]<[>>]+++<[<.<.<..[>]]<<-[>>>[,>>[<]>[--.++<<]>]]+++++<[+[-----.++++<<]>>+
..<-[>]]<[->>,>+>>>->->.>]<<]<[>+<<<,<->>>+]<]

จัดรูปแบบ:

++>+++++>>>>>
++++++++++[>+>>+>>+>+<<<[++++<-<]<,<,-<-<++<++++[<++>++++++>]++>>]
>
[
  +
  [
    [<<]
    <[>>]
    +++<
    [
      Fizz
      <.<.<..
      [>]
    ]
    <<-
    [
      >>>
      [
        ,>>[<]
        >[--.++<<]
        >
      ]
    ]
    +++++<
    [
      Buzz
      +[-----.++++<<]
      >>+..
      <-
      [>]
    ]
    <[->>,>+>>>->->.>]
    <<
  ]
  <[>+< <<,<->>>+]
  <
]

ลองออนไลน์

เลย์เอาต์ของหน่วยความจำคือ

0 a 122 105 70 b f 0 t d1 s d2 c d 10 0

ที่fรอบ 3, bรอบ 5, d1เป็นหลักคนd2เป็นหมื่นหลักsเป็นธงว่าจะพิมพ์หมื่นบาทเป็นdรอบที่ 10, cพื้นที่สำเนาd, tพื้นที่ทำงานที่ถือเป็น 0 หรือขยะข้อมูลหรือธงไม่ได้เป็น -divisible-by-3 และaกำหนดการสิ้นสุดของโปรแกรมโดยการชดเชยตัวชี้หลังจาก Buzz ได้รับการพิมพ์ 20 ครั้ง


14

C #, 128 126 125 124 ไบต์

class A{static void Main(){for(var i=0;i++<100;)System.Console.Write("{0:#}{1:;;Fizz}{2:;;Buzz}\n",i%3*i%5>0?i:0,i%3,i%5);}}

89 ไบต์โดยไม่มีรหัส boilerplate รอบ ๆ

ทำได้ด้วยการใช้ C # ฯรูปแบบตามเงื่อนไข

ด้วยตัวคั่นสองส่วน;Fizz หรือ Buzz จะถูกพิมพ์หากค่าจากเงื่อนไขเป็นศูนย์


บันทึกทั้งหมด 4 ไบต์ด้วย @RubberDuck, @Timwi และ @Riokmij


มันจะสั้นกว่าในการโทรWriteและต่อท้ายบรรทัดใหม่โดยตรงกับสตริงใช่ไหม
RubberDuck

นอกจากนี้ยังเป็นหนึ่งไบต์สั้นจะเขียนแทนi%3*i%5>0?i:0 i%3*i%5==0?0:i
Timwi

คุณสามารถบันทึกไบต์อื่นในforคำสั่งโดยใช้for(var i=0;i++<100;)
Najkin

1
คุณสามารถบันทึกสามไบต์มากขึ้นโดยการใช้ประโยชน์จากString แก้ไขจาก C # 6.0 และข้อโต้แย้งการฝังรูปแบบเป็นสตริงตัวเอง (เช่น$"{(i%3*i%5>0?i:0):#}...\n")
LiamK

1
สามารถทำกับ 121 bytes ได้แล้ววันนี้ -class A{static void Main(){for(var i=0;i<100;)System.Console.Write($"{(++i%3*i%5<1?0:i):#}{i%3:;;Fizz}{i%5:;;Buzz}\n");}}
Jerri Kangasniemi

14

Clojure, 113 106 101 100 91 ไบต์

กอล์ฟครั้งแรกของฉัน!

(dotimes[i 100](println(str({2'Fizz}(mod i 3))({4'Buzz}(mod i 5)({2""}(mod i 3)(inc i))))))

Ungolfed:

(dotimes [i 100] ; account for off-by-one later
  (println (str ({2 'Fizz} ; str converts symbols to strings
                 (mod i 3))
                ({4 'Buzz} ; 4 instead of 0 because of off-by-one
                 (mod i 5)
                 ({2 ""} ; shortest way to write when-not
                  (mod i 3)
                  (inc i))))))

1
คุณสามารถลบ 5 ตัวอักษรโดยการจัดการprintlnแบบเดียวกับในโซลูชัน Javaเช่น (doall(map #(let[t(=(mod % 3)0)](println(str(if t"Fizz""")(if(=(mod % 5)0)"Buzz"(if t""%)))))(range 1 101)))
ช่วยกู้

1
@ resueman ขอบคุณ! จริง ๆ แล้วมันจบลงด้วยการเป็น 7 เพราะ(if t"Fizz""")สามารถทำให้ง่าย(if t"Fizz")ขึ้น :)
Sam Estep

+1 modulo หลอกลวงทีแรกฉันคิดว่าคุณมีข้อผิดพลาดออกไป
coredump

14

brainfuck , 411 350 277 258 ไบต์

การแก้ไข:

  • -61 ไบต์โดยจัดเก็บค่าของ "Fizz Buzz" เป็น"BuziF" "BuziG" และทำซ้ำส่วนการพิมพ์ตัวเลข

  • -71 ไบต์โดยการทำซ้ำส่วนการพิมพ์หมายเลขโมดูโลแยกตัวนับลูปและตัวนับจำนวนแล้วนำเซลล์ newline กลับมาใช้ใหม่เป็นค่า mod เหนือสิ่งอื่นใด

  • -19 ไบต์โดยตระหนักว่าไม่มี 0 ใด ๆ ในหมายเลข FizzBuzz เพิ่มคำอธิบาย

+[-[>+<<]>-]>--[>+>++>++>++++++>+>>>++++++[<<<]>-]<+++++[>+>+>->>->++>>>-->>>++[<<<]>>>-]>[>]+++>>[>+<<<-[<]<[>+++>+<<-.+<.<..[<]<]>>-[<<]>[.>.>..>>>>+[<]+++++<]>[>]>>[[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>[-<+>]>,>[>]<[>-[<+>-----]<---.,<]++++++++++>]<.<<<<,>-]

ลองออนไลน์!

แทนที่จะตรวจสอบว่าตัวเลขนั้นหารด้วย 5 หรือ 3 ได้หรือไม่ฉันมีตัวนับสองตัวคอยติดตามโมดูโลของตัวเลขนั้นลดลงสำหรับแต่ละตัวเลขและพิมพ์คำที่ตรงกันเมื่อพวกเขามาถึง 0

มันทำงานอย่างไร:

+[-[>+<<]>-]>--  Generate the number 61
[>+>++>++>++++++>+>>>++++++[<<<]>-] Set the tape to multiples of 61
TAPE: 0 0' 61  122 122 110 61  0 0 110
           "=" "z" "z" "n" "="
<+++++[>+>+>->>->++>>>-->>>++[<<<]>>>-]>[>]+++>> Modify values by multiples of 5
TAPE: 0' 5 66  117 122 105 71  3 0 100' 0 0 10
           "B" "u" "z" "i" "G"
Some info:
  5     - Buzz counter
  "Buz" - Buzz printing
  "ziG" - Fizz printing. Modifying the G in the loop is shorter than modifying it outside
  3     - Fizz counter
  0     - This is where the Fizz|Buzz check will be located
  100   - Loop counter
  0     - Number counter. It's not worth it to reuse the loop counter as this.
  0     - Sometimes a zero is just a zero
  10    - Value as a newline and to mod the number by

[ Loop 100 times
  >+<<<  Increment number counter
  -[<]<  Decrement Fizz counter
  [ If Fizz counter is 0
    >+++ Reset the Fizz counter to 3
    >+<< Set the Fizz|Buzz check to true
    -.+<.<.. Print "Fizz"
  [<]<] Sync pointers
  >>-[<<]> Decrement Buzz counter
  [ If Buzz counter is 0
    .>.>.. Print "Buzz"
    >>>>+  Set the Fizz|Buzz check to true
    [<]+++++< Reset the Buzz counter to 5
  ]
  >[>]>> Go to Fizz|Buzz check
  [ If there was no Fizz or Buzz for this number
    TAPE: 3% BuziG 5% 0 Loop Num' 0 10
    [->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]  Mod the number counter by 10
    TAPE: 3% BuziG 5% 0 Loop 0' Num 10-Num%10 Num%10 Num/10
    >[-<+>] Move Num back in place
    >,>[>]< Reset 10-Num%10
    [ For both Num/10 (if it exists) and Num%10
      >-[<+>-----]<--- Add 48 to the number to turn it into the ASCII equivilent
      .,< Print and remove
    ]
    ++++++++++> Add the 10 back
  ]
  <. Print the newline
  <<<<, Remove Fizz|Buzz check
  >- Decrement Loop counter
]

ทำได้ดีมากโจ! ฉันอาจพยายามเอาชนะสักวันหนึ่ง :)
Forcent Vintier

13

PowerShell, 78 68 61 54 ไบต์

1..100|%{(($t="Fizz"*!($_%3)+"Buzz"*!($_%5)),$_)[!$t]}

แก้ไข: บันทึก 10 ไบต์ขอบคุณfeersum

แก้ไข 2: รู้ว่าด้วยกลอุบายของ feersum ฉันไม่จำเป็นต้องกำหนด $ t เป็น string-of-code-blocks

แก้ไข 3: บันทึกอีก 7 ไบต์ด้วยDanko Durbić

ในทำนองเดียวกันจิตวิญญาณต่อคำตอบของรหัส Rosetta แต่การตีกอล์ฟค่อนข้างน้อย

คำอธิบาย

1..100|%{...} สร้างคอลเลกชันของ 1 ถึง 100 จากนั้นสำหรับแต่ละวัตถุในคอลเลกชันที่ทำ

(...,$_)สร้างคอลเลกชันใหม่ของสององค์ประกอบ: 0) $t=...ตั้งค่าตัวแปร$tเท่ากับสตริง; 1) $_จำนวนลูปปัจจุบันของเรา

"Fizz"*!($_%3)ใช้หมายเลขปัจจุบันของเราดัดแปลงด้วย 3 จากนั้นไม่ใช่ผลลัพธ์ ทวีคูณ "ฟอง" โดยที่และเพิ่มลงในสตริง (และคล้ายกันสำหรับ 5) PowerShell ปฏิบัติต่อตัวเลขที่ไม่เป็นศูนย์ใด ๆ$TRUEดังนั้นจึงไม่ใช่ตัวเลขที่ไม่ใช่ศูนย์คือ 0 ซึ่งหมายความว่าเฉพาะถ้าหมายเลขปัจจุบันของเราเป็นจำนวนทวีคูณของ 3 จะเพิ่ม "Fizz" ลงในสตริง

[!$t]ดัชนีลงในคอลเลกชันที่เราเพิ่งสร้างขึ้นตามค่าของสตริง$t- ไม่ว่างเปล่าพิมพ์อื่น ๆ พิมพ์หมายเลขปัจจุบันของเรา


อีกทางเลือกหนึ่งเช่นกัน 54 ไบต์

1..100|%{'Fizz'*!($_%3)+'Buzz'*!($_%5)-replace'^$',$_}

ขอบคุณTesselatingHeckler

ในแนวคิดนี้ใช้ตัว-replaceดำเนินการอินไลน์และนิพจน์ทั่วไปเพื่อสลับสตริงว่าง^$ด้วยหมายเลขปัจจุบันของเรา หากสตริงไม่ว่างเปล่าจะไม่มีการสลับ


อีกทางเลือกหนึ่งเช่นกัน 54 ไบต์

1..100|%{($_,('Fizz'*!($_%3)+'Buzz'*!($_%5))|sort)[1]}

นี่เป็นโครงสร้างลูปเดียวกันกับด้านบน แต่ภายในนั้นจะทำการเรียงคู่ (n, string) และอาศัยความจริงที่ว่าสตริงว่างเรียงลำดับก่อนหน้าตัวเลข แต่สตริง FizzBuzz จะเรียงลำดับหลังตัวเลข จากนั้นจะจัดทำดัชนีผลลัพธ์การเรียงลำดับที่สอง


นอกจากนี้หาก PowerShell เคยใช้งาน||โอเปอเรเตอร์เช่นใน C # เราน่าจะลดลงเหลือ 43 ไบต์ด้วยบางสิ่งที่คล้ายกับ1..100|%{"Fizz"*!($_%3)+"Buzz"*!($_%5)||$_}... สงสัยเนื่องจาก|เป็นผู้ดำเนินการพิเศษที่สำคัญใน PowerShell แต่ฉันสามารถฝัน ...
AdmBorkBork

1
วิธีการเกี่ยวกับ1..100|%{'Fizz'*!($_%3)+'Buzz'*!($_%5)-replace'^$',$_}54?
TessellatingHeckler

คุณสามารถแทนที่if($t){$t}else{$_}ด้วยสิ่งที่ต้องการ($t,$_)[!$t]
Danko Durbić

1
... ดังนั้นคุณจะได้รับ1..100|%{(($t="Fizz"*!($_%3)+"Buzz"*!($_%5)),$_)[!$t]}ซึ่งเป็น 54 เช่น @ ข้อเสนอแนะของ @ TessellatingHeckler
Danko Durbić

@TessellatingHeckler PowerShell คืออะไรถ้าไม่ยืดหยุ่น
AdmBorkBork

13

JavaScript, 62 ไบต์

for(i=0;++i<101;console.log(i%5?f||i:f+'Buzz'))f=i%3?'':'Fizz'

ฉันคิดว่าฉันนี่เป็นวิธีแก้ปัญหา Javascript ที่สั้นที่สุดในขณะนี้


ว้าวว้าววว! แต่คำตอบของ JS อื่น ๆconsole.logนั้นใช้ มันน่ารำคาญน้อยกว่าการกด "ตกลง" ในกล่องป๊อปอัป 100 กล่องติดต่อกัน คุณช่วยเปลี่ยนสิ่งนี้ได้ไหม มันจะเป็นเพียง 62 ไบต์ยังคงสามดีกว่าของฉัน
ETHproductions

พรุ่งนี้ฉันจะต้องทำอย่างนั้นเพราะฉันได้แก้ไขโพสต์ของฉันเองแล้ว 5 รายการและไม่สามารถแก้ไขได้อีกต่อไป ...
Mama Fun Roll

2
โอ้ฉันไม่ได้ตระหนักถึงการ จำกัด การแก้ไข ...
ผลิตภัณฑ์ ETH

12

C, 74 ไบต์

main(i){for(;i<101;puts(i++%5?"":"Buzz"))printf(i%3?i%5?"%d":0:"Fizz",i);}

0อาร์กิวเมนต์printfแทนที่จะ""เป็นคาว แต่ดูเหมือนว่าจะทำงานบนแพลตฟอร์มที่สุดเท่าที่ผมลองบน putsSegfaults เมื่อคุณลองสิ่งเดียวกัน หากไม่มีมันคุณจะได้รับ 75 ไบต์

มีวิธีแก้ปัญหา 73- ไบต์ที่ทำงานบนอนาธิปไตยกอล์ฟและฉันพบว่าหนึ่งขุดรอบ ๆ ในสถานที่ที่เหมาะสมบนอินเทอร์เน็ต แต่พวกเขาพึ่งพาพฤติกรรมแพลตฟอร์มเฉพาะ (อย่างที่คุณอาจเดาได้มันเป็นแบบฟอร์มputs("Buzz"±...))


เคล็ดลับที่ดีที่จะได้รับ i = 1 สำหรับกรณี args (argc = 1) มันเป็นคุณสมบัติ: คุณสามารถเริ่มต้นลำดับจากจุดใดก็ได้โดยเรียกใช้./fizzbuzz $(seq 40): P
Peter Cordes

12

เริ่มต้น203 203ไบต์

จำนวนไบต์นับจากการแสดงข้อความต้นฉบับ golfed สำหรับโพสต์เมตานี้ รอยขีดข่วนมีพื้นที่ไม่มาก

sayเป็นสิ่งที่ใกล้เคียงกับ stdout Scratch มากที่สุด: sprite แสดงฟองคำพูดที่มีสิ่งที่กำลังพูด ในทางปฏิบัติwait n secsจะต้องใช้บล็อคเพื่ออ่านผลลัพธ์นี้จริง ๆ แต่สำหรับวัตถุประสงค์ของการท้าทายนี้รหัสนี้เป็นไปตามข้อกำหนด


คุณไม่มีหมายเลขหลังจากy =(ในทั้งสองเกิดขึ้น)
เบต้าผุ

@BetaDecay ขออภัย? ฉันไม่ทำตาม
ทิโมธี

ในลูปการวนซ้ำค่าที่set y to ...ขาดหายไป
เบต้าสลายลง

1
@BetaDecay นั่นคือสตริงว่าง :) หากคุณคลิกที่ภาพคุณสามารถดูได้ในทางปฏิบัติ!
ทิโมธี

Ohhh haha ​​ขออภัยที่สงสัยคุณ;)
เบต้าการสลายตัว

12

R, 88 83 77 71 70 ไบต์

ฉันแน่ใจว่าสิ่งนี้สามารถปรับปรุงได้ ... และด้วยเครดิตกับ @flodel มีการบันทึกไบต์อีกสองคู่ขอบคุณคำแนะนำจาก @njnnja และอีกรายการจาก @ J.Doe

x=y=1:100;y[3*x]='Fizz';y[5*x]='Buzz';y[15*x]='FizzBuzz';write(y[x],1)

คำตอบแมว เมาส์อยู่เหนือ :)
Silviu Burcea

1
ฉันพบว่าดีขึ้นเล็กน้อย:x=1:100;i=!x%%3;j=!x%%5;x[i]="Fizz";x[j]="Buzz";x[i&j]="FizzBuzz";cat(x,sep="\n")
flodel

@njnnja ขอบคุณสำหรับคำแนะนำ ผมดำเนินการด้วยwriteมากกว่าcatแม้ว่า
MickyT

2
พ่อมดที่นี่! การwriteเรียกสามารถใช้ 1 แทนสตริงว่างดังนั้นจึงx=y=1:100;y[3*x]='Fizz';y[5*x]='Buzz';y[15*x]='FizzBuzz';write(y[x],1)เป็นเรื่องไม่สำคัญ 1 ไบต์สำหรับ 70 ไบต์
J.Doe

68 ไบต์ bytecount มีแบ็กสเปซที่ไม่สามารถพิมพ์ได้สามอันและทำงานไม่ถูกต้องใน TIO
J.Doe

12

Haskell, 84 ไบต์

main=mapM f[1..100]
f n|d<-drop.(*4).mod n=putStrLn$max(show n)$d 3"Fizz"++d 5"Buzz"

ใกล้กับhenkma's 81 bytesแต่ยังไม่ค่อยมี

d = drop.(*4).mod nเป็นกุญแจสำคัญที่นี่: ถูกd 3 "Fizz" drop (n`mod`3 * 4) "Fizz"นี่คือ"Fizz"เมื่อn `mod` 3เป็น 0 และ""มิฉะนั้น


ปรับปรุงใหม่พร้อมสนามกอล์ฟมันลงไป 82 (%)=drop.(*4).mod n;main=mapM putStrLn[max(show n)$3%"Fizz"++5%"Buzz"|n<-[0..100]]ผมคิดว่า:
CR Drost

รอสักครู่แล้วnไม่ได้อยู่ในขอบเขต ฮึ่ม
CR Drost

ใช่ว่าไม่ทำงาน แต่ฉันตีทางออกที่ 85 ไบต์ทางเลือกที่มีลักษณะมากเช่นมันmain=mapM putStrLn[max(show n)$3%"Fizz"++5%"Buzz"|n<-[0..100],(%)<-[drop.(*4).mod n]]
ลินน์

ทำไมไม่ใช้ตัวแบ่งบรรทัด? มันสั้นพอ ๆ กับเซมิโคลอน แต่อ่านไม่ได้น้อยกว่า
dfeuer

1
ผมขอแนะนำให้คุณพิจารณาการแสวงหาของรหัสที่อ่านได้บนเว็บไซต์กอล์ฟรหัส :)
ลินน์

11

PHP, 54 ไบต์

<?for(;$i++<100;)echo[Fizz][$i%3].[Buzz][$i%5]?:$i,~õ;

ใช้ได้สำหรับ v5.5 เป็นต้นไป õเป็นตัวละคร 245 \nบิตคว่ำ

ฉันถือว่าการตั้งค่าล่ามเริ่มต้นเนื่องจากไม่มีการ ini ใด ๆ หากคุณไม่แน่ใจคุณอาจปิดการใช้งานในท้องถิ่น INI ของคุณด้วยเช่นเดียวกับใน-nphp -n fizzbuzz.php

เวอร์ชันที่จะทำงานโดยไม่มีข้อผิดพลาดพร้อมไฟล์กำหนดค่าใด ๆ คือ62 ไบต์ :

<?php
for(;$i++<100;)echo@([Fizz][$i%3].[Buzz][$i%5]?:$i),"
";

ตัวดำเนินการ STFU @ ไม่จำเป็นต้องหมายความว่ารหัสปราศจากข้อผิดพลาด
sitilge


@Kzqai ideone.com/0zRA9e short_open_tagปิดใช้งานE_NOTICEอยู่ ทั้งสองอย่างนี้เป็นการตั้งค่าเริ่มต้น
โม่

ฉันได้รับข้อผิดพลาดมากมายใน 3v4l.org
coder

@acoder โพสต์เมตาที่เกี่ยวข้อง 3v4l.org ดูเหมือนว่ามีประโยชน์
primo

11

รหัสเครื่อง 80386 + DOS, 75 ไบต์

Hexdump ของรหัส:

0D 0A 24 B1 64 33 C0 BA-03 05 BB 00 01 40 50 FE
CE 75 0C 83 EB 04 66 C7-07 42 75 7A 7A B6 05 FE
CA 75 0C 83 EB 04 66 C7-07 46 69 7A 7A B2 03 84
FF 74 0C D4 0A 04 30 4B-88 07 C1 E8 08 75 F4 52
8B D3 B4 09 CD 21 5A 58-E2 C0 C3

ซอร์สโค้ด (ไวยากรณ์ TASM):

    .MODEL TINY

    .CODE
    .386
    org 100h

MAIN PROC
    db 13, 10, '$'
    mov cl, 100
    xor ax, ax
    mov dx, 503h

main_loop:
    mov bx, 100h
    inc ax
    push ax

    dec dh
    jnz short buzz_done
    sub bx, 4
    mov dword ptr [bx], 'zzuB'
    mov dh, 5
buzz_done:

    dec dl
    jnz short fizz_done
    sub bx, 4
    mov dword ptr [bx], 'zziF'
    mov dl, 3
fizz_done:

    test bh, bh
    jz short num_done

decimal_loop:
    aam;
    add al, '0'
    dec bx
    mov [bx], al
    shr ax, 8
    jnz decimal_loop

num_done:
    push dx
    mov dx, bx;
    mov ah, 9
    int 21h
    pop dx
    pop ax

    loop main_loop
    ret

MAIN ENDP
    END MAIN

รหัสนี้นับจาก 1 ถึง 100 ในการaxสร้างข้อความที่ส่งออกจากปลายถึงจุดเริ่มต้น จุดสิ้นสุดของข้อความ (ขึ้นบรรทัดใหม่และ$อักขระที่ DOS ใช้สำหรับการสิ้นสุดข้อความ) จะปรากฏที่ส่วนต้นของรหัส:

db 10, 10, '$'

มันดำเนินการตามคำสั่งที่ไม่เป็นอันตราย ( or ax, 240ah) ฉันสามารถวางไว้ในสถานที่ทั่วไปมากขึ้นเช่นหลังจากสิ้นสุดรหัส แต่การใช้ที่อยู่ 0x100 มีประโยชน์

รหัสนี้ใช้ตัวนับเพิ่มเติมอีก 2 ตัว:

  • นับจาก 3 ถึง 0 ใน dl
  • นับจาก 5 ถึง 0 ใน dh

เมื่อตัวนับถึง 0 มันจะส่งสตริงFizzหรือBuzzไปยังจุดสิ้นสุดของข้อความเอาต์พุต หากสิ่งนี้เกิดขึ้นbxจะลดลงและbhจะเป็นศูนย์ ใช้เป็นเงื่อนไขในการแสดงผลตัวเลขในรูปแบบทศนิยม

หมายเหตุ: ฉันกำลังใช้ข้อมูล 32 บิตที่นี่ สิ่งนี้จะไม่สามารถใช้ได้กับคอมพิวเตอร์ยุคก่อน 386


TASM จริง ๆ แล้วจัดการอักขระที่มีหลายไบต์ในค่าที่ตรงกันข้ามจาก NASMหรือไม่? ใน NASM คุณเขียนmov [mem], 'Fizz'เพื่อจัดเก็บFizzตามลำดับในหน่วยความจำจับคู่dbคำสั่ง ดูของฉัน overcomplicated "ที่มีประสิทธิภาพ" YASM FizzBuzz ตัวอย่างเช่น
Peter Cordes

1
มันบันทึกไบต์ใด ๆ ที่จะใช้stdแล้วstosb/ stosd? คุณจะต้องแทนที่test bh,bhด้วยcmp di, 100hหรืออะไรบางอย่าง แทนที่จะบันทึก / เรียกคืนตัวนับใน AL คุณสามารถเก็บไว้ใน BL และเพียงปิดบัง eax เมื่อใดก็ตามที่คุณต้องการ เช่นsub bx, 4/ mov dword ptr [bx], 'zzuB'คือ 3 + 7 ไบต์ใช่ไหม mov eax, 'zzuB' / stosdคือ 6 + 2 ไบต์ (คำนำหน้าขนาดตัวถูกดำเนินการในทั้งสอง) มันจะดีถ้าคำตอบรวมถึงการถอดชิ้นส่วนเพื่อให้ขนาดการเรียนการสอนสามารถมองเห็นได้
Peter Cordes

1
นี่คือคำตอบที่ดี - ใช้คำสั่งที่ไม่สุภาพสำหรับข้อมูลและใช้พื้นที่หน่วยความจำ PSP ที่ไม่เคยใช้ @PeterCordes ฉันเล่นด้วยคำแนะนำของคุณโดยใช้stosdแต่ไม่สามารถลดคะแนนใด ๆ ได้ด้วยตัวเอง เนื่องจากการstosdลดลงDIหลังจากนั้นคุณจะไม่สูญเสียsub di, 4และคุณจะได้DI4 ไบต์ในตอนท้าย ฉันสามารถ-6 bytesใช้การปรับแต่งเล็กน้อยอื่น ๆ ซึ่งฉันสิ้นสุดการโพสต์เป็นคำตอบที่แยกต่างหาก (เพราะฉันอาจไม่พอดีกับความคิดเห็นทั้งหมด) รุ่งโรจน์!
640KB

11

กระแสตรง, 64 62 ไบต์

[[Fizz]P]sI[[Buzz]P]sU[dn]sNz[zdd3%d0=Ir5%d0=U*0<NAPz9B>L]dsLx

Ungolfed:

[[Fizz]P]sI  # macro I: print "Fizz"
[[Buzz]P]sU  # macro U: print "Buzz"
[dn]sN       # macro N: print current stack depth

z            # increase stack depth

[            # Begin macro
  zdd           # Get current stack depth and ducplicate it twice
  3%d0=I        # Check modulo 3 and leave a duplicate. If it's 0, run macro I
  r             # Rotate top two elements, bringing up the stack depth again
  5%d0=U        # Check modulo 5 and leave a duplicate. It it's 0, run macro U
  *             # Multiply the duplicates of modulos of 3 and 5 ...
  0<N           # ... if it's not 0, run macro N
  AP            # Print a newline (`A` is 10)
                # The macro leaves the stack with one more element each time
  z9B>L      # Run macro L if stack depth is less than "ninety eleven" (101)
]         # End macro

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