একটি বই লেখক লিখুন


10

এখানে একটি খোলা বইয়ের মোটামুটি সহজ ASCII চিত্র রয়েছে:

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

লক্ষ্য করুন যে পাঠ্যের অংশটি কেবলমাত্র ডান পৃষ্ঠায় রয়েছে এবং 5 টি লম্বা দ্বারা 8 অক্ষর প্রস্থ রয়েছে। এছাড়াও লক্ষ্য করুন যে বইয়ের উপরের প্রান্তটিতে 5 ব্যাকস্ল্যাশ এবং 10 আন্ডারস্কোর রয়েছে। 10 পাঠ্যের প্রস্থ 3 যোগে আসে এবং 5টি 10 ​​এর অর্ধেক হয়।

একই স্কেলিং ফর্ম্যাটটি ব্যবহার করে আমরা বইটির আকারটি একটি পাঠ্য অঞ্চল ডাবল অক্ষর প্রশস্ত এবং h উচ্চতর করতে পারি, যেখানে ডব্লুটি কোনও বিজোড় ধনাত্মক পূর্ণসংখ্যা এবং এইচটি কোনও ধনাত্মক পূর্ণসংখ্যা হয়।

কিছু W × H বই: 1 × 1, 1 × 2, 3 × 2

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

শীর্ষে আন্ডারস্কোরগুলির সংখ্যা সর্বদা ডাব্লু +3 এবং ব্যাকস্ল্যাশগুলির সংখ্যা সর্বদা ( ডাব্লু +3) / 2 থাকে।

লক্ষ্য

একটি progam করে একটি ফাইলের নাম এবং লাগে লিখুন W এবং কমান্ড লাইন আর্গুমেন্ট, এবং 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 |
 \ || ?   |
  \||_____|

>>>

লক্ষ্য করুন যে প্রতিটি বইয়ের পরে একটি নতুন লাইন রয়েছে এবং কোনও পিছনের স্থান নেই। এটি প্রয়োজন।

মন্তব্য

  • আপনি ধরে নিতে পারেন ফাইলটিতে কেবল প্রিন্টযোগ্য এএসসিআইআই অক্ষর রয়েছে (হেক্স 20 থেকে 7 ই)।
  • শব্দের সীমা নির্বিশেষে প্রতিটি উপলভ্য স্পটে একটি করে অক্ষর মুদ্রণ করুন।
  • W এবং হয় ঐচ্ছিক যুক্তি হল যে ডিফল্টে 7 এবং 5 যথাক্রমে। আপনার প্রোগ্রাম হয় উভয় দেওয়া হবে না উভয়। (আপনি ধরে নিতে পারেন ইনপুট সর্বদা সুগঠিত।)
  • শূন্যস্থান দিয়ে শেষ পৃষ্ঠায় কোনও খালি পাঠ্য স্থান পূরণ করুন।
  • Q যদি কেবল একটি পৃষ্ঠা থাকে তবে এখনও ছাড়তে হবে।

জয়লাভ

বোনাস প্রয়োগের পরে বাইটের মধ্যে সংক্ষিপ্ততম প্রোগ্রামটি জয়লাভ করে।

বোনাসেস

  • নেতৃস্থানীয় স্পেসগুলি সরিয়ে ফেলুন যাতে প্রতিটি লাইন একটি শব্দের সাথে শুরু হয় (বা শব্দ বিভাগ)। যেমন | amet, |প্রথম উদাহরণে হয়ে উঠবে | amet, c |। (-30 বাইট)
  • চাপার পরে Nবা পরে টানা আগের বইগুলির পর্দা সাফ করুন B(এবং Tআপনি যদি এর পরে বোনাস করেন) যাতে বইটি তার পরিবর্তিত পৃষ্ঠাগুলির মতো মনে হয়। (-20 বাইট)
  • করুন Tপাঠের মধ্যে অবিলম্বে টগল কী টপ থেকে-নীচের বাম-থেকে-বাম থেকে ডানে-থেকে-ডান টপ থেকে-নীচের (ডিফল্ট) থেকে টানা হচ্ছে। আপনি যদি প্রথম বোনাস করেন তবে এটি উপরে থেকে নীচে মোডে কলামগুলির জন্য কাজ করা উচিত। (-100 বাইট)

    উদাহরণস্বরূপ:

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

    হয়ে

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

