สร้างคอมไพเลอร์ FizzBuzz


17

ยินดีต้อนรับสู่โลกของคอมไพเลอร์กอล์ฟ งานของคุณคือการเขียนโปรแกรมที่สร้างโปรแกรมอื่นเพื่อเล่นตัวแปรของ FizzBuzz บนสเปค

คอมไพเลอร์ของคุณ

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

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

พฤติกรรมไม่ได้ถูกกำหนดไว้สำหรับอินพุตที่ไม่เป็นไปตามกฎข้างต้น

โปรแกรม FizzBuzz ที่คุณสร้างขึ้น

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

  • โปรแกรมที่สร้างขึ้นต้องเป็นภาษาเดียวกันกับคอมไพเลอร์
  • อินพุตnอาจอยู่ในรูปแบบใดก็ได้ที่สะดวกกับภาษาของคุณ
  • nจะมีค่าอย่างน้อยหนึ่งค่า
  • จำนวนที่เป็นจำนวนเต็มอย่างน้อยหนึ่งในจำนวนเต็มเข้ากับคอมไพเลอร์จะต้องถูกแทนที่ด้วยสตริงทั้งหมดที่จับคู่กับจำนวนเต็มเหล่านั้นรวมเข้าด้วยกัน
  • จำนวนที่จะไม่ถูกแทนที่ด้วยสตริง FizzBuzz จะต้องส่งออกใน ASCII ทศนิยม

ตัวอย่างเช่น;

> GenFizzBuzz 3:Fizz 5:Buzz
> a.out 5
1
2
Fizz
4
Buzz

เกณฑ์การให้คะแนน

ผลงานของคุณจะได้รับคะแนนตามความยาวของโปรแกรมที่คอมไพเลอร์ของคุณสร้างขึ้นตามความยาวของคอมไพเลอร์ของคุณ รันคอมไพเลอร์ของคุณหลาย ๆ ครั้งด้วยพารามิเตอร์ต่อไปนี้และเพิ่มความยาวของโปรแกรมที่สร้างขึ้นพร้อมกับความยาวของคอมไพเลอร์เพื่อค้นหาคะแนนของคุณ

  1. เพียงแค่นับ (ไม่มีอินพุต - โปรแกรมที่สร้างขึ้นจะนับ 1 ถึงnโดยไม่ต้องเปลี่ยนใหม่)
  2. แค่กอล์ฟ (1: กอล์ฟ - โปรแกรมที่สร้างขึ้นจะส่งออก "กอล์ฟ" nครั้ง)
  3. คลาสสิก FizzBuzz (3: Fizz, 5: Buzz)

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


ไม่มีการให้คะแนนตามความยาวของคอมไพเลอร์
Sparr

เราจะสมมติว่าจำนวนเต็มเป็นหลักเดียวได้หรือไม่ ว่าไม่มีช่องว่างในสตริง?
Sparr

@ Sparr จะว่า (จำนวนเต็มสองหลัก) สร้างความแตกต่าง? โปรดจำไว้ว่ามันเป็นรหัสเท่านั้นที่สร้างขึ้นที่ทำให้คะแนนของคุณ
billpg

ดี fizzbuzz เป็นปัญหา golfed อย่างละเอียดแล้วที่อื่นในอินเทอร์เน็ต ฉันไม่รู้ว่าฉันจะลืมอ่านคำตอบได้ไหมถ้าฉันพยายาม
Sparr

1
ในที่สุดความท้าทายกอล์ฟที่เหมาะสมจริง ๆ เขียนใน AWK
shadowtalker

คำตอบ:


8

Python 3 - 168 162 + 230 = 392

โอ้หลามคุณพยายามอย่างหนัก แต่คูณimport sys;sys.argvด้วย 4 เจ็บจริงๆ!

import sys;a=eval(sys.argv[1])
print("import sys\nfor i in range(1,int(sys.argv[1])+1):print("+"+".join('"%s"*(i%%%d==0)'%t for t in a)+(a and"or str(i))"or"i)"))

โปรแกรมเอาท์พุท:

