2011-02-27 6 views
2

은 ASCII 수치를 포함하고, codegolf.SE 같은 방식을 형성한다."File IO in Dummies"가 있습니까? 스택 오버플로에 연주 <a href="/questions/tagged/code-golf" class="post-tag" title="show questions tagged 'code-golf'" rel="tag">code-golf</a>의 대부분

그게 다 좋았지 만, 출력에 약간의 다양성을 주입하고 싶습니다. 내 최근의 질문 Output a playable crossword grid을 명시 적으로 작성하여 그래픽 형식 항목을 장려했습니다.

내가 함께 포스트 스크립트에서 참조 구현을 해킹하려고 시작했는데, 기꺼이 표시합니다. 아아아, 나는 언어에 완전히 익숙하지 않으며 기본 파일 IO를 수행하는 데 문제가 있습니다. 누구든지 주제를 다루는 기본 리소스를 알고 있습니까?

나는

  • file
  • (%stdin)
  • token
  • readstring
  • readline

의 알고하지만 난 꽤 uncl입니다 귀가 지난 3 번의 귀환과 귀사가 귀사를 어떻게 조작했는지에 대한 귀입니다.

나는 여러 반환하는 <value> <boolean> 쌍을 파악하고, 내가 부울을 테스트 if를 사용할 수 있습니다 . 그리고 뭐?

답변

10

좋은 책은 Gleen 리드에 의해 "포스트 스크립트에 생각"입니다. 당신은 자신의 웹 사이트에서 개인적인 용도로 무료로 책을 얻을 수 있었지만 그 책은 다운되었습니다. 여전히 다운로드 할 수 있습니다. http://replay.waybackmachine.org/20090621100720/http://www.rightbrain.com/pages/books.html

14 장은 파일 io를 다루며 샘플 코드를 포함합니다.

+0

내가 waybackmachine 링크를 찾을 수있는 시간을내어 줄 수 있다면 나는 그것을 +2로 만들 것입니다. 감사. – dmckee

+0

흠, 나는 지금이 포스트 스크립트에 2 일간 머물 렀지 만, "포스트 스크립트에서 생각하는"누군가는 미쳐야한다고 생각합니다. 그래도 위대한 참조. –

5

간단한 텍스트 파일 (크로스 워드 퍼즐 레이아웃을 나타내는)을 페이지에 해당 크로스 워드 퍼즐을 그리는 포스트 스크립트 코드로 변환하려는 것처럼 들립니다. PostScript가 Turing-complete라는 사실은 사실이지만이 작업을 위해 프로그래밍 할 수는 있지만 Postscript로 모든 것을 프로그래밍하는 것은 좋은 방법이 아닙니다.

포스트 스크립트는 임의의 데이터를 허비하고 싶지 특히,에 프로그래밍하는 까다로운 언어이다. PostScript 출력을 원할 때 모든 매개 변수를 하드 코딩하여 원하는 것을 그리는 샘플 PostScript를 해킹하여 시작합니다. 그런 다음 포스트 스크립트 코드를 출력하는 다른 언어로 코드를 작성하여 입력에 따라 필요에 따라 적절한 부분을 변경합니다.

그래서 여기 예입니다, 즉 아주 잘 읽지 않습니다를 참조하십시오. 원의 반지름을 포함하는 입력 파일을 가지고 있다면 그 반지름을 읽는 프로그램을 파이썬으로 작성한 다음, 그 반지름을 포스트 스크립트에 하드 코딩하여 원을 그리는 포스트 스크립트 코드를 작성합니다.

나는 년 전 크로스 워드 퍼즐 프로젝트 작업을 시작했다. 너무 멀지 않았지만 첨부 된 포스트 스크립트 코드는 작은 낱말 퍼즐을 그릴 것입니다. "적절한"포스트 스크립트는 내가 신경 쓰지 않는 몇 가지 문서 규칙을 따른다. 내가 게시 할 수있는 스케치 노트가 있습니다.

이 포스트 스크립트 코드는 몇 가지 계산을 수행합니다. 일반적으로 PostScript 인터프리터에서만 사용할 수있는 데이터가 필요한 작업 (예 : 현재 글꼴의 문자열 너비 등)을 위해 PostScript에 함수를 작성합니다.

나는 이것을 모두 청소하지 않았다. 설명을 요청하십시오. HTH.포스트 스크립트에 대한

%! 

% "Example" 
% by (author) 
% Generated 16 Apr 2005 22:19 by (program name) 

% should really be eps 

% unit conversions 

/inch {72 mul} bind def 
/cm {inch 2.54 div} bind def 



%%%%%% start of adjustable parameters 

% these may be fiddled with, within reason 
% be careful not to change the syntax 

% paper size 
/page_width 8.5 inch def 
/page_height 11 inch def 

