Tạo trình biên dịch FizzBuzz


17

Chào mừng đến với thế giới của trình biên dịch golf. Nhiệm vụ của bạn là viết một chương trình tạo ra một chương trình khác để chơi một biến thể của FizzBuzz trên spec.

Trình biên dịch của bạn

Viết một trình biên dịch tạo các biến thể của chương trình FizzBuzz để spec. Thông số kỹ thuật của biến thể này được thể hiện dưới dạng một mảng các cặp số nguyên / chuỗi.

  • Đầu vào có thể ở bất kỳ dạng nào thuận tiện với ngôn ngữ của bạn. (Ví dụ của tôi sử dụng n: xxxx, nhưng đây chỉ nhằm mục đích minh họa.)
  • Mỗi đầu vào số nguyên chỉ có thể được sử dụng một lần cho mỗi lần gọi trình biên dịch của bạn.
  • Số nguyên của mỗi cặp sẽ có giá trị ít nhất là một.
  • Chuỗi của mỗi cặp sẽ chỉ được tạo bằng chính xác bốn chữ cái ASCII.
  • Đầu ra phải là một chương trình hoàn chỉnh duy nhất tuân thủ các quy tắc dưới đây.
  • Đầu ra có thể ở bất kỳ dạng thuận tiện nào, miễn là nó là một chương trình văn bản. (Vì vậy, không có biểu thức lambda trở lại.)

Hành vi không được xác định cho các đầu vào không tuân thủ các quy tắc trên.

Chương trình FizzBuzz được tạo của bạn

Chương trình được tạo bởi trình biên dịch của bạn sẽ lấy một số nguyên duy nhất, n , làm đầu vào. Nó sẽ xuất ra một chuỗi các số bắt đầu từ một đến và bao gồm n , thay thế các số bằng chuỗi FizzBuzz khi được yêu cầu.

  • Chương trình được tạo phải cùng ngôn ngữ với trình biên dịch.
  • Đầu vào n có thể ở bất kỳ dạng nào thuận tiện với ngôn ngữ của bạn.
  • n sẽ có giá trị ít nhất là một.
  • Một số là bội số của ít nhất một trong các số nguyên đầu vào của trình biên dịch phải được thay thế bằng tất cả các chuỗi được ghép nối với các số nguyên đó được nối với nhau.
  • Một số không được thay thế bằng chuỗi FizzBuzz phải được xuất ra dưới dạng thập phân ASCII.

Ví dụ;

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

Chấm điểm

Mục nhập của bạn sẽ được tính theo độ dài của các chương trình mà trình biên dịch của bạn tạo được thêm vào độ dài của trình biên dịch. Chạy trình biên dịch của bạn nhiều lần với mỗi tham số sau và thêm độ dài của các chương trình được tạo cùng với độ dài của trình biên dịch để tìm điểm của bạn.

  1. Chỉ cần đếm. (Không có đầu vào - Chương trình được tạo sẽ đếm từ 1 đến n mà không cần thay thế.)
  2. Chỉ cần Golf. (1: Golf - Chương trình được tạo sẽ tạo ra "Golf" n lần.)
  3. FizzBuzz cổ điển. (3: Fizz, 5: Buzz)

(Lưu ý rằng trình biên dịch của bạn được yêu cầu để tạo mã cho bất kỳ đầu vào hợp lệ nào, không chỉ những thứ được liệt kê.)


không ghi điểm cho chiều dài của trình biên dịch ??
Sparr

chúng ta có thể giả sử các số nguyên là một chữ số không? rằng không có khoảng trắng trong chuỗi?
Sparr

@Sparr Điều đó (số nguyên hai chữ số) có làm nên sự khác biệt không? Hãy nhớ rằng, chỉ có mã được tạo ra làm cho điểm của bạn.
billpg

tốt, fizzbuzz là một vấn đề đã được chơi golf cực kỳ kỹ lưỡng ở những nơi khác trên internet. Tôi không biết liệu tôi có thể quên đọc giải pháp cho nó hay không nếu tôi đã thử.
Sparr

1
Cuối cùng, một thử thách golf thực sự có ý nghĩa để viết trong AWK.
Shadowtalker

Câu trả lời:


8

Con trăn 3 - 168 162 + 230 = 392

Ôi, Python, bạn đã rất cố gắng, nhưng nhân số import sys;sys.argvthứ lên gấp 4 lần!

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

Chương trình đầu ra:

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))
  • Đầu vào dự kiến ​​cho chương trình chính là một chuỗi các bộ '()'dữ liệu Python có khả năng hoặc không có đầu vào. (Bạn đã nói "thuận tiện".) Ví dụ đầu vào: '()', '("Golf",1),', '("Fizz",3),("Buzz",5)'Note trích dẫn cho vỏ và dấu phẩy cho một đầu vào.

  • Đã sửa lỗi 1 giờ sáng bằng cách thay đổi từ dict (thứ tự không xác định!) Thành tuples.

  • Đầu vào dự kiến ​​cho các chương trình khác chỉ là số