import sys
for i in range(1,int(sys.argv[1])+1):print(i)
import sys
for i in range(1,int(sys.argv[1])+1):print("Golf"*(i%1==0)or str(i))
import sys
for i in range(1,int(sys.argv[1])+1):print("Fizz"*(i%3==0)+"Buzz"*(i%5==0)or str(i))
  • อินพุตที่คาดหวังสำหรับโปรแกรมหลักคือลำดับของ Tuple แบบ Python ที่สามารถประเมินได้หรือ'()'สำหรับอินพุตไม่มี (คุณไม่พูดว่า "สะดวก".) การป้อนข้อมูลตัวอย่าง: '()', '("Golf",1),', '("Fizz",3),("Buzz",5)'หมายเหตุ quoting เปลือกและต่อท้ายด้วยเครื่องหมายจุลภาคหนึ่งการป้อนข้อมูล

  • แก้ไขข้อผิดพลาด 01:00 โดยเปลี่ยนจาก dict (การสั่งซื้อที่ไม่ได้กำหนด!) เป็น tuples

  • การป้อนข้อมูลที่คาดหวังสำหรับโปรแกรมอื่นเป็นเพียงตัวเลข


ในอาร์กิวเมนต์บรรทัดคำสั่งตัวอย่างของคุณฉันต้องใส่เครื่องหมายอัญประกาศคู่และใช้เครื่องหมายคำพูดเดี่ยวสำหรับ 'Fizz' และ 'Buzz' - เช่นนี้ `" {3: 'Fizz', 5: 'Buzz'} "อย่างไรก็ตามโปรแกรมยังคงอยู่ โยนข้อผิดพลาดสำหรับฉัน
James Williams

ข้อผิดพลาดคืออะไร?
Jason S

@ JasonS - สวัสดี ฉันสนใจประสบการณ์ของคุณสำหรับความท้าทายนี้ meta.codegolf.stackexchange.com/questions/5050/…
billpg

6

perl6 376 340 84 + 115 = 199

UPDATE: เปลี่ยนจาก Perl5 เพื่อ Perl6 ที่จะได้รับโดยไม่ต้องsayuse feature

UPDATE: สามกรณีทดสอบแทนที่จะเป็นห้ากรณี

มีวิธีแก้ปัญหากอล์ฟหลายร้อยแบบให้กับ FizzBuzz และการแข่งขันมากมายจบลงด้วยผลลัพธ์เดียวกันดังนั้นนั่นจึงเป็นสิ่งที่ฉันเริ่มต้น คอมไพเลอร์ของฉันเพิ่งสร้างโซลูชันที่กำหนดเอง อักขระพิเศษสองสามตัวถูกแทรกลงในบัญชีสำหรับรูปแบบ "เพิ่งนับ"

คอมไพเลอร์คาดว่าจะมีข้อโต้แย้งดังนี้: "Fizz 3" "Buzz 5"

print'say(('.(join'.',map{'('.(join')[$_%',split).']'}@ARGV).')||$_)for 1..$ARGV[0]'

โปรแกรมที่คอมไพล์แล้วคาดว่าจะมีอาร์กิวเมนต์ดังนี้: 100

say(()||$_)for 1..$ARGV[0]
say(((Golf)[$_%1])||$_)for 1..$ARGV[0]
say(((Fizz)[$_%3].(Buzz)[$_%5])||$_)for 1..$ARGV[0]

โปรแกรมที่คอมไพล์สำหรับกรณีทดสอบเก่า:

say(((Twoo)[$_%2].(Four)[$_%4].(Eiht)[$_%8])||$_)for 1..$ARGV[0]
say(((Twoo)[$_%2].(Thre)[$_%3].(Five)[$_%5].(Sevn)[$_%7])||$_)for 1..$ARGV[0]

ฉันเปลี่ยนกฎตามที่กล่าวไว้ในความคิดเห็นของคำถาม คุณจะต้องคำนวณคะแนนของคุณใหม่
billpg

@billpg ทำและปรับปรุงให้ดีขึ้น :)
SPARR

สวัสดี. ฉันสนใจประสบการณ์ของคุณสำหรับความท้าทายนี้ meta.codegolf.stackexchange.com/questions/5050/…
billpg

3

Pyth - 51 + (38 + 43 + 50) = 182 ไบต์

อาจตีกอล์ฟคอมไพเลอร์ไม่กี่ไบต์ ลิงก์ในลิงก์ทั้งหมดนั้นเป็นลิงก์ไปยังล่ามออนไลน์

คอมไพเลอร์ - 51 ไบต์

%"K[%s)=dc\"%s\"dFGr1hQJkFNKI!%%GN~J@dxKN))?JJG",zw

เพียงแค่การจัดรูปแบบสตริงด้วย tuple อินพุต ใช้อินพุตเหมือน:

3 5
Fizz Buzz

ไม่มีอะไร - 38 ไบต์

K[)=dc""dFGr1hQJkFNKI!%GN~J@dxKN))?JJG

แค่กอล์ฟ - 43 ไบต์

K[1)=dc"Golf"dFGr1hQJkFNKI!%GN~J@dxKN))?JJG

Classic Fizz Buzz - 50 ไบต์

K[3 5)=dc"Fizz Buzz"dFGr1hQJkFNKI!%GN~J@dxKN))?JJG

2

C ++ 11 ~ 486 + (234 + 244 + 255) = 1219

การมีส่วนร่วมครั้งแรกที่นี่ความท้าทายนี้ไม่ได้เป็นหนึ่งในสิ่งที่ยากที่สุดดังนั้นฉันคิดว่าฉันจะลอง แม้ว่าการใช้ C ++ และแม้จะมีการเพิ่ม C ++ 11 มันยังคงเป็นภาษาที่สวยงาม แต่ฉันแน่ใจว่ามีพื้นที่สำหรับการปรับปรุง

คอมไพเลอร์ (486):

#include<sstream>
#include<iostream>
using namespace std;main(int c,char**v){stringstream t;int i;string s,o;o="#include <iostream>\n#include <map>\nusing namespace std;main(int c,char**v){int i,n=stoi(v[1]);map<int,string> f{";int z=2;for(int j=1;j<c;++j){t.str(v[j]);t.clear();t >> i; t >> s;o+="{"+to_string(i)+",\""+s+"\"}"+(z++==c?"":",");}o+= R"(};bool p;for(i=1;i<n;++i){p=true;for(auto e:f){if(i%e.first==0){cout<<e.second;p=false;}}cout<<(p?to_string(i):"")+"\n";}})";cout<<o;}

มันถือว่าข้อโต้แย้งในรูปแบบของ 3Fizz 5Buzzฯลฯ

นับ (234):

#include <iostream>
#include <map>
using namespace std;main(int c,char**v){int i,n=stoi(v[1]);map<int,string> f{};bool p;for(i=1;i<n;++i){p=true;for(auto e:f){if(i%e.first==0){cout<<e.second;p=false;}}cout<<(p?to_string(i):"")+"\n";}}

กอล์ฟ (244):

#include <iostream>
#include <map>
using namespace std;main(int c,char**v){int i,n=stoi(v[1]);map<int,string> f{{1,"Golf"}};bool p;for(i=1;i<n;++i){p=true;for(auto e:f){if(i%e.first==0){cout<<e.second;p=false;}}cout<<(p?to_string(i):"")+"\n";}}

FizzBuzz (255):

#include <iostream>
#include <map>
using namespace std;main(int c,char**v){int i,n=stoi(v[1]);map<int,string> f{{3,"Fizz"},{5,"Buzz"}};bool p;for(i=1;i<n;++i){p=true;for(auto e:f){if(i%e.first==0){cout<<e.second;p=false;}}cout<<(p?to_string(i):"")+"\n";}}

ข้อมูลเพิ่มเติม

ทดสอบกับ GCC 4.8.1 ไม่มีการโกงคอมไพเลอร์

นี่เป็น makefile ขนาดเล็กเพื่อสร้างการทดสอบและเรียกใช้ (ใช้make run):

run:
    g++ main.cpp --std=c++11 -o fbc

    ./fbc > count.cpp
    g++ count.cpp --std=c++11
    echo "======= Count ========"
    ./a.out 15

    ./fbc 1Golf > golf.cpp
    g++ golf.cpp --std=c++11
    echo "======= Golf ========"
    ./a.out 15

    ./fbc 3Fizz 5Buzz > fizzbuzz.cpp
    g++ fizzbuzz.cpp --std=c++11
    echo "======= FizzBuzz ========"
    ./a.out 15

สวัสดี. ฉันสนใจประสบการณ์ของคุณสำหรับความท้าทายนี้ meta.codegolf.stackexchange.com/questions/5050/…
billpg

map<int,string> fmap<int,string>fอาจจะเป็น คุณสามารถเริ่มต้นในเวลาเดียวกันด้วยj=1 z
Yytsi

2

Ruby 99 + (86 + 94 + 103) = 382

puts"(1..ARGV[0].to_i).each{|i|x=[];#{ARGV[0]}.each{|k,v|x<<v if i%k==0};puts x.size>0?x.join():i}"

การใช้งาน:

wc -c main.rb # 99 chars
ruby main.rb "{}" | ruby - 100 # 1..2..3..
ruby main.rb "{}" | wc -c # 86 chars
ruby main.rb "{1=>:Golf}" | ruby - 100 # Golf..Golf..Golf..
ruby main.rb "{1=>:Golf}" | wc -c # 94 chars
ruby main.rb "{3=>:Fizz,5=>:Buzz}" | ruby - 100 # 1..2..Fizz..4..Buzz..
ruby main.rb "{3=>:Fizz,5=>:Buzz}" | wc -c # 103 chars

2

Stax , 23 + 5 + 17 + 29 = 74

╥╟.└ç╘SJ∞CF╔v=▌╝Σ@∞ìé«g

เรียกใช้และแก้ไขข้อบกพร่อง

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

คอมไพเลอร์เองมีความยาว23 ไบต์

ASCII ที่เทียบเท่าคือ:

{H34|S_h"_`c%z`n?+"m"mz`cc_?

