সম্পূর্ণরূপে ন্যায়সঙ্গত করুন এবং পাঠ্যের একটি ব্লক হাইফেনেট করুন


26
Given  a width  and  a block  of
text containing possible hyphen-
ation points,  format it  fully-
justified (in monospace).

পুরোপুরি ন্যায়সঙ্গত হওয়ার অর্থ এটি বাম এবং ডানদিকে একত্রিত এবং প্রতিটি লাইন ফিট না হওয়া অবধি শব্দের মধ্যে ব্যবধান বাড়িয়ে অর্জিত হয়।

সম্পর্কিত:

ইনপুট

আপনার পছন্দ মতো যে কোনও ফরমেটে ইনপুট নিতে পারেন। আপনাকে দেওয়া হবে:

  • 5-100 (অন্তর্ভুক্ত) ব্যাপ্তিতে একটি লক্ষ্য প্রস্থ (অক্ষরে);
  • সম্ভবত হাইফেনেটেড শব্দযুক্ত পাঠ্যের একটি ব্লক। এটি কোনও স্থান-বিভাজনযুক্ত স্ট্রিং, শব্দের একটি অ্যারে বা শব্দ টুকরাগুলির অ্যারে (বা অন্য কোনও ডেটা উপস্থাপনা যা আপনি চান) হতে পারে।

একটি সাধারণ ইনপুট হতে পারে:

Width: 25
Text:  There's no bu-si-ne-ss lik-e s-h-o-w busine-ss, n-o bus-iness I know.

হাইফেনগুলি যেখানে সম্ভাব্য হাইফেনেশন পয়েন্টকে বোঝায় এবং স্পেসগুলি শব্দের সীমা চিহ্নিত করে। পাঠ্যের একটি সম্ভাব্য বিকল্প উপস্থাপনা:

[["There's"], ["no"], ["bu", "si", "ne", "ss"], ["lik", "e"], (etc.)]

আউটপুট

শব্দের মধ্যে কলাম স্পেস সহ ইনপুট পাঠ্য, কলামের প্রস্থে নিউলাইন এবং হাইফেনেশন পয়েন্টগুলি এটি কলামের প্রস্থে পুরোপুরি ন্যায়সঙ্গত করতে বেছে নেওয়া হয়েছে। ফাংশনগুলির জন্য, নতুন লাইন পৃথকীকরণ ব্যবহার না করে স্ট্রিংগুলির একটি অ্যারে (প্রতিটি লাইনের জন্য একটি) ফিরে পাওয়া যায়।

উপরের ইনপুটটির জন্য একটি সম্ভাব্য আউটপুট হতে পারে:

There's no  business like
show  business,  no  bus-
iness I know.

নোট করুন যে চূড়ান্ত "বাস-ইনস" এর মধ্যে একটি ব্যতীত সমস্ত হাইফেন সরানো হয়েছে, যা পরবর্তী লাইনে শব্দটি আবৃত রয়েছে তা দেখানোর জন্য রাখা হয়েছিল এবং দ্বিতীয় লাইনে যতটা সম্ভব পাঠ্য রয়েছে তা নিশ্চিত করার জন্য বেছে নেওয়া হয়েছিল।