% page margins 
/top_margin 1 inch def 
/left_margin 1 inch def 

% how many "cells" wide and high 
/puzzle_width 9 def 
/puzzle_height 9 def 

% cell_size: height and width of a one-letter square, in points 
/cell_size .25 inch def 

% line width, in points. 1 is about maximum. 
/line_width .375 def 

% font and size for the numbers 
/cell_font {/Helvetica 5} bind def 

% top/left margin for numbers within a cell 
/num_margin 1.5 def 

%%%%%% end of adjustable parameters 



<< /PageSize [page_width page_height] >> setpagedevice 


/w_pts puzzle_width cell_size mul def 
/h_pts puzzle_height cell_size mul def 

/ulx left_margin def 
/uly page_height top_margin sub def 
/lrx ulx w_pts add def 
/lry uly h_pts sub def 


% draw grid 

line_width setlinewidth 
0 setgray 

newpath ulx uly w_pts h_pts neg rectstroke 

lry cell_size uly { 
    newpath ulx exch moveto w_pts 0 rlineto stroke 
} for 

ulx cell_size lrx { 
    newpath lry moveto 0 h_pts rlineto stroke 
} for 


% fill in black spaces 

% ulx uly width height blackrect 
% all in terms of cells; upper-left-most is 0,0 
/blackrect 
{ 
    << >> begin 
    /h exch def /w exch def /y exch def /x exch def 
    newpath 
    ulx x cell_size mul add 
    uly y cell_size mul sub 
    w cell_size mul 
    h cell_size mul neg 
    rectfill 
    end 
} bind def 

0 setgray 
0 0 1 1 blackrect 
3 0 2 1 blackrect 
8 0 1 1 blackrect 
4 1 1 1 blackrect 
2 2 1 1 blackrect 
6 2 1 1 blackrect 
8 3 1 1 blackrect 
0 4 2 1 blackrect 
7 4 2 1 blackrect 
0 5 1 1 blackrect 
2 6 1 1 blackrect 
6 6 1 1 blackrect 
4 7 1 1 blackrect 
0 8 1 1 blackrect 
4 8 2 1 blackrect 
8 8 1 1 blackrect 


% draw numbers 

% x y h s drawnum 
% x and y in terms of cells; upper-left-most is 0,0. s is string. 
% h is height of numbers. should never change, so compute once before any calls. 
/drawnum 
{ 
    << >> begin 
    /s exch def /h exch def /y exch def /x exch def 
    newpath 
    ulx x cell_size mul add num_margin add 
    uly y cell_size mul sub num_margin sub h sub 
    moveto s show 
    end 
} bind def 

0 setgray 
cell_font selectfont 

% compute font height 
mark 
newpath 0 0 moveto 
(0) false charpath flattenpath pathbbox 
/fh exch def 
cleartomark newpath 

1 0 fh (1) drawnum 
2 0 fh (2) drawnum 
5 0 fh (3) drawnum 
6 0 fh (4) drawnum 
7 0 fh (5) drawnum 
0 1 fh (6) drawnum 
3 1 fh (7) drawnum 
5 1 fh (8) drawnum 
8 1 fh (9) drawnum 
0 2 fh (10) drawnum 
3 2 fh (11) drawnum 
4 2 fh (12) drawnum 
7 2 fh (13) drawnum 
0 3 fh (14) drawnum 
2 3 fh (15) drawnum 
6 3 fh (16) drawnum 
2 4 fh (17) drawnum 
1 5 fh (18) drawnum 
7 5 fh (19) drawnum 
8 5 fh (20) drawnum 
0 6 fh (21) drawnum 
3 6 fh (22) drawnum 
7 6 fh (23) drawnum 
0 7 fh (24) drawnum 
2 7 fh (25) drawnum 
5 7 fh (26) drawnum 
6 7 fh (27) drawnum 
1 8 fh (28) drawnum 
6 8 fh (29) drawnum 


showpage 
+0

그래서 포스트 스크립트를 만들기 위해 c를 작성하는 것이 대안 이었지만, 포스트 스크립트에서 간단히 그렇게하는 것이 귀엽다고 생각했습니다. 나는 힘들다. 나는 참고 매뉴얼과 청색과 초록색 책을 썼다. 그래서 나는 뇌에 구현되지 않은 함정을 던지면서 계속하는 IO 이외의 모든 것을 잘해야한다. * :: 한숨 : * – dmckee

+0

음, 힘들어요. 실제 PS 해커가 쉽게 찾을 수 있습니다. 나는 ref 매뉴얼 만 갖고있다. 파이썬을 직접 사용합니다. 나는 당신이 그것을 사용했음을 본다, 그러나 아마별로. 그것은 훨씬 더 생산적이며, C 기술은 이제 녹슬 었습니다. – Vamana

6

