एक पुस्तक लेखक लिखो


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।

लक्ष्य

प्रोगाम लिखें जो एक फ़ाइल नाम और w और h को कमांड लाइन आर्ग्यूमेंट्स के रूप में लेता है , और फाइल की सामग्री को प्रदर्शित करने के लिए उन टेक्स्ट आयामों के साथ एक किताब को आउटपुट करता है जो स्टडआउट करता है।

जब फ़ाइल में एक से अधिक पाठ होंगे तो एक पृष्ठ में 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) हैं।
  • शब्द की सीमाओं की परवाह किए बिना, प्रत्येक उपलब्ध स्थान पर एक वर्ण प्रिंट करें।
  • डब्ल्यू और रहे हैं वैकल्पिक तर्क है कि डिफ़ॉल्ट करने के लिए 7 और 5 क्रमशः। आपका कार्यक्रम या तो दिया जाएगा या दोनों नहीं होगा। (आप मान सकते हैं कि इनपुट हमेशा अच्छी तरह बनता है।)
  • रिक्त स्थान के साथ अंतिम पृष्ठ पर किसी भी खाली पाठ स्थान को भरें।
  • Q केवल एक पृष्ठ होने पर भी छोड़ने की आवश्यकता होनी चाहिए।

जीतना

बोनस जीतने के बाद बाइट्स में सबसे छोटा कार्यक्रम जीत है।

बोनस

  • प्रमुख रिक्त स्थान निकालें ताकि हर पंक्ति एक शब्द (या शब्द खंड) से शुरू हो। जैसे | amet, |पहले उदाहरण में बन जाएगा | amet, c |। (-30 बाइट्स)
  • बाद में Nया बाद में खींची गई पुस्तकों की स्क्रीन साफ़ करें B(और Tयदि आप इसके बाद बोनस करते हैं) तो पुस्तक जगह में अपने बदलते पृष्ठों की तरह दिखती है। (-20 बाइट्स)
  • Tबाएँ से दाएँ ऊपर-नीचे (डिफ़ॉल्ट), ऊपर से नीचे बाएँ-से-दाएँ तक पाठ के बीच मुख्य रूप से टॉगल करें । यदि आपने पहला बोनस किया है तो उसे टॉप-टू-बॉटम मोड में कॉलम के लिए काम करना चाहिए। (-100 बाइट्स)

    उदाहरण के लिए:

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

    हो जाता है

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

"स्क्रीन साफ़ करें" बोनस एक कोड बोनस के बजाय एक भाषा बोनस लगता है ...
जॉन ड्वोरक

आप पाठ में कहते हैं कि फ़ाइल नाम और पुस्तक आयाम STDIN से आते हैं, लेकिन फिर आप उन्हें तर्क के रूप में लेते हैं। यह कौन है, फिर?
जॉन ड्वोरक

मैंने देखा है, आपके नोटिस के लिए धन्यवाद, कि कोई अनुगामी स्थान नहीं हैं। लेकिन क्या हमें उन्हें शामिल करने की आवश्यकता नहीं है?
जॉन ड्वोरक

@JDDvorak क्षमा करें, मेरा मतलब था कि वे केवल तर्क हैं। आप कोई रिक्त स्थान है की जरूरत है। क्या आप एक उदाहरण दे सकते हैं कि क्लियरिंग "कोड बोनस" कहां बन जाता है?
केल्विन के शौक 6

1
@JDDvorak, ऐसा लगता है कि मुझे "POSIX टर्मिनल में प्रोग्राम चलाना" बोनस अधिक है। \033[2J\033[;H
पीटर टेलर

जवाबों:


3

C # 535bytes

स्कोरिंग के लिए स्कोर -2055te बोनस के 655bytes स्कोर है, और T कुंजी के लिए -100byte बोनस ... मुझे लगता है, मैं यह नहीं कह सकता कि मुझे यकीन है कि मैंने कल्पना में कुछ याद नहीं किया है

मैं कोशिश कर सकता हूँ और डब्ल्यू विधि के तर्क को वापस करके छोरों को ध्वस्त कर सकता हूं, लेकिन इसके लिए प्रयास की आवश्यकता होगी, इसलिए कोई वादा नहीं करता।

गोल्फ कोड:

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.*;काम करता है ?

@professorfish मैंने भी सोचा था import java.*;, लेकिन यह काम नहीं करता है। और मुख्य विधि को बिल्कुल public static void main(String[]c)(सहित public) होने की आवश्यकता है , अन्यथा यह मान्यता प्राप्त नहीं है। लेकिन निश्चित रूप से वर्ग को सार्वजनिक होने की जरूरत नहीं है, अच्छी पकड़ है।
टिम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.