বিধি

  • প্রতিটি লাইনের মধ্যে শব্দের মধ্যে শূন্যস্থানের সংখ্যা 1 টিরও বেশি হয়ে উঠতে পারে না, তবে যেখানে আপনি অতিরিক্ত স্থান সন্নিবেশ করান তা অন্যথায় আপনার উপর নির্ভর করে:

    hello hi foo     bar    <-- not permitted (1,1,5)
    hello  hi foo    bar    <-- not permitted (2,1,4)
    hello  hi  foo   bar    <-- OK (2,2,3)
    hello  hi   foo  bar    <-- OK (2,3,2)
    hello   hi  foo  bar    <-- OK (3,2,2)
    
  • কোনও লাইন স্পেস দিয়ে শুরু বা শেষ করতে পারে না (শেষ রেখা বাদে, যা স্পেস দিয়ে শেষ হতে পারে)।

  • সর্বশেষ লাইনটি প্রতিটি শব্দের মধ্যে একক ফাঁক দিয়ে ন্যায্য রেখে দেওয়া উচিত। এটি স্বেচ্ছাসেবী / পছন্দসই একটি নতুন লাইন অনুসরণ করা যেতে পারে, তবে এটি প্রয়োজন হয় না।

  • শব্দগুলিতে এজেড, এজেড, 0-9 এবং সাধারণ বিরামচিহ্ন ( .,'()&) থাকবে

  • আপনি ধরে নিতে পারেন যে কোনও শব্দের খণ্ডটি লক্ষ্য প্রস্থের চেয়ে বেশি দীর্ঘ হবে না এবং নিয়ম অনুসারে লাইনগুলি পূরণ করা সর্বদা সম্ভব হবে (অর্থাত প্রতিটি লাইনে কমপক্ষে 2 শব্দের টুকরো থাকবে বা 1 শব্দ খণ্ড যা লাইনটি পূরণ করে পুরোপুরি)

  • আপনাকে অবশ্যই হাইফেনেশন পয়েন্ট নির্বাচন করতে হবে যা পূর্ববর্তী লাইনে শব্দের অক্ষরের সংখ্যা সর্বাধিক করে তোলে (অর্থাত লাইন দিয়ে শব্দগুলি লোভনীয়ভাবে গ্রাস করতে হবে) উদাহরণস্বরূপ:

    This is an input stri-ng with hyph-en-at-ion poi-nts.
    
    This     is     an     input    stri-      <-- not permitted
    ng with hyphenation points.
    
    This  is an  input string  with hyph-      <-- not permitted
    enation points.
    
    This is an input  string with hyphen-      <-- OK
    ation points.
    
  • বাইটস মধ্যে সংক্ষিপ্ত কোড

উদাহরণ

Width: 20
Text:  The q-uick brown fox ju-mp-s ove-r t-h-e lazy dog.

The quick  brown fox
jumps over the  lazy
dog.

Width: 32
Text: Given a width and a block of text cont-ain-ing pos-sible hyphen-ation points, for-mat it ful-ly-just-ified (in mono-space).

Given  a width  and  a block  of
text containing possible hyphen-
ation points,  format it  fully-
justified (in monospace).

Width: 80
Text:  Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.

Programming Puzzles &  Code Golf  is a question and answer  site for programming
puzzle enthusiasts  and code golfers.  It's built and run  by you as part of the
Stack Exchange network  of Q&A sites. With your help,  we're working together to
build a library of programming puzzles and their solutions.

Width: 20
Text:  Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.

Programming  Puzzles
&  Code  Golf  is  a
question and  answer
site for programming
puzzle   enthusiasts
and  code   golfers.
It's  built  and run
by  you  as  part of
the  Stack  Exchange
network    of    Q&A
sites.   With   your
help,  we're working
together to  build a
library of  program-
ming   puzzles   and
their solutions.

Width: 5
Text:  a b c d e f g h i j k l mm nn oo p-p qq rr ss t u vv ww x yy z

a b c
d e f
g h i
j k l
mm nn
oo pp
qq rr
ss  t
u  vv
ww  x
yy z

Width: 10
Text:  It's the bl-ack be-ast of Araghhhhh-hhh-h-hhh-h-h-h-hh!

It's   the
black  be-
ast     of
Araghhhhh-
hhhhhhhhh-
hhh!

হ্যাঁ, শেষ পর্যন্ত আরেকটি (পাঠ্য-ভিত্তিক) টাইপোগ্রাফির চ্যালেঞ্জ :-)
ইটিএইচ প্রডাকশনগুলি