อินพุตที่ป้อนให้[]สร้างสิ่งนี้ (5 ไบต์)

mzc_?

เรียกใช้และแก้ไขข้อบกพร่อง

อินพุตที่ป้อนให้[[1,"Golf"]]สร้างสิ่งนี้ (17 ไบต์)

mz_1%z"Golf"?+c_?

เรียกใช้และแก้ไขข้อบกพร่อง

อินพุตที่ป้อนให้[[3,"Fizz"],[5,"Buzz"]]สร้างสิ่งนี้ (29 ไบต์)

mz_3%z"Fizz"?+_5%z"Buzz"?+c_?

เรียกใช้และแก้ไขข้อบกพร่อง


1

เสียงกระเพื่อมสามัญ 636 577

(ql:quickload'cl-ppcre)(lambda(z)(princ(subseq(ppcre:regex-replace-all" *([(')]) *"(with-output-to-string(@)(print`(lambda(n)(dotimes(i n)(loop for(m s)in ',z if(=(mod(1+ i)m)0)do(princ s))(do()((fresh-line))(princ (1+ i)))))@))"\\1")1)))

ฉันตอบคำตอบอื่น ๆแล้วห่อเป็น quasiquote ขณะที่เพิ่มพารามิเตอร์อินพุต ฉันพิมพ์แบบฟอร์มผลลัพธ์เป็นบรรทัดเดียวและลบอักขระช่องว่างที่ไม่จำเป็นออก คอมไพเลอร์จะยาวกว่าเวอร์ชั่นก่อนหน้าเล็กน้อย แต่คะแนนที่ได้จะลดลง

