서적 작가 쓰기


10

다음은 책의 ASCII 표현입니다.

|\
| \
|  \
|   \
|    \__________
|    ||         |
|    || Lorem i |
\    || psum do |
 \   || lor sit |
  \  ||  amet,  |
   \ || consect |
    \||_________|

텍스트 부분은 오른쪽 페이지에만 있으며 7 자 x 5 자입니다. 또한 책의 상단 가장자리에는 5 개의 백 슬래시와 10 개의 밑줄이 있습니다. 10은 텍스트 너비에 3을 더한 값이고 5는 10의 절반입니다.

우리는 책의 크기를 조정할 수있는 동일한 확장 형식을 사용하면 텍스트 영역이하는 w 다양한 문자와 시간의 경우, 높은 어떤이다 홀수 양의 정수와 시간은 양의 정수입니다.

일부 w × h 책 : 1 × 1, 1 × 2, 3 × 2

                    |\
          |\        | \
|\        | \____   |  \______
| \____   | ||   |  |  ||     |
| ||   |  | || L |  \  || Lor |
\ || L |  \ || o |   \ || em  |
 \||___|   \||___|    \||_____|

맨 밑줄 수는 항상 w +3이고 백 슬래시 수는 항상 ( w +3) / 2입니다.

파일 이름과 wh 를 명령 줄 인수로 사용하고 해당 텍스트 크기의 책을 표준 출력으로 출력하여 파일의 내용을 표시하는 프로그램을 작성하십시오.

파일에 한 페이지에 들어갈 수있는 것보다 더 많은 텍스트가 N있으면 키는 다음 페이지를 인쇄하고 페이지를 B다시 이동해야합니다. B첫 페이지 N에서을 누르 거나 마지막 페이지에서을 누르면 아무 일도 일어나지 않습니다 . Q키를 누르면 프로그램이 중지됩니다 .

f.txt포함 Lorem ipsum dol?하고 사용자가 키 시퀀스를 눌렀다 고 가정하십시오 N N B N N Q. 프로그램은 다음과 같이 실행되어야합니다.

>>> bookmaker f.txt 3 2
|\
| \
|  \______
|  ||     |
\  || Lor |
 \ || em  |
  \||_____|

|\
| \
|  \______
|  ||     |
\  || ips |
 \ || um  |
  \||_____|

|\
| \
|  \______
|  ||     |
\  || dol |
 \ || ?   |
  \||_____|

|\
| \
|  \______
|  ||     |
\  || ips |
 \ || um  |
  \||_____|

|\
| \
|  \______
|  ||     |
\  || dol |
 \ || ?   |
  \||_____|

>>>

모든 책 뒤에 줄 바꿈이 있으며 뒤에 공백이 없습니다. 필수입니다.

노트

  • 파일에 인쇄 가능한 ASCII 문자 (16 진 20-7E) 만 포함되어 있다고 가정 할 수 있습니다 .
  • 단어 경계에 상관없이 사용 가능한 각 지점에서 한 문자를 인쇄하십시오.
  • wh 는 각각 기본적으로 7과 5 인 선택적 인수입니다. 당신의 프로그램은 둘 다 또는 둘 다 주어지지 않을 것입니다. (입력이 항상 잘 구성되어 있다고 가정 할 수 있습니다.)
  • 마지막 페이지의 빈 텍스트 공간을 공백으로 채 웁니다.
  • Q 한 페이지 만 있으면 여전히 종료해야합니다.

승리

보너스가 적용된 후 가장 짧은 바이트 단위의 프로그램이 승리합니다.

보너스

  • 모든 행이 단어 (또는 단어 세그먼트)로 시작하도록 선행 공백을 제거하십시오. 예 | amet, |를 들어 첫 번째 예 에서는 | amet, c |. (-30 바이트)
  • 후 이전에 그려진 책의 화면을 취소 N하거나 B누를 때 (그리고 T이 후 보너스를 할 경우) 자리에 변화하는 페이지와 같은 책 외모 때문에. (-20 바이트)
  • T왼쪽에서 오른쪽으로 위에서 아래로 (기본값), 위에서 아래로 왼쪽에서 오른쪽으로 텍스트가 전환 되도록 키를 즉시 설정합니다. 첫 번째 보너스를 한 경우 상단에서 하단 모드의 열에 적용됩니다. (-100 바이트)

    예를 들어 :

    |\
    | \
    |  \______
    |  ||     |
    \  || Lor |
     \ || em  |
      \||_____|
    

    된다

    |\
    | \
    |  \______
    |  ||     |
    \  || Lrm |
     \ || oe  |
      \||_____|
    