Trong đối số dòng lệnh ví dụ của bạn, tôi đã phải bọc trong dấu ngoặc kép và sử dụng dấu ngoặc đơn cho 'Fizz' và 'Buzz' - giống như vậy `" {3: 'Fizz', 5: 'Buzz'} "tuy nhiên chương trình vẫn còn ném lỗi cho tôi
James Williams

Lỗi là gì?
Jason S

@JasonS - Chào bạn. Tôi quan tâm đến trải nghiệm của bạn về thử thách này. meta.codegolf.stackexchange.com/questions/5050/ từ
billpg

6

perl6 376 340 84 + 115 = 199

CẬP NHẬT: chuyển từ perl5 sang perl6 để có được saymà không có use feature.

CẬP NHẬT: ba trường hợp thử nghiệm thay vì năm

Có hàng trăm giải pháp đã được chơi golf cho FizzBuzz và nhiều cuộc thi kết thúc với cùng một kết quả, vì vậy đó là nơi tôi bắt đầu. Trình biên dịch của tôi chỉ tạo ra một phiên bản tùy chỉnh của giải pháp đó. Một vài ký tự phụ được thêm vào để tính đến biến thể "chỉ cần đếm".

trình biên dịch, mong đợi các đối số như vậy: "Fizz 3" "Buzz 5"

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

chương trình được biên dịch, mong đợi đối số như vậy: 100

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

chương trình biên dịch cho các trường hợp thử nghiệm cũ:

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

Tôi đã thay đổi các quy tắc như được thảo luận trong các bình luận của câu hỏi. Bạn sẽ muốn tính toán lại điểm số của bạn.
billpg

@billpg đã hoàn tất và được cải thiện :)
Sparr

Chào bạn Tôi quan tâm đến trải nghiệm của bạn về thử thách này. meta.codegolf.stackexchange.com/questions/5050/ từ
billpg

3

Pyth - 51 + (38 + 43 + 50) = 182 byte

Có thể golf trình biên dịch một vài byte. Các liên kết trên tất cả chúng là permalinks đến trình thông dịch trực tuyến.

Trình biên dịch - 51 byte

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

Chỉ cần định dạng chuỗi với một bộ dữ liệu đầu vào. Có đầu vào như:

3 5
Fizz Buzz

Không có gì - 38 byte

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

Chỉ cần Golf - 43 byte

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

Buzz Fizz cổ điển - 50 byte

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

2

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

Lần đầu tiên tham gia ở đây, thử thách này không nằm trong số những thử thách khó khăn nhất nên tôi nghĩ tôi sẽ thử. Mặc dù sử dụng C ++ và thậm chí với các bổ sung C ++ 11, đây vẫn là một ngôn ngữ dài dòng, nhưng tôi chắc chắn có chỗ để cải thiện.

Trình biên dịch (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;}

Nó giả định các đối số ở dạng 3Fizz 5Buzzvv

Đếm (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";}}

Golf (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";}}

Thông tin thêm

Đã thử nghiệm với GCC 4.8.1, không có trình biên dịch gian lận.

Đây là một tệp nhỏ để tự động hóa việc tạo các trường hợp thử nghiệm và chạy chúng (sử dụng 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

Chào bạn Tôi quan tâm đến trải nghiệm của bạn về thử thách này. meta.codegolf.stackexchange.com/questions/5050/ từ
billpg

map<int,string> fcó thể map<int,string>f. Bạn có thể khởi tạo j=1cùng một lúc với 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}"

Sử dụng:

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

Chạy và gỡ lỗi nó

Câu trả lời ngắn nhất cho đến nay Không đáng ngạc nhiên bị Jelly đánh bại. Mẫu chuỗi được cung cấp trong Stax thực sự gọn gàng và cung cấp các hàm giống như printf. Các chương trình được tạo bởi trình biên dịch hầu như luôn luôn ngắn nhất là chương trình tốt nhất có thể đạt được bằng cách mã hóa thủ công, mà không cần sử dụng đóng gói.

Trình biên dịch dài 23 byte .

Tương đương ASCII là:

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

Được cung cấp đầu vào [], tạo cái này (5 byte)

mzc_?

Chạy và gỡ lỗi nó

Được cung cấp đầu vào [[1,"Golf"]], tạo cái này (17 byte)

mz_1%z"Golf"?+c_?

Chạy và gỡ lỗi nó

Được cung cấp đầu vào [[3,"Fizz"],[5,"Buzz"]], tạo cái này (29 byte)

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

Chạy và gỡ lỗi nó


1

Lisp thông thường, 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)))

Tôi lấy câu trả lời khác của tôi và gói nó trong các quasiquote trong khi thêm các tham số đầu vào. Tôi in biểu mẫu kết quả dưới dạng một dòng và loại bỏ các ký tự khoảng trắng không cần thiết. Trình biên dịch dài hơn một chút so với phiên bản trước, nhưng điểm số kết quả bị giảm.

Ghi bàn

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

Các giá trị được trả về:

574
(215 111 119 129)

Đẹp

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

Các định dạng đầu vào là một danh sách các (number string)cặp vợ chồng. Ví dụ:

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

... In ra đầu ra tiêu chuẩn:

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

... trong đó, được in đẹp, là:

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

Kiểm tra chức năng kết quả:

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

Thạch , 88 84 83 73 byte

Câu trả lời ngắn nhất cho đến nay (đánh bại "câu trả lời ngắn nhất" trước đó 1 byte)

Trình biên dịch:

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

Hãy thử trực tuyến! (trình biên dịch)

Hãy thử trực tuyến! (xác minh số lượng lớn)


Số liệu thống kê:

19 24 trình biên dịch
   20 sân gôn
17   2 đếm
   27 fizzbuzz
83 73 tổng cộng

Rất vui khi thấy bị đánh.
Weijun Zhou

0

Tổng C, 1080 byte

Trình biên dịch [369 byte]

#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);}

Golf [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);}

Đếm [233 byte]

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

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

Hãy thử trực tuyến!

Đầu vào cho trình biên dịch (168 byte) nên được đặt trên ngăn xếp dưới dạng số nguyên, chuỗi, số nguyên, chuỗi, v.v. ( 3 [Fizz] 5 [Buzz]). Nó nên được đưa ra theo thứ tự người ta muốn fizz và buzz của họ được in, có thể là một chút gian lận (đã thực hiện sắp xếp bong bóng trongdc trước đây, tôi tin rằng nó sẽ tiêu tốn của tôi khoảng 100 byte) nhưng nó cũng cho phép người dùng , giả sử, vẫn có 'Fizz' chạy trên 3 và 'Buzz' chạy trên 5, nhưng có 15 năng suất 'BuzzFizz'.

Tôi chắc chắn rằng điều này có thể được chơi golf nhiều hơn một chút; macro chính trong chương trình cuối cùng ( M) dựa trên hai macro ( FP ) khá không cần thiết do không có đầu vào. Ngay bây giờ trình biên dịch sẽ kiểm tra các phiên bản đầu vào và đầu ra khác nhau (nhỏ hơn nhiều) của các macro này nếu không có, nhưng tôi không chắc toàn bộ thiết lập là tối ưu.

Bản thân trình biên dịch khá đơn giản, nó chỉ kiểm tra xem liệu có 'quy tắc' trên ngăn xếp hay không, và nếu vậy nó sẽ in mã lưu trữ độ sâu ngăn xếp vào z, lưu trữ ngăn xếp trong một mảng 0 chỉ mục a, sau đó in ra tổng quát Mã FizzBuzz. Nếu không có gì trên ngăn xếp, nó thực sự chỉ in một phiên bản sửa đổi của mã FizzBuzz. Các trường hợp thử nghiệm:

Không có đầu vào (46 byte):

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

3 [Fizz] 5 [Buzz] (117 byte):

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 [Golf] (103 byte):

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

Tất cả đều mong đợi giá trị n trên ngăn xếp, điều này sẽ được lưu trữ trong n. Những cái có 'quy tắc' đặt chúng trong mảng a, với các chuỗi ở các chỉ số lẻ và các số nguyên tại evens. Macro chính M, tăng bất cứ thứ gì có trong ngăn xếp, chạy macro Fkiểm tra giá trị theo mảng a, kiểm tra xem Fthiết lập thanh ghi bcó trung thực hay không và in đỉnh ngăn xếp nếu không hoặc đặt dòng mới nếu không, đặt lại bthành sai lệch, sau đó giữ lại tự chạy nếu nchưa đạt được. Macro F, quy tắc nhất định, đi qua toàn bộ mảng tìm kiếm kết quả khớp. Nó tăng lên hai lần vì các số nguyên và chuỗi của chúng tôi được dệt qua mảng và trên một trận đấu, nó gọi là macroB . Vĩ môBchỉ cần lấy chuỗi (vị trí hiện tại trong mảng ít hơn một) và in nó. Nó cũng đặt bthành sự thật. Trình biên dịch của chúng tôi không bận tâm để in Bmà không có đầu vào, và về cơ bản tạo ra Fmột nop.


0

vim, 122 (trình biên dịch) + 73 (trống) + 90 (golf) + 123 (fizzbuzz) = 392 byte

Trình biên dịch

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

định dạng đầu vào

3:Fizz
5:Buzz

Mã được tạo cho trường hợp 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! %

Mã được tạo, chú thích

# 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>là 0x16. <ESC>là 0x1b.<C-A>là 0x01.

Ví dụ phiên

$ 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

Có điều gì đó kỳ lạ xảy ra khi tôi cố gắng xác định và chạy một macro từ bên trong một macro khác. Nếu tôi quản lý để sắp xếp nó ra, tôi có thể lưu một vài byte qua phương pháp lưu và nguồn.
Ray

-2

SlooSarksi .Lang, 179

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

10
Tôi không quen thuộc với ngôn ngữ này; bạn có thể liên kết chúng tôi với một trang mô tả nó?
lirtosiast
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.