คะแนน

(let ((*standard-output* (make-broadcast-stream)))
  (loop
     for form in '(215                      ; Compiler
                   ()                       ; Count
                   ((1 "Golf"))             ; Golf
                   ((3 "Fizz")(5 "Buzz")))  ; FizzBuzz
     for length = (if (numberp form) form
                      (length (funcall *fun* form)))
     collect length into lengths
     sum length into sum
     finally (return (values sum lengths))))

ค่าที่ส่งคืน:

574
(215 111 119 129)

น่ารัก

(defun fizz-buzz-compiler (z)
  (princ (subseq
          (cl-ppcre:regex-replace-all
           " *([(')]) *"
           (with-output-to-string (stream)
             (print
              `(lambda (n)
                 (dotimes(i n)
                   (loop for (m s) in ',z
                      if (=(mod(1+ i)m)0)
                      do (princ s))
                   (do () ((fresh-line))
                     (princ (1+ i))))) stream))
             "\\1") 1)))

รูปแบบอินพุตเป็นรายการของ(number string)คู่รัก ตัวอย่างเช่น:

(fizz-buzz-compiler '((3 "Fizz")(5 "Buzz")))

... พิมพ์ไปยังเอาต์พุตมาตรฐาน:

(LAMBDA(N)(DOTIMES(I N)(LOOP FOR(M S)IN'((3 "Fizz")(5 "Buzz"))IF(=(MOD(1+ I)M)0)DO(PRINC S))(DO NIL((FRESH-LINE))(PRINC(1+ I)))))

... ซึ่งพิมพ์สวยคือ:

(lambda (n)
  (dotimes (i n)
    (loop for (m s) in '((3 "Fizz") (5 "Buzz"))
          if (= (mod (1+ i) m) 0)
          do (princ s))
    (do () ((fresh-line)) (princ (1+ i)))))

การทดสอบฟังก์ชั่นผลลัพธ์:

CL-USER> ((lambda (n)
  (dotimes (i n)
    (loop for (m s) in '((3 "Fizz") (5 "Buzz"))
          if (= (mod (1+ i) m) 0)
          do (princ s))
    (do () ((fresh-line)) (princ (1+ i))))) 20)
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz


1

เยลลี่ , 88 84 83 73 ไบต์

คำตอบที่สั้นที่สุด (เต้น"คำตอบที่สั้นที่สุด" ก่อนหน้านี้ 1 ไบต์)

คอมไพเลอร์:

Ṿ€“ḍ@€“ẋ"ЀF€ȯ"”jµFF?⁾RY

ลองออนไลน์! (คอมไพเลอร์)

ลองออนไลน์! (ยืนยัน bytecount)


สถิติ:

19 24 คอมไพเลอร์
   20 กอล์ฟ
  นับ17 2
   27 fizzbuzz
83 73 รวม

ยินดีที่ได้เห็นความพ่ายแพ้
Weijun Zhou

0

C, 1080 ไบต์ทั้งหมด

คอมไพเลอร์ [369 ไบต์]

#include<stdlib.h>
r,t,f=3,b=5,n;char*F="FIzz",*B="buZZ";main(int c,char **v){if(f)for(c=atoi(v[1]),n=1;c>=n;)r=f?n%f:0,r?(t=b?n%b:0)?printf("%i\n",n):puts(B):r?printf("%s%s\n",F,B):puts(F),++n;else for(c=0;c<atoi(v[1]);)printf("%i\n",++c);}

Fizz Buzz [241]

#include<stdlib.h>
r,t,f=3,b=5,n;char*F="FIzz",*B="buZZ";main(int c,char **v){if(f)for(c=atoi(v[1]),n=1;c>=n;)r=f?n%f:0,r?(t=b?n%b:0)?printf("%i\n",n):puts(B):r?printf("%s%s\n",F,B):puts(F),++n;else for(c=0;c<atoi(v[1]);)printf("%i\n",++c);}

กอล์ฟ [237]

#include<stdlib.h>
r,t,f=1,b=0,n;char*F="golf",*B="";main(int c,char **v){if(f)for(c=atoi(v[1]),n=1;c>=n;)r=f?n%f:0,r?(t=b?n%b:0)?printf("%i\n",n):puts(B):r?printf("%s%s\n",F,B):puts(F),++n;else for(c=0;c<atoi(v[1]);)printf("%i\n",++c);}

นับ [233 ไบต์]

#include<stdlib.h>
r,t,f=0,b=1,n;char*F="",*B="";main(int c,char **v){if(f)for(c=atoi(v[1]),n=1;c>=n;)r=f?n%f:0,r?(t=b?n%b:0)?printf("%i\n",n):puts(B):r?printf("%s%s\n",F,B):puts(F),++n;else for(c=0;c<atoi(v[1]);)printf("%i\n",++c);}

0

dc , 434 ไบต์

[:a]sa[91Pn93Pznlanps_znlanz0<R]sR[[[lj1-;aP1sb]sB0sj[dljd2+sj;a%0=Bljlz>F]sF[p2Q]sP]P]sI[[[]sF[pq]sP]nq]sN[z0=Nzn[sz]PlRxlIx]x[sn0dsb[1+0sjlFx[lb0=PAP]x0sbdln>M]dsMx]P

ลองออนไลน์!

อินพุตสำหรับคอมไพเลอร์ (168 ไบต์) ควรอยู่ในสแต็กเป็นจำนวนเต็ม, สตริง, จำนวนเต็ม, สตริงและอื่น ๆ ( 3 [Fizz] 5 [Buzz]) ควรได้รับตามลำดับที่ต้องการให้พิมพ์และ buzzes ของพวกเขาซึ่งอาจเป็นบิตของการโกง (มีการดำเนินการเรียงลำดับฟองdcก่อนหน้านี้ฉันเชื่อว่ามันจะมีค่าฉันประมาณ 100 ไบต์) แต่ก็ช่วยให้ผู้ใช้ พูดยังคงมี 'Fizz' ทำงานใน 3 และ 'Buzz' ทำงานใน 5 แต่ให้ 15 BuzzFizz

ฉันแน่ใจว่านี่สามารถเล่นกอล์ฟได้มากกว่านี้; มาโครหลักในโปรแกรมสุดท้าย ( M) ใช้สองมาโคร ( FและP) ซึ่งไม่จำเป็นเลยหากไม่มีอินพุต ตอนนี้คอมไพเลอร์ตรวจสอบอินพุทและเอาท์พุทของมาโครรุ่นต่าง ๆ (เล็กกว่านี้) หากไม่มี แต่ฉันไม่แน่ใจว่าการตั้งค่าทั้งหมดเหมาะสม

คอมไพเลอร์ตัวเองค่อนข้างตรงไปตรงมาก็แค่ตรวจสอบเพื่อดูว่ามี 'กฎ' ในสแต็กและถ้าเป็นเช่นนั้นมันพิมพ์รหัสที่เก็บความลึกสแต็กในzเก็บสแต็คในอาร์เรย์ 0 ดัชนีaแล้วพิมพ์ทั่วไป รหัส FizzBuzz หากไม่มีอะไรในสแต็คมันแค่พิมพ์รหัส FizzBuzz ที่แก้ไขแล้ว กรณีทดสอบ:

ไม่มีอินพุต (46 ไบต์):

[]sF[pq]sPsn0dsb[1+0sjlFx[lb0=PAP]x0sbdln>M]dsMx

3 [Fizz] 5 [Buzz] (117 ไบต์):

4sz[Buzz]3:a5
2:a[Fizz]1:a3
0:a[lj1-;aP1sb]sB0sj[dljd2+sj;a%0=Bljlz>F]sF[p2Q]sPsn0dsb[1+0sjlFx[lb0=PAP]x0sbdln>M]dsMx

1 [กอล์ฟ] (103 ไบต์):

2sz[Golf]1:a1
0:a[lj1-;aP1sb]sB0sj[dljd2+sj;a%0=Bljlz>F]sF[p2Q]sPsn0dsb[1+0sjlFx[lb0=PAP]x0sbdln>M]dsMx

พวกเขาทุกคนคาดหวังว่าnnค่าในกองนี้ได้รับการจัดเก็บไว้ใน รายการที่มี 'กฎ' วางไว้ในอาร์เรย์aโดยมีสตริงที่ดัชนีแปลก ๆ และจำนวนเต็มที่เลขคู่ แมโครหลักM, เพิ่มค่าสิ่งใดก็ตามบนสแต็กรันแมโครFที่ตรวจสอบค่ากับอาร์เรย์aตรวจสอบว่าFตั้งค่าการลงทะเบียนbเป็นความจริงหรือไม่และพิมพ์ด้านบนของสแต็กถ้าเช่นนั้นหรือขึ้นบรรทัดใหม่หากไม่ตั้งค่าใหม่bเป็นเท็จ ทำงานตัวเองหากnยังไม่ได้เข้าถึง แมโครFตามกฎที่กำหนดจะต้องผ่านอาร์เรย์ทั้งหมดเพื่อค้นหารายการที่ตรงกัน Bมันเพิ่มขึ้นสองตั้งแต่จำนวนเต็มและสตริงของเรามีการทอผ่านแถวและในการแข่งขันที่เรียกว่ามาโคร มาโครBเพียงแค่ดึงสตริง (ตำแหน่งปัจจุบันในอาร์เรย์ที่น้อยกว่าหนึ่ง) แล้วพิมพ์มัน นอกจากนี้ยังกำหนดbให้เป็นจริง คอมไพเลอร์ของเราไม่รำคาญที่จะพิมพ์โดยBไม่มีอินพุตและทำให้Fnop เป็นหลัก


0

กลุ่ม, 122 (คอมไพเลอร์) + 73 (ว่าง) + 90 (กอล์ฟ) + 123 (fizzbuzz) = 392 ไบต์

ผู้รวบรวม

:%s/\v(.*):(.*)/qq\1jA\2<C-V><C-V><C-V><ESC>q=@qgg
VgggJAddGdd:%s/\v[0-9]*([^0-9])/\1
<C-V><ESC>:%@n
:w
:so! %
<ESC>ggii%s/=/<C-V><ESC><C-V><C-A>a/g<C-V><ESC>"ncc:%!seq 0 =
<ESC>

รูปแบบอินพุต

3:Fizz
5:Buzz

สร้างรหัสสำหรับกรณี FizzBuzz

i%s/=/<ESC><C-A>a/g<ESC>"ncc:%!seq 0 =
qq3jAFizz<C-V><ESC>q=@qggqq5jABuzz<C-V><ESC>q=@qggddGdd:%s/\v[0-9]*([^0-9])/\1
<ESC>:%@n
:w
:so! %

สร้างรหัสแล้วหมายเหตุ

# replace the input number with a regex that replaces the placeholder (=) 
# with the real number + 1 (we'll need an extra line as a terminator later)
i%s/=/<ESC><C-A>a/g<ESC>

# pull the substitution command into register c and enter insert mode
"ncc

# create the numbers 0..N+1
:%!seq 0 =

# for each word, scan down k lines at a time and append the word to each
qq3jAFizz<C-V><ESC>q=@qgg
qq5jABuzz<C-V><ESC>q=@qgg

# delete the 0 and N+1 lines
ddGdd

# remove the numbers from any line with words
:%s/\v[0-9]*([^0-9])/\1
<ESC>

# Run the command we created at the beginning, replacing the placeholder 
# with the real number
:%@n

# The file now contains yet another program, with the constants defined.   
# Save and run.
:w
:so! %

# The file now contains a program that, when run on a buffer containing 
# a single line with a number, will produce the appropriate output

<C-V>คือ 0x16 <ESC>คือ 0x1b <C-A>คือ 0x01

ตัวอย่างเซสชัน

$ cat code.txt
2:Foo
4:Bar
$ cat input.txt
8
$ { cat compile.vim; echo ':wq'; } | vim code.txt
# code.txt now contains the generated code
$ { cat code.txt; echo ':wq'; } | vim input.txt
$ cat input.txt
1
Foo
3
FooBar
5
Foo
7
FooBar

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

-2

SlooSarksi. Lang, 179

%%--43^jjk"/][][0[#!#111# h SD G ergDFGdfg[]9--99+==

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