1
বিল্টিনগুলিতে @ অ্যাডম হ্যাঁ: কোনও কোডের বিধিনিষেধ নেই এবং সংক্ষিপ্ততম কোড জিততে পারে। অবশ্যই, এটি একটি বিরক্তিকর উত্তর পেতে পারে! লাইব্রেরি হিসাবে, আপনি যতক্ষণ না গ্রন্থাগারটি অবাধে উপলব্ধ থাকে এবং আপনি আপনার উত্তরটিকে "ভাষা + গ্রন্থাগার" হিসাবে চিহ্নিত করেন ততক্ষণ আপনি পারেন। এছাড়াও লাইব্রেরির সংস্করণটিকে এই চ্যালেঞ্জটির প্রাক-তারিখ করতে হবে।
ডেভ

1
কোনও হাইফেন বা একটি একক অক্ষর, যেমন anybod-yপ্রস্থ 7 সহ একটি রেখাটি শেষ হতে পারে, সে ক্ষেত্রে আমরা কি আউটপুট চয়ন করতে পারি anybodyবা anybod-\ny?
darrylyeo

1
@ জোনাথান অ্যালান হ্যাঁ; দুঃখিত, আমি এটি ঠিক করব
ডেভ

3
@darrylyeo না আপনাকে সেই ক্ষেত্রে পুরো শব্দটি আউটপুট দিতে হবে না, কারণ প্রতিটি লাইনে লোভের সাথে যতটা সম্ভব শব্দের অক্ষর থাকতে হবে।
ডেভ

উত্তর:


7

জাভাস্ক্রিপ্ট (ES6), 218 বাইট

w=>s=>s.map((c,i)=>c.map((p,j)=>(k+p)[l="length"]-w-(b=!i|j>0)+(j<c[l]-1)<0?k+=b?p:" "+p:(Array(w-k[l]-b).fill(h=k.split` `).map((_,i)=>h[i%(h[l]-1)]+=" "),o.push(h.join` `+(b?"-":"")),k=p)),o=[],k="")&&o.join`
`+`
`+k

সিনট্যাক্স ( f(width)(text)) কারি করার ক্ষেত্রে তর্ক করে এবং পাঠ্য ইনপুট চ্যালেঞ্জটিতে বর্ণিত ডাবল অ্যারে বিন্যাসে। স্ট্রিংগুলি সেই বিন্যাসে রূপান্তরিত হয় .split` `.map(a=>a.split`-`))। এছাড়াও, নতুনলাইনগুলি টেম্পলেট স্ট্রিংগুলির অভ্যন্তরে আক্ষরিক নতুন লাইনের।

আন-গল্ফড এবং পুনরায় সাজানো

width=>string=> {
    out=[];
    line="";
    string.map((word,i)=> {
        word.map((part,j)=> {

            noSpaceBefore = i==0 || j>0;
            if ((line+part).length - width - noSpaceBefore + (j<word.length-1) < 0) {
                line += noSpaceBefore ? part : " "+part;
            }
            else {
                words=line.split` `;
                Array(width - line.length - noSpaceBefore).fill()
                    .map((_,i) => words[i % (words.length-1)] += " ");
                out.push(words.join(" ") + (noSpaceBefore? "-" : ""));
                line=part;
            }
        });
    });
    return out.join("\n") + "\n"+line
}

এখানে ধারণাটি ছিল পুরো স্ট্রিংয়ের প্রতিটি অংশের মধ্য দিয়ে যাওয়া এবং প্রতিটি লাইন একবারে একটি অংশ তৈরি করা। একবার একটি লাইন সম্পূর্ণ হয়ে গেলে, এটি সমস্ত অতিরিক্ত স্পেস স্থাপন না করা অবধি বাম থেকে ডানে শব্দের ব্যবধান বাড়ায়।

পরীক্ষার স্নিপেট