포스트 스크립트의 파일 IO에 대한 몇 가지 트릭과 바로 가기가 있으며, 포스트 스크립트 책의 소개 섹션에서 자주 언급되지 않습니다. 그들 중 가장 잘 보관 된 비밀은 '토큰'연산자입니다. 해석자 자신의 스캐너를 빌려 (네임 타입 객체 생성), 숫자 (integerype 또는 realtype 객체 인 생성) 또는 이들의 배열을 읽을 수 있습니다 (단, 실행 가능 배열 표기법을 사용하는 경우에만 가능). 중괄호, 그렇지 않으면 그냥 왼쪽 된 대괄호를 나타내는 marktype 개체를 얻을. 간단한 예를 들어

, 나는 종종 포스트 스크립트 프로그램에서 확장 된 해설 부분을 포함하는이 한 줄을 사용

%! 
{ currentfile token pop /END-COMMENT eq {exit} if } loop 
Each word here is read from the current file and converted 
into a name object and compared to "/END-COMMENT". 
It can have but does not need a preceeding slash. 

This program produces an image of a snowman in a blizzard, 
suitable for use as stationary. 
END-COMMENT 

showpage 

편집 : 나는 지금 정말 끔찍한 대답 실현 .. . 지금까지.

(Some 
multi-line 
text) 
pop 

그래서, 진짜이 시간 :

내 위의 예제에 불과하다.

시작하려면 loop이 필요합니다.

{ 
} loop 

이 루프 내부에는 몇 가지 데이터가 있습니다.

/src (datafile) (r) file def 
{ 
    src readline 
} loop 

관찰 한대로 파일 읽기 연산자는 모두 스택 맨 위에 부울을 반환합니다. 완전한!

/src (datafile) (r) file def 
{ 
    src readline { 
    }{ 
     exit 
    } ifelse 
} loop 

그래서 뭔가를하고 반복 계속됩니다 부울 사실, 그러나 (노 더 많은 데이터) 부울 거짓은 루프가 종료됩니다. 그러나 readline에는 데이터를 넣을 문자열이 필요합니다. 그리고 거짓 경우에도 문자열을 반환합니다.

/src (datafile) (r) file def 
/str 80 string def 
{ 
    src str readline { 
     processline 
    }{ 
     pop exit 
    } ifelse 
} loop 

이제 파일의 데이터 (최대 80 자)가 포함 된 문자열이 있습니다. Postscript 구문과 거의 비슷하다면 루프 내에서 token을 사용할 수 있습니다 (첫 번째 예제와 마찬가지로 파일에서 각 단어를 읽고 실행 파일 이름으로 변환 한 다음 리터럴 이름과 비교 함). 이름이 일치하면 exit 루프). 또는 get 루프 (또는 forall 루프)를 사용하여 각 바이트를 정수로 추출 할 수 있습니다. 하지만 멋진 일은 search입니다.

이 절차에서는 문자열에서 공백으로 구분 된 단어를 검색하여 각 단어를 자체 줄에 stdout으로 인쇄합니다.

/processline { % (line) 
    () { % (line) () 
     search { % (post) () (pre) 
      = 
     }{ % (no-match) 
      = 
      exit 
     } ifelse 
    } loop 
} def 

다른 단어처럼 마지막 단어에 동일한 작업을 수행하려는 경우 여기에서 사례를 복제하는 것이 일반적으로 더 쉽습니다. 최상위 문자열을 처리하는 까다로운 물건을 수행하고 다음 부울 테스트; 번거롭게 할 가치는 없습니다. 멋진 점은 search이 결과를 반환하는 편리한 순서입니다. 그것은 당신이 그것으로 작업 할 수 있도록 끈의 시작 부분을 맨 위에 놓습니다. 그런 다음 "일치"를 제공합니다 (처음에는 "검색"과 동일 함). 나머지는 나머지 문자열입니다. 그리고 그들은 루프의 다음 라운드를 위해 이미 올바른 순서로되어 있습니다.

그래서 외부 파일에서 추출한 공백으로 구분 된 단어로 무엇을하고 싶습니까?

숫자를 나타내는 경우 cvi 또는 cvr 수 있으며 산술 않습니다. 영숫자 인 경우 print 또는 show 수 있습니다. 또는 cvn을 사용하고 원자 기호로 사용하십시오.

+0

무한 길이의 줄을 유지하기 위해 문자열 버퍼를 늘리는 [readline 용 래퍼 함수] (http://groups.google.com/group/comp.lang.postscript/browse_thread/thread/6799414eb7490e52#)를 게시했습니다. –

+0

나는 "최상위 문자열을 처리하고 부울을 테스트하기위한 까다로운 방법"을 보았습니다. "[여기] (https://groups.google.com/d/msg/comp.lang.postscript/h4CtQ- 7edu0/7plTa2cP0I8J). –

관련 문제