Xuất ra một ô chữ có thể chơi được


8

Viết chương trình để tạo một tệp chứa lưới ô chữ mà người dùng có thể in ra và giải câu đố.

Đầu vào

Tên tệp đại diện cho tệp lưới ô chữ và tùy chọn tên tệp thứ hai đại diện cho tệp đánh số ô chữ. Đầu vào phải được chấp nhận bởi một phương tiện thông thường cho môi trường lập trình của bạn: đối số dòng lệnh, đầu vào tiêu chuẩn, biểu mẫu web, v.v.

Bạn có thể cho rằng ô chữ đã được xác thực và nếu sử dụng tệp đánh số tương ứng với lưới được cung cấp .

Định dạng tệp lưới: Dòng đầu tiên bao gồm hai hằng số nguyên được phân tách bằng khoảng trắng M và N. Theo sau dòng đó là các dòng M, mỗi dòng bao gồm N ký tự (cộng với một dòng mới) được chọn từ [#A-Z ]. Các ký tự này được giải thích sao '#' cho chỉ ra một hình vuông bị chặn, ' 'một hình vuông mở trong câu đố không có nội dung đã biết và bất kỳ chữ cái nào có hình vuông mở có chứa chữ cái đó.

Định dạng tệp đánh số Các dòng bắt đầu bằng '#' bị bỏ qua và có thể được sử dụng để nhận xét. Tất cả các dòng khác chứa một tab tách triplet i, m, nnơi iđại diện cho một số được in trên lưới và mnđại diện cho hàng và cột của quảng trường, nơi nó sẽ được in. Số lượng của cả hàng và cột bắt đầu từ 1.

Đầu ra

Đầu ra sẽ là một tập tin mà người dùng có thể in ra và giải ô chữ. ASCII, postcript, pdf, png và bất kỳ định dạng hợp lý nào khác sẽ được chấp nhận, nhưng tất cả đều phải tuân theo các quy tắc sau:

  1. Phải có một quy tắc xung quanh toàn bộ câu đố và giữa mỗi cặp hình vuông.
  2. Các ô vuông bị chặn phải được điền vào tối.
  3. Trong hình vuông chơi đại diện cho sự bắt đầu của một đầu mối được đánh số (ngang hoặc xuống) phải được cung cấp một số ở góc trên, bên trái của hình vuông, trong khi để lại phần lớn ô vuông để chơi để ghi vào. Lưu ý rằng lưới điển hình được công bố trong các bài báo sẽ có nhiều hàng chục manh mối và có thể có hơn 100.

Đầu ra sẽ là của lưới một mình, không có danh sách các đầu mối.

Đầu ra phải được gửi đến đích thông thường (một tệp có tên được lấy từ tên tệp đầu vào, được sản xuất dưới dạng trang web, v.v.)

Trường hợp thử nghiệm

Đưa ra một đầu vào của

5   5
#  ##
#    
  #  
    #
##  #

góc bắt đầu của đầu ra ASCII có thể chấp nhận có thể trông như thế này

+-----+-----+-----+---
|#####|1    |2    |###
|#####|     |     |###
|#####|     |     |###
+-----+-----+-----+---
|#####|3    |     |4  
|#####|     |     |   
|#####|     |     |   
+-----+-----+-----+---
|6    |     |#####|   
|     |     |#####|   

Những người sử dụng các định dạng đồ họa nên lấy cảm hứng từ các nguồn in thông thường.

Sơ đồ đánh số

Một lưới được đánh số chính xác có các thuộc tính sau:

  1. Việc đánh số bắt đầu từ 1.
  2. Không có cột hoặc khoảng của các ô vuông mở không bị đánh số.
  3. Các số sẽ được bắt gặp theo thứ tự đếm bằng cách quét từ hàng trên xuống dưới lấy từng hàng từ trái sang phải.

Qua một bên

Đây là thứ ba của một số thách thức liên quan đến ô chữ. Tôi dự định sử dụng một tập hợp các định dạng tệp nhất quán xuyên suốt và để xây dựng một bộ tiện ích liên quan đến ô chữ đáng kính trong quy trình.

Những thách thức trước trong loạt bài này:


Tôi không thể nhận xét, nhưng đầu ra ví dụ vi phạm sơ đồ đánh số của riêng bạn.
Megan Walker

@Samuel: Nó cũng vậy. Đó là những gì tôi nhận được khi viết nó bằng tay thay vì nhìn lại công việc của chính mình. Cảm ơn. Đã sửa.
dmckee --- ex-moderator mèo con

Câu trả lời:


4

Con trăn, 379 ký tự

import sys
A=sys.argv
f=open(A[1])
V,H=map(int,f.readline().split())
M={}
if A[2:]:
 for r in open(A[2]).readlines():n,y,x=map(int,r.split());M[y*H+y+x]=n
R='+-----'*H+'+'
n,v,s='\n| '
x=y=z=''
p=V+1
for c in n+''.join(f):
 if c==n:print x+n+y+n+z+n+R;x=y=z=''
 elif'@'>c:x+=5*c;y+=5*c;z+=5*c
 else:x+=5*s;y+=s+s+c+s+s;z+=5*s
 if p in M:x=x[:-5]+"%-5d"%M[p]
 x+=v;y+=v;z+=v;p+=1

Hoạt động độc đáo miễn là không có ý kiến ​​trong tập tin đánh số.
dmckee --- ex-moderator mèo con

Bạn có thể sử dụng next(f)thay vì f.readline(). Bạn không cần .readlines()ở đó cả.
gnibbler

10

Bản thảo 905 797 677 675 629 608 330 320 308

{G N}/Times-Roman .3 2 22 1 30/.{<920>dup 1 4 3 roll put cvx 
exec}def/${//. 73 .}def[/R{99<a51f3e7d75>$}/G{<1fab75>$ 
R(uN)${0 R{1(X)$ 0 1 -1 5 4 roll 35 eq{4<1980>$}if<81>$ 
1 add}(I)$(u)$ 0 -1<ad>$}<834d>$}/X{{exit}if}/N{-.9
.7<ad>${<1fab70>$ X}loop{{(>nk)$(  )<31a0>$}<a3>$
X}loop}>><0d38388b369bad8e3f>$

Chương trình này được viết dưới dạng "prolog giao thức", do đó bạn chỉ cần kết hợp nó với các tệp lưới và số (theo thứ tự đó, được phân tách bằng các dòng trống) và chuyển toàn bộ mớ hỗn độn sang ghostscript hoặc Distiller hoặc máy in PS. Được thêm vào phiên bản tham khảo bên dưới là một câu đố NYT (Từ ngày 5 tháng 11 năm 2011) với những con số và một câu trả lời tôi khá chắc chắn (Thứ bảy thật khó!).

Bản sửa đổi mới sử dụng hai quy trình này để thực thi các tên hệ thống được mã hóa nhị phân từ các chuỗi.

/.{
    <920>  % two-byte binary-encoded name template with 0x92 prefix
    dup 1 4 3 roll put  % insert number into string
    cvx exec  % and execute it
}def
/${
    //.   %the /. procedure body defined above
    73 .  %"forall" (by code number)
}def

Ấn định và (phần nào) nhận xét.

/Times-Roman .3 2 22 1 30
/.{<920>dup 1 4 3 roll put cvx exec}def/${//. 73 .}def
[
/R{99<a51f3e7d75>$}    %currentfile 99 string readline pop 
/G{<1fab75>$ %currentfile token pop 
    R (uN)$ %<754e>$ %pop gsave
    {   
        0 R { 
            1 (X)$ %index
            0 1 -1 5 4 roll
            35 eq{ 
                4<1980>$ %copy rectfill
            }if 
            <81>$ %rectstroke
            1 add 
        }(I)$
        (u)$ % 73 . %forall pop 
        0 -1<ad>$ %translate
    }<834d>$ %repeat grestore
}
/X{{exit}if}
/N{
    -.9 .7<ad>$ %translate
    %{ currentfile token not {exit} if } loop
    {<1fab70>$
        X %{exit}if
    }loop
    {   
        %dup type/integertype ne{exit}if
        {
            (>nk)$ %<3e6e6b>$ %exch neg moveto
            (  )<31a0>$ %cvs show
        }<a3>$ %stopped
        X %{exit}if
    }loop
}
>>
<0d38388b369bad8e>$
%begin dup dup scale div setlinewidth translate selectfont
{G N}exec

Hồ sơ dữ liệu.

15 15
     #   #     


       #     ##
##   #   #     
    #     #    
   #    #      
       #       
      #    #   
    #     #    
    K#   #   ##
##  I  #       
    L          
    N          
    S#   #     

#i m n   figure(number), row, col
1 1 1
2 1 2
3 1 3
4 1 4
5 1 5
6 1 7
7 1 8
8 1 9
9 1 11
10 1 12
11 1 13
12 1 14
13 1 15
14 2 1
15 2 6
16 2 10
17 3 1
18 4 1
19 4 9
20 5 3
21 5 7
22 5 8
23 5 11
24 5 14
25 5 15
26 6 1
27 6 2
28 6 6
29 6 10
30 6 12
31 7 1
32 7 5
33 7 10
34 7 11
35 8 1
36 8 4
37 8 9
38 9 1
39 9 8
40 9 13
41 10 1
42 10 6
43 10 7
44 10 12
45 11 1
46 11 5
47 11 7
48 11 11
49 12 3
50 12 6
51 12 9
52 12 10
53 12 14
54 12 15
55 13 1
56 13 2
57 13 8
58 14 1
59 15 1
60 15 7
60 15 11

Nó sẽ trông ổn từ máy in, nhưng trên màn hình, nó cần một chút trợ giúp. Quy trình 19 ký tự này và 9 ký tự để gọi nó trên tất cả các điểm trong không gian người dùng, giúp làm cho các đường kẻ đều nhau trông đều hơn. Vì vậy, 308 + 19 + 9 = 337, được sử dụng để tạo hình ảnh này.

/F{<ac893e893e5f>$} % transform round exch round exch itransform

đầu ra ô chữ

Bản tin 608

Phiên bản cũ hơn này (từ phiên bản 8 ) sử dụng một cách tiếp cận hoàn toàn khác, sử dụng lại mã dòng chính làm "từ vựng" từ đó các mã thông báo dài hơn có thể được lập chỉ mục bằng cách sử dụng chuỗi.

<<-1{{30 700 translate 0 0 moveto
currentfile 2{(@A1*)*}repeat exch string
3 2 roll{('BO1)*{( )(@#)*
4(,.N:;<%)*<<( ){p}/#{(1:;>%)*}0{(;,'.)*
6 -26(CE%)*}>>(IJ'B)* known not{p
0}if(LG #C)*}forall(#;*1 D%)*}repeat
p/Times-Roman 8 selectfont 99
string{('BO)*{(@)* length(#=)*{p}{(@#L)*
35(=)*{p}{cvx(GID ?'H*ID ?KHF%)*(   )cvs(E)*}e}e}{showpage
exit}e}loop exit{( @#M# FMF#M)*
closepath}currentpoint stroke eq fill
mul dup token copy rmoveto sub show
neg exec add 1 index 9 get rlineto
put readline}loop}0 1 index 0 get{1
index 1 add}forall pop/*{{32 sub load
exec}forall}/e{ifelse}/p{pop}>>begin(23,?4)*<1f>*

Nó được viết bằng phiên bản nhận xét này minh họa việc mã hóa từ vựng. Do đó, mã thông báo đầu tiên 30được nhận xét là từ đồng nghĩa với . Không có lợi cho lắm , nhưng đối với các mã thông báo dài hơn thì đây là một chiến thắng lớn (cho đến khi khả năng mã hóa sâu hơn được (được) phát hiện).space( )*3030

<<-1{{
%space  !    "         # $ %      &           '(        )     %*    +      , - .   %/
 30     700  translate 0 0 moveto currentfile 2{(@A1*)*}repeat exch string 3 2 roll
{('BO1)*{( )(@#)* 4(,.N:;<%)*<<( ){p}/#{(1:;>%)*}0{(;,'.)* 6 -26(CE%)*}>>(IJ'B)*
known not{p 0}if(LG #C)*}forall(#;*1 D%)*}
%0      1   2          3 4          5  6     7
 repeat p /Times-Roman 8 selectfont 99 string{('BO)*{(@)* length(#=)*{p}{
(@#L)* 35(=)*{p}{cvx(GID ?'H*ID ?KHF%)*(   )cvs(E)*}e}e}{showpage clear exit}e}
%8    9   :                         %;            <      =    >    ?
 loop exit{( @#M# FMF#M)* closepath} currentpoint stroke eq fill mul
%@   A     B    C       D   E    F   G    H   I J     K L   M       N   O
 dup token copy rmoveto sub show neg exec add 1 index 9 get rlineto put readline
}loop}0 1 index 0 get{1 index 1 add}forall
pop/*{{32 sub load exec}forall}/e{ifelse}/p{pop}>>begin(23,?4)*<1f>*

1
Bạn không cần phải giữ tất cả các phiên bản cũ, bởi vì mọi người có thể truy cập vào lịch sử của bài đăng nếu họ thực sự quan tâm.
Peter Taylor

Hiểu. Tôi sẽ giảm một số chất béo khi tôi cập nhật.
luser droog

Tôi đã đăng một số phiên bản thay thế trong chủ đề này .
luser droog

Cầu nguyện hoạt động như thế nào?
người dùng không biết

1
Có vẻ như chi phí cho PostScript theo kiểu golf vẫn lớn hơn giải pháp "truyền thống" của tôi ;-).
Thomas W.

4

C (đầu ra cho SVG), 553 ký tự

Tôi biết, mã rất lớn, nhưng vấn đề này chỉ là khóc cho câu trả lời SVG.

char*f,b[99];h,w;main(i){fscanf(f=fopen(gets(b),"r"),"%d%d%*[\n]",&h,&w);for(
printf("<svg xmlns='http://www.w3.org/2000/svg' viewBox='.9 .9 %d.2 %d.2'><path d='M1 1",
i=w,h);i--;)printf("v%dv-%dh1",h,h);for(;h--;)printf("v1h-%dh%d",w,w);for(
puts("' style='fill:none;stroke:#000;stroke-width:.04'/><path d='");
fgets(b,99,f);++h)for(i=0;i<w;)b[i++]-35||printf("M%d %dh1v1h-1Z",i,h+2);puts("'/>");
for(f=fopen(gets(b),"r");fgets(b,99,f);)sscanf(b,"%d%d%d",&i,&h,&w)>2&&
printf("<text x='%d.1' y='%d.3' style='font-size:.3px'>%d</text>",w,h,i);puts("</svg>");}

Khi chạy, nó nhận được hai tên tệp trên hai dòng đầu vào tiêu chuẩn riêng biệt; đầu tiên là tệp lưới, sau đó là tệp số.

Logic trong cái này thực sự khá đơn giản. Định dạng của SVG cho phép nó tạo ra tất cả các yếu tố theo bất kỳ thứ tự nào (thay vì đi từ trên xuống dưới như với giải pháp đầu ra ASCII). Kích thước gần như hoàn toàn do nồi hơi SVG.

Nhưng hình ảnh kết quả trông tuyệt vời!

Đã chỉnh sửa để thêm: Đây là phiên bản ngắn hơn (517 ký tự) xuất ra độ phân giải cụ thể. Điều này cho phép mã sử dụng nhiều cài đặt mặc định hơn, nhưng với chi phí cấm (theo ý tôi) rằng SVG không còn tự động thay đổi kích thước trong trình duyệt web của bạn.

char*f,b[99];h,w;main(i){fscanf(f=fopen(gets(b),"r"),"%d%d%*[\n]",&h,&w);for(
printf("<svg xmlns='http://www.w3.org/2000/svg'><path d='M1 1",i=w,h);i--;)
printf("v%d0v-%d0h50",h*5,h*5);for(;h--;)printf("v50h-%d0h%d0",w*5,w*5);for(
puts("' style='fill:none;stroke:#000'/><path d='");fgets(b,99,f);++h)
for(i=-1;++i<w;)b[i]-35||printf("M%d1 %d1h50v50h-50Z",i*5,h*5+5);puts("'/>");
for(f=fopen(gets(b),"r");fgets(b,99,f);)sscanf(b,"%d%d%d",&i,&h,&w)>2&&
printf("<text x='%d3' y='%d5'>%d</text>",w*5-5,h*5-4,i);puts("</svg>");}

SVG trông thật tuyệt!
người dùng không xác định

3

Haskell, 328 ký tự

import System
main=do(g:d)<-mapM(fmap lines.readFile)=<<getArgs;mapM_ putStrLn$g% \i k->[t|x<-d,y@(c:_)<-x,c/='#',(t,q)<-lex y,w q==i,k<1]
(s:g)%n=[q|(i,x)<-e g,q<-b s:[c['|':f#n[i,j]k|(j,f)<-e x]++"|"|k<-[0..2]]]++[b s]
'#'#_="#####";_#n=take 5$c n++"     ";b n='+':([1..w n!!1]>>"-----+")
e=zip[1..];c=concat;w=map read.words

2

C, 375 ký tự

char b[99];g[999],*r=g,*f,i,j,w;main(n){
for(fscanf(f=fopen(gets(b),"r"),"%*d%d%*[\n]",&w);fgets(b,99,f);)
for(i=0;i<w;)*r++=-(b[i++]==35);
for(f=fopen(gets(b),"r");fgets(b,99,f);)
sscanf(b,"%d%d%d",&n,&j,&i)?g[j*w-w+i-1]=n:0;
for(f=g;f<=r;f+=w){for(i=w;i--;)printf(" ----");puts("");
if(f<r)for(j=3;j--;puts("|"))
for(i=0;i<w;printf(~n?n&&j>1?"|%-4d":"|    ":"|////",n))n=f[i++];}}

Hai tên tệp đầu vào được nhập vào đầu vào tiêu chuẩn, mỗi tên trên một dòng riêng biệt. Lưới được hiển thị trong ASCII trên đầu ra tiêu chuẩn. Vâng, đó là một giao diện người dùng tệ hại, nhưng bất cứ điều gì chi phí nhân vật tốt hơn. Tôi đã gọi nó như vậy:

printf "%s\n%s" grid.txt numbering.txt | ./crosswd-render > render.txt

Chương trình nên xử lý chính xác những thứ như các dòng nhận xét trong tệp đánh số.


*r++-=b[i++]==35( gđược khởi tạo thành số không).
ugoren

for(j=3*(f<r);j--;puts("|"))tiết kiệm if.
ugoren

n&&j>1->j/2*n
ugoren

2

Scala 463, định dạng đầu ra: html

object H extends App{val z=readLine.split("[ ]+")map(_.toInt-1)
val d="\t\t<td width='50' height='50'"
println("<html><table border='1'><tr>")
val b=(0 to z(0)).map{r=>readLine}
var c=0
(0 to z(0)).map{
y=>(0 to z(1)).map{
x=>if(b(y)(x)==' '&&((x==0||b(y)(x-1)==35)||(y==0||b(y-1)(x)==35))){
c+=1
println(d+"valign='top'>"+c+"</td>")}
else println(d+{if(b(y)(x)!=' ')"bgcolor='#0'>"else">&nbsp;"}+"</td>")}
println("\t</tr>\n\t<tr>")}
println("</table></html>")
}

Sản lượng mẫu


Rất đẹp. Đầu ra chỉ nhìn tốt .
dmckee --- ex-moderator mèo con

2

PostScript (435) (434)

[/r{currentfile 999 string readline pop}/p{pop}/x{exch}/T{translate}/S{scale}/G{gsave}/R{grestore}/_( )>>begin/Courier 1 selectfont 
20 20 S
.05 setlinewidth{r token
p x p
dup 3 x 3 add
T
G G{R
0 -1 T
G
_ 0
r{0 0 1 1
4 index 35 eq{rectfill p}{rectstroke
put
.3 .1 moveto
_ show}ifelse
1 0 T _ 0}forall}repeat
R R
1 -1 S -.9 -.7 T{{r
dup 0 get 35 ne{( )search
p 3 2 roll
cvx exec
G
x
T
.4 -.4 S
0 0 moveto show
p
R}if}loop}stopped}exec

Un-golfed với dữ liệu:

%!
<<
  /r{currentfile 999 string readline pop}
  /p{pop}
  /x{exch}
  /T{translate}
  /S{scale}
  /G{gsave}
  /R{grestore}
  /_( )
>>begin
/Courier 1 selectfont
% In theory, 20 20 scale isn't needed, 
% but it would make the whole thing very tiny when printed
% (on screen it doesn't matter too much, it can be zoomed)
20 20 S
.05 setlinewidth
{ % exec
% Read number of lines
r token                          % restString numberOfLines true
% Discard rest of line (Contains number of columns.
% It becomes clear implicitly from number of letters in a line of grid definition)
p x p                            % numberOfLines
% Move to where the top line starts
dup 3 x 3 add                    % numberOfLines x y
T                                % numberOfLines
G G
{ %repeat
  R
  % Move to next line
  0 -1 T
  G
  _ 0
  r                              % ( ) 0 line
  { %forall                      % ( ) 0 char
    0 0 1 1                      % ( ) 0 char 0 0 x y
    % Check whether char is a hash
    4 index 35 eq{ %ifelse
      4 copy rectfill
    }if
    rectstroke                   % ( ) 0 char
    put                          % -/-
    .3 .1 moveto
    _ show
    1 0 T
    _ 0                          % ( ) 0
  }forall                        % 
}repeat
R R
% Now, render the numbers according to the numbering definitions
1 -1 S -.9 -.7 T
{{
  r
  %Check whether this is a comment
  dup 0 get 35 ne{               % line
    % Split at the first tab
    %TODO: Ust tab instead of space
    ( )search                    % (y x) tab number true
    p 3 2 roll                   % tab number (y x)
    cvx exec                     % tab number y x
    G
    x                            % tab number x y
    T                            % tab number
    .4 -.4 S
    0 0 moveto show              % tab
    % This pop can be eliminated in theory to save two characters,
    % but the operand stack will continue to grow
    p
    R
  }if
}loop}stopped
}exec
15 15
     #   #     


       #     ##
##   #   #     
    #     #    
   #    #      
       #       
      #    #   
    #     #    
    K#   #   ##
##  I  #       
    L          
    N          
    S#   #     
#i m n   figure(number), row, col
1 1 1
2 1 2
3 1 3
4 1 4
5 1 5
6 1 7
7 1 8
8 1 9
9 1 11
10 1 12
11 1 13
12 1 14
13 1 15
14 2 1
15 2 6
16 2 10
17 3 1
18 4 1
19 4 9
20 5 3
21 5 7
22 5 8
23 5 11
24 5 14
25 5 15
26 6 1
27 6 2
28 6 6
29 6 10
30 6 12
31 7 1
32 7 5
33 7 10
34 7 11
35 8 1
36 8 4
37 8 9
38 9 1
39 9 8
40 9 13
41 10 1
42 10 6
43 10 7
44 10 12
45 11 1
46 11 5
47 11 7
48 11 11
49 12 3
50 12 6
51 12 9
52 12 10
53 12 14
54 12 15
55 13 1
56 13 2
57 13 8
58 14 1
59 15 1
60 15 7
60 15 11

Tuyệt vời. Tôi thực sự cần phải sử dụng tốt hơn stopped. ... Tôi sẽ để tiền thưởng mở trong một ngày hoặc lâu hơn để thu hút sự chú ý.
luser droog

1

Bản thảo, không chiến đấu.

Lấy cảm hứng (một lần nữa) bởi câu hỏi liên quan của bạn về SO , tôi đã tạo một phiên bản tham chiếu trong Postcript bằng tệp IO. Nó cũng tạo ra một phông chữ có chiều rộng cố định để dữ liệu lưới được truyền đến show. là một hộp trống và #là một hộp đầy. Bất kỳ nhân vật ascii nào khác được vẽ dưới dạng glyph Times-Roman nhỏ được bao quanh bởi một hộp.

Chương trình này sử dụng tính năng ghostscript có thể không có trong tất cả các trình thông dịch Postcript. Nếu ghostscript được gọi với --tùy chọn, nó sẽ chuyển các đối số dòng lệnh cho chương trình postcript trong một chuỗi các chuỗi có tên / ARGUMENT. Vì vậy, bạn cần phải gọi chương trình như thế này gs -- xw-io.ps grid-file number-file.

%!

ARGUMENTS{}forall
/numfile exch (r) file def
/gridfile exch (r) file def

/q{0 0 moveto 1 0 lineto 1 1 lineto 0 1 lineto closepath}def
/X<</FontType 3/FontBBox[0 0 1 1]/FontMatrix[1 0 0 1 0 0]
    /Encoding StandardEncoding
    /BuildChar{
        1 0 0 0 1 1 setcachedevice
        .001 setlinewidth
        q stroke
        dup 35 eq { pop
            q fill
        }{
            .3 .1 moveto
            .1 .1 scale
            /Times-Roman 8 selectfont
            (?)dup 0 4 3 roll put show
        }ifelse pop}
>>definefont pop /X 30 selectfont
40 700 moveto {
    gridfile 2{dup token pop exch}repeat pop pop
    {
        gridfile =string readline{
            dup length 0 ne{
                show currentpoint exch pop 30 sub 40 exch moveto
            }{clear exit}ifelse
        }{clear exit}ifelse
    }loop
    /Times-Roman 8 selectfont
    {
        40 700 moveto
        numfile =string readline{
            dup length 0 ne{
                dup 0 get 35 ne{
                    cvx exec
                    1 sub 30 mul 2 add exch
                    1 sub -30 mul 22 add rmoveto
                    (   )cvs show
                }{clear}ifelse
            }{clear}ifelse
        }{clear exit}ifelse
    }loop showpage
}exec

Trông thật tuyệt. Nó lớn như thế nào Tôi đếm 1247 ký tự. Nhưng nó có thể được đánh gôn - phải không? Một bản dịch đơn giản 4 khoảng trống => 1 tab dẫn đến 980 ký tự, loại bỏ tất cả các tab thành 891.
người dùng không biết

Do tất cả các từ đặc biệt cần thiết để tạo phông chữ, từ này không thể được làm nhỏ hơn câu trả lời cho phần tái bút khác của tôi.
luser droog
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.