f=
w=>s=>s.map((c,i)=>c.map((p,j)=>(k+p)[l="length"]-w-(b=!i|j>0)+(j<c[l]-1)<0?k+=b?p:" "+p:(Array(w-k[l]-b).fill(h=k.split` `).map((_,i)=>h[i%(h[l]-1)]+=" "),o.push(h.join` `+(b?"-":"")),k=p)),o=[],k="")&&o.join`
`+`
`+k
<style>*{font-family:Consolas,monospace;}</style>
<div oninput="O.innerHTML=f(+W.value)(S.value.split` `.map(a=>a.split`-`))">
Width: <input type="number" size="3" min="5" max="100" id="W">
Tests: <select id="T" style="width:20em" oninput="let x=T.value.indexOf(','),s=T.value;W.value=s.slice(0,x);S.value=s.slice(x+2)"><option></option><option>20, The q-uick brown fox ju-mp-s ove-r t-h-e lazy dog.</option><option>32, Given a width and a block of text cont-ain-ing pos-sible hyphen-ation points, for-mat it ful-ly-just-ified (in mono-space).</option><option>80, Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.</option><option>20, Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.</option><option>5, a b c d e f g h i j k l mm nn oo p-p qq rr ss t u vv ww x yy z</option><option>10, It's the bl-ack be-ast of Araghhhhh-hhh-h-hhh-h-h-h-hh</option></select><br>
Text: &nbsp;<textarea id="S" cols="55" rows="4"></textarea>
</div>
<pre id="O" style="border: 1px solid black;display:inline-block;"></pre>


8

জিএনইউ সেড -r , 621 বাইট

দুটি লাইন হিসাবে ইনপুট নেয়: প্রথমে অবিচ্ছিন্ন সংখ্যা হিসাবে প্রস্থ এবং দ্বিতীয় স্ট্রিং।

আমি নিশ্চিত এটি আরও বেশি গল্ফ করা যেতে পারে তবে ইতিমধ্যে আমি এতে অনেক বেশি সময় ফেলেছি।

x;N
G
s/\n/!@/
:
/@\n/bZ
s/-!(.*)@ /\1 !@/
s/!(.*[- ])(@.*1)$/\1!\2/
s/@(.)(.*)1$/\1@\2/
s/-!(.*-)(@.*)\n$/\1!\2\n1/
s/(\n!@) /\1/
s/-!(.* )(@.*)\n$/\1!\2\n1/
s/-!(.*-)(@.*1)$/\1!\21/
s/!(.*)-@([^ ]) /\1\2!@ /
t
s/ !@(.*)\n$/\n!@\1#/
s/!(.*-)@(.*)\n$/\1\n!@\2#/
s/!(.*)(@ | @)(.*)\n$/\1\n!@\3#/
s/-!(.*[^-])@([^ ]) (.*)\n$/\1\2\n!@\3#/
s/!(.+)@([^ ].*)\n$/\n!@\1\2#/
/#|!@.*\n$/{s/#|\n$//;G;b}
:Z
s/-?!|@.*//g
s/ \n/\n/g
s/^/%/
:B
G
/%.*\n.+\n/!bQ
:C
s/%([^\n])(.*)1$/\1%\2/
tC
s/([^\n]+)%\n/%\1\n/
:D
s/%([^ \n]* )(.*)1$/\1 %\2/
tD
s/(^|\n)([^\n]+)%(.*1)$/\1%\2\3/
tD
s/%([^\n]*)\n(.*)\n$/\1\n%\2/
tB
:Q
s/%(.*)\n1*$/\1/

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

প্রোগ্রামটি দুটি পর্যায়ে কাজ করে: ১. বিভক্ত করা এবং ২। নীচের জন্য, ধরুন আমাদের ইনপুটটি হ'ল:

111111111111
I re-mem-ber a time of cha-os, ru-ined dreams, this was-ted land.

সেটআপ

প্রথমে আমরা ইনপুটটি পড়ি, প্রথম লাইনটি (অবিচ্ছিন্ন সংখ্যা হিসাবে প্রস্থ) হোল্ড স্পেসে স্থানান্তরিত করি ( x), তারপরে পরবর্তী লাইনটি সংযুক্ত করুন ( N) এবং তারপরে হোল্ড স্পেস ( G) থেকে প্যাটার্ন স্পেসে প্রস্থের একটি অনুলিপি যুক্ত করুন । যেহেতু Nআমাদের একটি শীর্ষস্থানীয় রেখে গেছে \nআমরা এটির সাথে প্রতিস্থাপন করেছি !@, যা আমরা প্রথম ধাপে কার্সার হিসাবে ব্যবহার করব।