"স্ক্রীনটি সাফ করুন" বোনাসটি কোড বোনাসের চেয়ে ভাষা বোনাস বলে মনে হচ্ছে ...
জন ডিভোরাক

আপনি পাঠ্যে বলেছেন যে ফাইলের নাম এবং বইয়ের মাত্রা এসটিডিইএন থেকে এসেছে তবে তারপরে আপনি সেগুলি আর্গুমেন্ট হিসাবে গ্রহণ করতে এগিয়ে যান। তাহলে তা কোনটি?
জন ডিভোরাক

আমি লক্ষ্য করেছি, আপনার নোটিশের জন্য ধন্যবাদ, যে কোনও পিছনে স্থান নেই। তবে আমাদের কি তাদেরকে অন্তর্ভুক্ত না করা দরকার?
জন ডিভোরাক

@ জনডভোরাক দুঃখিত, আমি বোঝাতে চাইছি তারা কেবল যুক্তি। আপনার কোনও পিছনে স্থান নেই। ক্লিয়ারিংটি "কোড বোনাস" হয়ে যায় তার উদাহরণ আপনি দিতে পারেন?
ক্যালভিনের

1
@ জানডভোরাক, আমার কাছে মনে হয় এটি আরও অনেক বেশি "পসিএক্স টার্মিনালে প্রোগ্রাম চালাবেন" বোনাস। \033[2J\033[;H
পিটার টেলর

উত্তর:


3

সি # 535bytes

স্কোর হ'ল কোডের 655 বাইট, ক্লিয়ারিংয়ের জন্য 2020 বাইট বোনাস এবং টি-কি-এর জন্য 100100 বাইট বোনাস ... আমার মনে হয়, আমি নিশ্চিতভাবে বলতে পারি না যে আমি অনুমানটিতে কিছু মিস করেছি না

আমি ডাব্লু পদ্ধতিটি যুক্তিটি ফিরিয়ে দিয়ে লুপগুলি চেষ্টা করতে এবং ভেঙে দিতে পারি, তবে এর জন্য প্রচেষ্টা প্রয়োজন, সুতরাং কোনও প্রতিশ্রুতি দেওয়া হয়নি।

গল্ফ কোড:

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

জাভা দিয়ে স্ক্রিনটি সাফ করার মতো নয় (যদি আমি কেবল কয়েকটি নতুনলাইন মুদ্রণ করি তবে ব্যতীত তবে ব্যবহারকারীকে সঠিক কনসোল আকার ব্যবহার করতে হবে)

কোড:

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

যদি প্রোগ্রামটি চিরতরে চালাতে না হয় তবে আমি ওয়েল লুপটি সরিয়ে কেবল মেইন কল করে কিছু বাইটও সঞ্চয় করতে পারি।

এটি অনুকূল নয়, তবে এটি একটি শুরু।


আমি নিশ্চিত যে আপনার publicকীওয়ার্ডগুলির দরকার নেই ... এছাড়াও, import java.*;কাজ করে?

@ প্রফেসরফিশ আমিও সে সম্পর্কে ভেবেছিলাম import java.*;, তবে এটি কার্যকর হয় না। এবং প্রধান পদ্ধতিটি হুবহু public static void main(String[]c)(অন্তর্ভুক্ত public) হওয়া দরকার, অন্যথায় এটি স্বীকৃত নয়। তবে অবশ্যই ক্লাসটি পাবলিক হওয়ার দরকার নেই, ভাল ক্যাচ।
টিম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.