写书作家


10

这是一本打开的书的相当简单的ASCII描述:

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

请注意,文本部分仅在右侧页面上,宽7个字符,高5个字符。另请注意,该书的顶部边缘有5个反斜杠和10个下划线。10来自文本宽度加3,而5是10的一半。

使用相同的缩放格式,我们可以调整书的大小以使其文本区域的宽度为w个字符,高度为h个字符,其中w为任何奇数正整数,h为任何正整数。

一些w × h的书:1×1、1×2、3×2

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

顶部的下划线数量始终为w +3,反斜杠的数量始终为(w +3)/ 2。

目标

编写一个程序集,该程序集将文件名和wh作为命令行参数,然后将具有这些文本尺寸的书输出到stdout,以显示文件的内容。

当文件中的文本多于一页中的文本时,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字符(20到7E十六进制)。
  • 不论单词边界如何,都在每个可用位置打印一个字符。
  • wh可选参数,分别默认为7和5。您的程序将不会获得全部或全部获得。(您可能会认为输入总是格式正确的。)
  • 在最后一页上的任何空白文本空间中都用空格填充。
  • Q 如果只有一页,仍应要求退出。

获奖

应用奖金后最短的程序(以字节为单位)获胜。

奖金

  • 删除前导空格,以便每行以一个单词(或单词段)开头。例如| amet, |在第一个例子中将变成| amet, c |。(-30个字节)
  • 按下N或之前,清除以前绘制的书籍的屏幕BT如果您在此之后进行奖励),则该书籍看起来就像是其更改页面一样。(-20字节)
  • 使T键立即在从左到右从上到下(默认)到从上到下从左到右的文本之间切换。如果您获得了第一笔奖金,它应该适用于从上到下的模式中的列。(-100字节)

    因此,例如:

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

    变成

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

“清除屏幕”的奖金似乎是语言的奖金而不是代码的奖金……
John Dvorak

您在文本中说文件名和书本尺寸来自STDIN,但随后继续将它们用作参数。那是什么
约翰·德沃夏克

由于您的通知,我已经注意到没有尾随空格。但是我们是否也要求不包括它们?
约翰·德沃夏克

@JanDvorak对不起,我的意思是它们仅是论点。您需要没有尾随空格。您能否举一个例子说明清算在哪里变成“代码红利”?
加尔文的爱好2014年

1
@JanDvorak,对我来说似乎更像是“在POSIX终端上运行程序”的奖金。\033[2J\033[;H
彼得·泰勒

Answers:


3

C#535字节

分数是655字节的代码-20字节的清理奖金,以及-100字节的T键的奖金……我想,不能说我确定我没有错过任何规格

我可以通过让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

Java 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.*;,但它不起作用。而且main方法确实需要准确public static void main(String[]c)(包括public),否则无法识别。但是当然,该课程不必是公共的,很好。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.