x;N
G
s/\n/!@/

এখন হোল্ড স্পেসের সামগ্রীটি 1111111111111(এবং এরপরে আর পরিবর্তন হবে না) এবং প্যাটার্ন স্পেসটি (সেডের "নিরবচ্ছিন্নভাবে" মুদ্রণের বিন্যাসে l):

!@I re-mem-ber a time of cha-os, ru-ined dreams, this was-ted land.\n111111111111$

ধাপ 1

প্রথম ধাপে, প্রধান @কার্সার একবারে একটি অক্ষরকে অগ্রসর করে এবং প্রতিটি চরিত্রের জন্য একটি 1প্যাটার্ন স্পেসের শেষে "কাউন্টার" থেকে সরানো হয়। অন্য কথায়, @foo\n111$, f@oo\n11$, fo@o\n1$, ইত্যাদি

!পিছনে কার্সার গ্রামাঞ্চলে ভ্রমণ @কার্সার, স্থান চিহ্নিত করার আমরা যদি পাল্টা লাইনের মাঝখানে 0 ছুঁয়েছে ভাঙতে পারে। কয়েক দফা এই জাতীয় চেহারা হবে:

!@I re-mem-ber a time of cha-os, ru-ined dreams, this was-ted land.\n111111111111$
!I@ re-mem-ber a time of cha-os, ru-ined dreams, this was-ted land.\n11111111111$
!I @re-mem-ber a time of cha-os, ru-ined dreams, this was-ted land.\n1111111111$

এখানে এমন একটি নিদর্শন রয়েছে যা আমরা চিনতে পারি: একটি স্থান অবিলম্বে @কার্সারের পরে। যেহেতু কাউন্টারটি 0 এর চেয়ে বড়, তাই আমরা ব্রেক মার্কারকে অগ্রসর করি, তারপরে মূল কার্সারটি অগ্রসর করে চলুন:

I !@re-mem-ber a time of cha-os, ru-ined dreams, this was-ted land.\n1111111111$
I !r@e-mem-ber a time of cha-os, ru-ined dreams, this was-ted land.\n111111111$
I !re@-mem-ber a time of cha-os, ru-ined dreams, this was-ted land.\n11111111$
I !re-@mem-ber a time of cha-os, ru-ined dreams, this was-ted land.\n1111111$

এখানে অন্য একটি নিদর্শন রয়েছে: -@এবং আমাদের কাউন্টারে এখনও 7 রয়েছে, তাই আমরা আবার ব্রেক ব্রেকটি অগ্রসর করে এগিয়ে চলেছি:

I re-!mem-@ber a time of cha-os, ru-ined dreams, this was-ted land.\n111$

এখানে একটি আলাদা প্যাটার্ন রয়েছে: একটি হাইফেন অবিলম্বে ব্রেক কার্সারের পূর্ববর্তী এবং অন্যটি প্রধান কার্সারের পূর্ববর্তী। আমরা প্রথম হাইফেনটি সরিয়ে ফেলি, ব্রেক কার্সরটি অগ্রসর করি এবং যেহেতু আমরা একটি অক্ষর অপসারণ করি, তাই কাউন্টারে 1 যুক্ত করি।

I remem-!@ber a time of cha-os, ru-ined dreams, this was-ted land.\n1111$

আমরা মূল কার্সারকে অগ্রসর করে চলেছি:

I remem-!ber@ a time of cha-os, ru-ined dreams, this was-ted land.\n1$

আগের মত, তবে এবার প্রধান কার্সার হাইফেন অনুসরণ না করে একটি স্থানের আগে। আমরা হাইফেনটি সরিয়ে ফেলি, তবে যেহেতু আমরা প্রধান কার্সারকেও অগ্রসর করছি আমরা কাউন্টারকে বাড়িয়ে তুলি না।