"화면 지우기"보너스는 코드 보너스가 아닌 언어 보너스 인 것 같습니다 ...
John Dvorak

텍스트에서 파일 이름과 책 크기는 STDIN에서 가져온 것으로 말하지만 인수로 사용합니다. 그렇다면 어느 것입니까?
John Dvorak

나는 당신의 통지 덕분에 후행 공백이 없다는 것을 알았습니다. 그러나 우리는 그것들도 포함시키지 않아도됩니까?
John Dvorak

@JanDvorak 죄송합니다. 단지 인수 일뿐입니다. 뒤에 공백이 없어야합니다. 클리어링이 "코드 보너스"가되는 예를들 수 있습니까?
Calvin 's Hobbies

1
@ JanDvorak, 그것은 "POSIX 터미널에서 프로그램을 실행"보너스보다 더 보인다. \033[2J\033[;H
피터 테일러

답변:


3

C # 535 바이트

점수는 655 바이트의 코드 -20 바이트 보너스, T 키의 경우 -100 바이트 보너스입니다 ... 스펙에서 무언가를 놓치지 않았다고 확신 할 수는 없습니다.

W 메서드가 s 인수를 반환하도록하여 루프를 시도하고 축소 할 수는 있지만 노력이 필요하므로 약속이 없습니다.

골프 코드 :

using C=System.Console;using K=System.ConsoleKey;class P{static void W(int x,int y,string s){C.SetCursorPosition(x,y);C.Write(s);}static void Main(string[]a){int b=a.Length,w=b>0?int.Parse(a[0]):7,h=b>1?int.Parse(a[1]):5,p=0,i,j,o,T=1;var F=System.IO.File.ReadAllText("f.txt");b=(w+3)/2;S:C.Clear();for(i=0;i<w+3;i++){W(o=i+b+1,b-1,"_");W(o,h+b+1,"_");}for(i=0;i<h+2;){W(0,i,"|");W(b,o=i+++b,"||");W(b+w+4,o,"|");}for(i=0;i<b;){W(i+1,i,"\\");W(i,++i+h+1,"\\");}for(i=0;i<w;i++)for(j=0;j<h;)if((o=T>0?j++*w+p+i:i*h+p+j++)<F.Length)W(i+b+3,j+b,F[o]+"");K k=C.ReadKey(1>0).Key;p+=k==K.N&p<F.Length-w*h?w*h:k==K.B&p>0?-w*h:0;T=k!=K.T?T:-T;if (k!=K.Q)goto S;}}

비트 포맷 :

using C=System.Console;
using K=System.ConsoleKey;

class P
{
    static void W(int x,int y,string s)
    {
        C.SetCursorPosition(x,y);
        C.Write(s);
    }

    static void Main(string[]a)
    {
        int b=a.Length,w=b>0?int.Parse(a[0]):7,h=b>1?int.Parse(a[1]):5,p=0,i,j,o,T=1;
        var F=System.IO.File.ReadAllText("f.txt");
        b=(w+3)/2;

    S:
        C.Clear();

        for(i=0;i<w+3;i++)
        {
            W(o=i+b+1,b-1,"_");
            W(o,h+b+1,"_");
        }

        for(i=0;i<h+2;)
        {
            W(0,i,"|");
            W(b,o=i+++b,"||");
            W(b+w+4,o,"|");
        }

        for(i=0;i<b;)
        {
            W(i+1,i,"\\");
            W(i,++i+h+1,"\\");
        }

        for(i=0;i<w;i++)
            for(j=0;j<h;)
                if((o=T>0?j++*w+p+i:i*h+p+j++)<F.Length)
                    W(i+b+3,j+b,F[o]+"");

        K k=C.ReadKey(1>0).Key;
        p+=k==K.N&p<F.Length-w*h?w*h:k==K.B&p>0?-w*h:0;
        T=k!=K.T?T:-T;
        if (k!=K.Q)
            goto S;
    }
}

4

자바, 1039 1001 993 953 946

보너스 : 선행 공백 제거 (-30 바이트)-> 1009 971 963 923 916

화면을 지우는 것은 Java로 가치가 없습니다 (두 줄 바꿈을 인쇄하는 경우는 제외하지만 사용자는 올바른 콘솔 크기를 사용해야합니다)

암호:

import java.io.*;import java.util.*;class B {static int w=7,h=5,p,l;static String t="",o,u=" ",y="\\";public static void main(String[]c)throws Exception{if(c.length>1){w=Integer.valueOf(c[1]);h=Integer.valueOf(c[2]);}Scanner s=new Scanner(new FileReader(c[0]));while(s.hasNext()){t+=s.nextLine();}l=t.length();s = new Scanner(System.in);while(true){int q=w+3,z=q/2,i=0,j=0,a=w*h;o="";for(;i<z;i++)o+="\n|"+r(u,i)+y;o+=r("_", q);for(;j<h+2-z;j++){o+="\n|"+r(u,i-1)+"||";if(j==0)o+=r(u,w+2);else o+=u+t()+u;o+="|";}for(;i>0;i--){o+="\n"+r(u,z-i)+y+r(u,i-1)+"||";if(i>1)o+=u+t()+" |";}o+=r("_",w+2)+"|";System.out.print(o);switch(s.next().charAt(0)){case'Q':return;case'B':p=p>a?p-2*a:p-a;break;case'N':p=p>l?p-a:p;}}}static String t(){int e=p+w>l?l:p+w;String r="";if(p<=e)r=t.substring(p,e);r=r.replaceAll("^\\s+","");int y=r.length();p+=w;return y==w?r:r+r(u,w-y);}static String r(String s,int i){return new String(new char[i]).replace("\0",s);}

예쁜:

import java.io.*;import java.util.*;
class B {
    static int w=7,h=5,p,l; // w = text width, h = text height, p = current position in text
    static String t="",o,u=" ",y="\\";
    public static void main(String[]c)throws Exception{
        // get w and h of text, default to 7x5
        if(c.length>1){w=Integer.valueOf(c[1]);h=Integer.valueOf(c[2]);}
        // read file
        Scanner s=new Scanner(new FileReader(c[0]));while(s.hasNext()){t+=s.nextLine();}         
        l=t.length();
        // read input
        s = new Scanner(System.in);
        while(true){
            // print book
        int q=w+3,z=q/2,i=0,j=0,a=w*h; // q = number of underscores at the top, z = number of backslashes
        o="";
        // print top of book
        for(;i<z;i++)o+="\n|"+r(u,i)+y;
        o+=r("_", q);
        // print middle of book (hp-z lines). right now: i = z -1
        for(;j<h+2-z;j++){o+="\n|"+r(u,i-1)+"||";if(j==0)o+=r(u,w+2);else o+=u+t()+u;o+="|";}
        // print bottom of book
        for(;i>0;i--){o+="\n"+r(u,z-i)+y+r(u,i-1)+"||";if(i>1)o+=u+t()+" |";}
        o+=r("_",w+2)+"|";
        System.out.print(o);
        // user input
            switch(s.next().charAt(0)){                
                case'Q':return;
                case'B':p=p>a?p-2*a:p-a;break;
                case'N':p=p>l?p-a:p;
            }
        }       
    }

    /** return w characters of string t, from given position p. increase p*/
    static String t(){
        int e=p+w>l?l:p+w;
        String r="";        
        if(p<=e)r=t.substring(p,e);
        r=r.replaceAll("^\\s+",""); // remove leading spaces (cost:28 chars)
        int y=r.length();
        p+=w;
        return y==w?r:r+r(u,w-y);
    }
    static String r(String s,int i){return new String(new char[i]).replace("\0",s);} // repeat given string i times

프로그램이 영원히 실행될 필요가 없다면 while 루프를 제거하고 main을 호출하여 바이트를 절약 할 수 있습니다.

이것은 최적은 아니지만 시작입니다.


public키워드 가 필요없는 것 같습니다 ... 또한 import java.*;작동합니까?

@professorfish 나도 생각 import java.*;했지만 작동하지 않습니다. 그리고 주요 방법은을 public static void main(String[]c)포함하여 정확하게해야합니다 public. 그렇지 않으면 인식되지 않습니다. 그러나 물론 수업은 공개적이거나 잘 잡힐 필요는 없습니다.
tim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.