I remember !@a time of cha-os, ru-ined dreams, this was-ted land.\n1$
I remember !a@ time of cha-os, ru-ined dreams, this was-ted land.\n$

অবশেষে, আমাদের কাউন্টার শূন্য পৌঁছেছে। যেহেতু মূল কার্সারের পরের অক্ষরটি একটি স্থান, তাই আমরা একটি নতুন লাইন সন্নিবেশ করলাম এবং এর সাথে সাথে উভয় কার্সার রেখেছি। তারপরে আমরা কাউন্টারটি পূরণ করব ( G) এবং আবার শুরু করব।

I remember a\n!@ time of cha-os, ru-ined dreams, this was-ted land.\n111111111111$

@কার্সারটি স্ট্রিংয়ের শেষে না পৌঁছানো পর্যন্ত প্রথম ধাপটি কার্সারকে অগ্রসর করে এবং বিভিন্ন ধরণের সাথে মেলে matching

# Phase 1
:
  # End of string; branch to :Z (end of phase 1)
  /@\n/bZ

  # Match -!.*@_
  s/-!(.*)@ /\1 !@/

  # Match [-_]@ and >0
  s/!(.*[- ])(@.*1)$/\1!\2/

  # Advance cursor
  s/@(.)(.*)1$/\1@\2/

  # Match -!.*-@ and 0; add 1
  s/-!(.*-)(@.*)\n$/\1!\2\n1/

  # Match \n!@_
  s/(\n!@) /\1/

  # Match -!.*_@ and 0; add 1
  s/-!(.* )(@.*)\n$/\1!\2\n1/

  # Match -!.*-@ and >0; add 1
  s/-!(.*-)(@.*1)$/\1!\21/

  # Match -@[^_]_
  s/!(.*)-@([^ ]) /\1\2!@ /

  # If there were any matches, branch to `:`
  t

  # Match _!@ and 0
  s/ !@(.*)\n$/\n!@\1#/

  # Match -@ and 0
  s/!(.*-)@(.*)\n$/\1\n!@\2#/

  # Match @_|_@ and 0
  s/!(.*)(@ | @)(.*)\n$/\1\n!@\3#/

  # Match -!.*[^-]@[^_]_ and 0
  s/-!(.*[^-])@([^ ]) (.*)\n$/\1\2\n!@\3#/

  # Match !.+@[^_] and 0
  s/!(.+)@([^ ].*)\n$/\n!@\1\2#/

  # Match marked line (#) or !@ and 0
  /#|!@.*\n$/{
    # Remove mark; append width and branch to `:`
    s/#|\n$//
    G
    b
  }

:Z

# Cleanup
s/-?!|@.*//g
s/ \n/\n/g

প্রথম পর্বের শেষে, আমাদের প্যাটার্নের স্থানটি দেখতে এমন দেখাচ্ছে:

I remember a\ntime of cha-\nos, ruined\ndreams, this\nwasted land.

বা:

I remember a
time of cha-
os, ruined
dreams, this
wasted land.

দশা ২

দ্বিতীয় ধাপে আমরা %একটি কার্সার হিসাবে ব্যবহার করি এবং কাউন্টারটি একইভাবে শুরু করি, এর শুরু করে:

%I remember a\ntime of cha-\nos, ruined\ndreams, this\nwasted land.\n111111111111$

প্রথমত, আমরা কার্সারকে অগ্রসর করে এবং কাউন্টার থেকে 1 টি মুছে ফেলে প্রথম লাইনে অক্ষরগুলি গণনা করি, যার পরে আমাদের রয়েছে;

I remember a%\ntime of cha-\nos, ruined\ndreams, this\nwasted land.\n$

কাউন্টারটি যেহেতু 0, আমরা এই লাইনে অন্য কিছু করি না। দ্বিতীয় লাইনেও কাউন্টারটির মতো একই সংখ্যক অক্ষর রয়েছে, তাই আসুন তৃতীয় লাইনে চলে যান:

I remember a\ntime of cha-\nos, ruined%\ndreams, this\nwasted land.\n11$

কাউন্টারটি 0 এর চেয়ে বড়, সুতরাং আমরা কার্সারটিকে আবার লাইনের শুরুতে সরিয়ে নিয়ে যাই। তারপরে আমরা শূন্যস্থানগুলির প্রথম রান খুঁজে পাই এবং কাউন্টারকে হ্রাস করে একটি স্থান যুক্ত করি।

I remember a\ntime of cha-\nos, % ruined\ndreams, this\nwasted land.\n1$

কাউন্টারটি 0 এর চেয়ে বড়; যেহেতু কার্সারটি ইতিমধ্যে লাইনের ফাঁকা স্থানগুলির সর্বশেষ (কেবলমাত্র) দৌড়ে রয়েছে, তাই আমরা এটি আবার লাইনের শুরুতে সরিয়ে নিয়ে আবার এটি করি:

I remember a\ntime of cha-\nos,  % ruined\ndreams, this\nwasted land.\n$

এখন কাউন্টারটি 0, সুতরাং আমরা কার্সারটি পরবর্তী লাইনের শুরুতে সরিয়ে নিয়েছি। আমরা সর্বশেষ ব্যতীত প্রতিটি লাইনের জন্য এটি পুনরাবৃত্তি করি। এটি দ্বিতীয় ধাপের শেষ এবং প্রোগ্রামের শেষ! চূড়ান্ত ফলাফল:

I remember a
time of cha-
os,   ruined
dreams, this
wasted land.
# Phase 2
# Insert cursor
s/^/%/
:B
  # Append counter from hold space
  G
  # This is the last line; branch to :Q (end of phase 1)
  /%.*\n.+\n/!bQ

  :C
    # Count characters
    s/%([^\n])(.*)1$/\1%\2/
    tC

  # Move cursor to beginning of line
  s/([^\n]+)%\n/%\1\n/

  :D
    # Add one to each space on the line as long as counter is >0
    s/%([^ \n]* )(.*)1$/\1 %\2/
    tD

    # Counter is still >0; go back to beginning of line
    s/(^|\n)([^\n]+)%(.*1)$/\1%\2\3/
    tD

    # Counter is 0; move cursor to next line and branch to :B
    s/%([^\n]*)\n(.*)\n$/\1\n%\2/
    tB

:Q

# Remove cursor, any remaining 1s
s/%(.*)\n1*$/\1/

এই অবিশ্বাস্য, কিন্তু এটা ব্যবহার যখন আমি রান gsed (GNU sed) 4.4আমি পেতে gsed: -e expression #1, char 16: ":" lacks a label। আপনি কীভাবে এটি চালাচ্ছেন সে সম্পর্কে আপনি একটি নোট যুক্ত করতে পারেন? (আমি ব্যবহার করছি printf "%s\n%s" "$1" "$2" | gsed -r '<code here>';)
ডেভ

@ ডেভ যা জিএনইউ সিডে আমার জন্য কাজ করে 4.2। এখানে একটি সংক্ষিপ্তসার রয়েছে: gist.github.com/jrunning/91a7584d95fe10ef6b036d1c82bd385c নোট করুন যে টিওর সিড পৃষ্ঠাটি -rপতাকাটিকে সম্মান করছে বলে মনে হচ্ছে না , এ কারণেই উপরের টিও লিঙ্কটি ব্যাশ পৃষ্ঠায় যায়।
জর্দান

আহ, আমি টিআইও লিঙ্কটি লক্ষ্য করিনি। এটা আমার জন্য করব; একটি +1 আছে! সর্বশেষ উদাহরণে দুটি ছোট ভুল রয়েছে যদিও ("কালো জন্তু" এক): এটি দ্বিতীয় থেকে শেষ লাইনটির একটি অক্ষর ছোট করে ছাপায় এবং চূড়ান্তটিকে মিস করে !(যদিও আমি !সম্ভাব্য বিশেষ চরিত্রের তালিকা থেকে মিস করেছি, তাই আমি এটি এর বিরুদ্ধে রাখবে না)।
ডেভ

5

জাভাস্ক্রিপ্ট (ES6), 147 বাইট

হিসাবে ইনপুট লাগে (width)(text)

w=>F=(s,p=S=' ')=>(g=([c,...b],o='',h=c=='-')=>c?o[w-1]?c==S&&o+`
`+F(b):o[w+~h]?o+c+`
`+F(b):c>S?g(b,h?o:o+c):g(b,o+p)||g(b,o+p+c):o)(s)||F(s,p+S)

এটি অনলাইন চেষ্টা করুন!

মন্তব্য

w =>                              // w = requested width
  F = (                           // F is a recursive function taking:
    s,                            //   s = either the input string (first iteration) or an
                                  //       array of remaining characters (next iterations)
    p =                           //   p = current space padding
    S = ' '                       //   S = space character
  ) => (                          //
    g = (                         // g is a recursive function taking:
      [c,                         //   c   = next character
          ...b],                  //   b[] = array of remaining characters
      o = '',                     //   o   = output for the current line
      h = c == '-'                //   h   = flag set if c is a hyphen
    ) =>                          //
      c ?                         // if c is defined:
        o[w - 1] ?                //   if the line is full:
          c == S &&               //     fail if c is not a space
          o + `\n` + F(b)         //     otherwise, append o + a linefeed and process the
                                  //     next line
        :                         //   else:
          o[w + ~h] ?             //     if this is the last character and c is a hyphen:
            o + c + `\n` + F(b)   //       append o + c + a linefeed and process the next
                                  //       line
          :                       //     else, we process the next character:
            c > S ?               //       if c is not a space:
              g(b, h ? o : o + c) //         append c if it's not a hyphen
            :                     //       else:
              g(b, o + p) ||      //         append either the current space padding
              g(b, o + p + c)     //         or the current padding and one extra space
      :                           // else:
        o                         //   success: return o
  )(s)                            // initial call to g() with s
  || F(s, p + S)                  // in case of failure, try again with a larger padding



1

পাইথন 2 , 343 বাইট

W,T=input()
T+=' '
L,l=[],len
while T:
 p,r=0,''
 for i in range(l(T)):
  s=T[:i].replace('-','')
  if'-'==T[i]:s+='-'
  if T[i]in' -'and W-l(s)>=0:p,r=i,s
 R=r.split()
 if R:
  d,k=W-l(''.join(R)),0
  for j in range(d):
   R[k]+=' '
   k+=1
   if k==l(R)-1:k=0
  L+=[''.join(R)]
  T=T[p+1:]
print'\n'.join(L[:-1])
print' '.join(L[-1].split())

এটি অনলাইন চেষ্টা করুন!

The  input  is a block of text
containing possibly hyphenated
words.  For  each space/hyphen
position  p  the code computes
l(p)  the  length  of the line
induced  by  slipping the text
to this space/hyphen. Then the
code choses the position p for
which  the  length l(p) is the
closest  to  the given width W
(and  l(p)<=W).  If l(p)<W the
code  adds spaces  fairly  in-
between  the  words to achieve
the length W.

যদিও ইনপুট আপনার পছন্দ মতো কোনও ফর্ম্যাটে হতে পারে তবে এটি এসটিডিএন বা পরামিতি থেকে আসা উচিত। আই / ও এর জন্য খেলাপি দেখুন । আমরা সাধারণত পূর্বনির্ধারিত ভেরিয়েবলগুলি থেকে "ইনপুট" হওয়ার অনুমতি দিই না।
mbomb007

আপনি করছেন দ্বারা একটি বাইট সংরক্ষণ করতে পারবেন print'\n'.join(L[:-1])পরিবর্তেfor e in L[:-1]:print e
mbomb007

@ এমবম্ব ২০০7 ঠিক আছে হ্যাঁ আমি আই / ও
এমদাহমৌনে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.