নদী এড়ানো


48

পটভূমি

টাইপোগ্রাফিতে, নদীগুলি পাঠ্যের একটি ব্লকে ভিজ্যুয়াল ফাঁক হয় যা স্থানগুলির কাকতালীয় প্রান্তিককরণের কারণে ঘটে। এগুলি বিশেষত বিরক্তিকর যেহেতু আপনার মস্তিষ্ক পেরিফেরিয়াল দৃষ্টিশক্তিগুলিতে আরও সহজেই এগুলিকে গ্রহণ করেছে বলে মনে হয় যা আপনার চোখকে অবিচ্ছিন্ন করে।

উদাহরণস্বরূপ, নীচের পাঠ্যের ব্লকটি ধরুন, রেখাগুলি এমনভাবে ভাঙা হয়েছে যে লাইনের প্রস্থটি 82 টি অক্ষরের বেশি নয় :

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eismod tempor
incididunt ut labore et dolore maga aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet,
consectetur adipisicing elit, sed do eismod tempor incididunt ut labore et dolore
maga aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
est laborum.

নীচের ডান অংশে ছয়টি লাইন বিস্তৃত একটি নদী রয়েছে, যা আমি নীচের ব্লকে হাইলাইট করেছি:

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eismod tempor
incididunt ut labore et dolore maga aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum. Lorem█ipsum dolor sit amet,
consectetur adipisicing elit, sed do eismod tempor█incididunt ut labore et dolore
maga aliqua. Ut enim ad minim veniam, quis nostrud█exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute█irure dolor in reprehenderit in
voluptate velit esse cillum dolore eu fugiat nulla█pariatur. Excepteur sint
occaecat cupidatat non proident, sunt in culpa qui█officia deserunt mollit anim id
est laborum.

আমরা কিছুটা আলাদা কলামের প্রস্থ বেছে নিয়ে এটি প্রশমিত করতে পারি। উদাহরণস্বরূপ, আমরা যদি 78 78 টির বেশি অক্ষরের বেশি লাইন ব্যবহার করে একই পাঠ্য বিন্যাস করি , তবে দুটি লাইনের চেয়ে বেশি নদী নেই:

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eismod tempor
incididunt ut labore et dolore maga aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt
in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor
sit amet, consectetur adipisicing elit, sed do eismod tempor incididunt ut
labore et dolore maga aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum.

নোট করুন যে এই প্রশ্নের প্রয়োজনে আমরা কেবল মনসপাসড ফন্টগুলি বিবেচনা করছি, যেমন নদীগুলি কেবল ফাঁকা জায়গার উল্লম্ব কলাম umns একটি নদীর দৈর্ঘ্য এটি বিস্তৃত রেখার সংখ্যা।

অন্যদিকে: আপনি যদি আনুপাতিক ফন্টগুলিতে নদী সনাক্তকরণে আকর্ষণীয় হন তবে নেটওয়ার্কের চারপাশে কিছু আকর্ষণীয় পোস্ট রয়েছে।

চ্যালেঞ্জ

আপনাকে প্রিন্টযোগ্য এএসসিআইআই অক্ষরের একটি স্ট্রিং দেওয়া হয়েছে (কোড পয়েন্ট 0x20 থেকে 0x7E) - অর্থাৎ একটি একক লাইন। 70 এবং 90 টি অক্ষরের (সমেত) মধ্যে একটি লাইনের প্রস্থ সহ এই পাঠ্যটি মুদ্রণ করুন, যেমন পাঠ্যের কোনও নদীর সর্বোচ্চ দৈর্ঘ্য হ্রাস করা যায়। যদি একই (সর্বনিম্ন) সর্বাধিক নদীর দৈর্ঘ্যের একাধিক পাঠ্য প্রস্থ থাকে, তবে সঙ্কুচিত প্রস্থটি বেছে নিন। Characters 78 টি অক্ষরের সাথে উপরের উদাহরণটি সেই পাঠ্যের জন্য সঠিক আউটপুট।

লাইনগুলি ভাঙ্গার জন্য, আপনার স্পেস অক্ষরগুলি (0x20) লাইন ব্রেকগুলির সাথে প্রতিস্থাপন করা উচিত, যেমন ফলস্বরূপ রেখাগুলিতে যথাসম্ভব অনেকগুলি অক্ষর রয়েছে তবে নির্বাচিত পাঠ্য প্রস্থের চেয়ে বেশি নয়। নোট করুন যে ফলস্বরূপ লাইন বিরতি নিজেই সেই গণনার অংশ নয়। উদাহরণস্বরূপ, উপরের শেষ ব্লকে Lorem[...]tempor78৮ টি অক্ষর রয়েছে যা পাঠ্যের প্রস্থও।

আপনি ধরে নিতে পারেন যে ইনপুটটিতে একটানা স্পেস থাকবে না এবং এর মধ্যে নেতৃস্থানীয় বা পিছনে স্থান নেই। আপনি ধরেও নিতে পারেন যে কোনও শব্দে (অ-স্থানের ক্রমাগত সাবস্ট্রিং) 70 টিরও বেশি অক্ষর থাকবে না।

আপনি STDIN, কমান্ড-লাইন আর্গুমেন্ট বা ফাংশন আর্গুমেন্টের মাধ্যমে ইনপুট নিয়ে কোনও প্রোগ্রাম বা ফাংশন লিখতে পারেন এবং ফলাফলটি STDOUT এ মুদ্রণ করতে পারেন।

এটি কোড গল্ফ, তাই সংক্ষিপ্ত উত্তরটি (বাইটে) জেতে।


আমি মনে করি আপনার 78 এবং 82 কলামের মোড়কের উদাহরণগুলিতে, শেষ এবং দ্বিতীয় থেকে শেষ লাইনগুলি ভুল। 82 উদাহরণে, গত বিরতি মধ্যবর্তী হওয়া উচিত আইডি এবং হল , এবং 78 উদাহরণে এটা মধ্যবর্তী হওয়া উচিত মধ্যে এবং ফল্ট । নাকি আমি কিছু ভুল করছি?
ক্রিশ্চিয়ান লুপাস্কু

@ অপ্টিমাইজার টাই বিরতি পাঠ্য দৈর্ঘ্য, নদীর দৈর্ঘ্য নয়।
FryAmTheEggman

আমি অনুমান করি এটি একটি সরকারী নদী হিসাবে গণনা করা হয় না, তবে উদাহরণস্বরূপ
78৮

আমরা মত ক্ষেত্রে বিবেচনা এই যেমন নদী চলতে?
অপ্টিমাইজার

দুর্দান্ত চ্যালেঞ্জ! এইচএম, পরেরটি
হ'ল (নিখুঁতভাবে

উত্তর:


7

সিজেম, 116 106 99 84 77 72 বাইট

l:X;93,72>{:D;OOXS/{S+_2$+,D<{+}{@@);a+\}?}/a+}%{z'K*S/:!0a/1fb$W=}$0=N*

একক লাইন ইনপুট নেয় এবং সঠিক আউটপুটটি STDOUT এ মুদ্রণ করে।

আপডেট : অনেকগুলি উন্নত করা হয়েছে এবং বাছাই করা লুপ নিজেই সমস্ত গণনা করে রিলান্ড্যান্ট লুপগুলি সরানো হয়েছে। নদীর দৈর্ঘ্যের গণনায় একটি বাগও স্থির করে।

শীঘ্রই ব্যাখ্যা (আমি আরও গল্ফ করার পরে)

এখানে চেষ্টা করুন


@ অপ্টিমাইজার আপনি যদিও এআরজিভি থেকে ইনপুট ব্যবহার করতে পারেন তবে আপনি প্রতিবারের ea~পরিবর্তে এটি করতে পারেন X। দুটি বাইট সংরক্ষণ করুন।
মার্টিন ইন্ডার

12

রুবি 162 160 158 152 160 157 ( ডেমো )

i=gets+' '
(69..s=r=89).map{|c|w=i.scan(/(.{1,#{c}}\S) /).flatten
m=(0..c).map{|i|w.map{|l|l[i]}+[?x]}.join.scan(/ +/).map(&:size).max
m<s&&(s=m;r=w)}
puts r

আন-গল্ফ করা সংস্করণ:

input = gets+' '

result = ''

(69..smallest_max=89).each{|w|
  #split text into words of at most w characters
  wrap = (input+' ').scan(/(.{1,#{w}}\S) /).flatten

  #transpose lines and find biggest "river"
  max_crt_river = (0..99).map{|i| wrap.map{|l|l[i]} }.flatten.join.scan(/ +/).max_by(&:size).size

  if max_crt_river < smallest_max
    smallest_max = max_crt_river
    result = wrap.join ?\n
  end
}
puts result

@ মার্টিনব্যাটনার %r{...}আমাকে স্ট্রিং ইন্টারপোলেশন ব্যবহার করতে দেয়। আমি কেবল চেষ্টা করেছি 21.times, তবে রাস্তায় এর আরও কিছু জড়িত রয়েছে, এবং আমি কোনও সংক্ষিপ্ত সমাধানে পৌঁছতে পারি নি।
ক্রিশ্চিয়ান লুপাস্কু

@ MartinBüttner আপনি ঠিক হয়, এটা না কাজ! আমি আমার উত্তর সম্পাদনা করেছি। ধন্যবাদ!
ক্রিশ্চিয়ান লুপাস্কু


পছন্দ করেছেন আমি এখন এটি স্থির।
ক্রিশ্চিয়ান লুপাস্কু

8

এপিএল (105)

{∊{1↓∊⍵,3⊃⎕TC}¨⊃G/⍨V=⌊/V←{⌈/≢¨⊂⍨¨↓⍉2≠⌿+\↑≢¨¨⍵}¨G←(K⊂⍨' '=K←' ',⍵)∘{×⍴⍺:(⊂z/⍺),⍵∇⍨⍺/⍨~z←⍵>+\≢¨⍺⋄⍺}¨70+⍳21}

ব্যাখ্যা:

  • (K⊂⍨' '=K←' ',⍵): সামনে একটি স্থান যুক্ত করুন , তারপরে ফাঁকা স্থানগুলিতে বিভক্ত করুন। প্রতিটি শব্দের সাথে শুরু হওয়া স্থানটি ধরে রাখে।
  • ∘{... }¨70+⍳21: রেঞ্জের প্রতিটি সংখ্যার জন্য সেই মান সহ [71, 91]: (শব্দগুলি বিভক্ত হওয়ার কারণে, প্রতিটি 'লাইন' শুরুতে একটি অতিরিক্ত স্থান দিয়ে শেষ হয়, যা পরে সরানো হবে The অতিরিক্ত স্থানের ক্ষতিপূরণ দেওয়ার জন্য একটি)
    • ×⍴⍺:: যদি এখনও শব্দ বাকী থাকে,
      • z←⍵>+\≢¨⍺: প্রতিটি শব্দের দৈর্ঘ্য পান এবং প্রতি শব্দ প্রতি দৈর্ঘ্যের চলমান মোট গণনা করুন। একটি দিয়ে চিহ্নিত করুন 1সব কথায় পরের লাইনে ভরাট, এবং এই সঞ্চয় করতে গ্রহণ করা যেতে পারে z
      • (⊂z/⍺),⍵∇⍨⍺⍨~z: এই শব্দগুলি নিন এবং তারপরে তালিকার বাকী কী রয়েছে তা প্রক্রিয়া করুন।
    • ⋄⍺: যদি না হয়, ফিরে (যা এখন খালি)।
  • G←: লাইনের তালিকাগুলির তালিকা সংরক্ষণ করুন G(প্রতিটি লাইন দৈর্ঘ্যের জন্য প্রতিটি)।
  • V←{... }¨G: প্রতিটি সম্ভাবনার জন্য, দীর্ঘতম নদীর দৈর্ঘ্য গণনা করুন এবং এতে সংরক্ষণ করুন V:
    • +\↑≢¨¨⍵: প্রতিটি শব্দের দৈর্ঘ্য (আবার) পান এবং দৈর্ঘ্যের বাইরে একটি ম্যাট্রিক্স তৈরি করুন। ম্যাট্রিক্সের সারিগুলিতে প্রতিটি লাইনের জন্য চলমান মোট গণনা করুন। (সুতরাং, প্রতিটি লাইনের শুরুতে অতিরিক্ত স্থান উপেক্ষা করা হবে।)
    • 2≠⌿: ম্যাট্রিক্সের প্রতিটি কলামের জন্য দেখুন যে বিন্দুটির রেখার বর্তমান দৈর্ঘ্য তার পরে রেখার সাথে মেলে না। যদি তাই হয়, সেখানে না একটি নদী আছে।
    • ⊂⍨¨↓⍉: ম্যাট্রিক্সের প্রতিটি কলামকে নিজেই ভাগ করুন ( 1গুলি)। এটি তালিকার একটি তালিকা দেয়, যেখানে প্রতিটি নদীর জন্য নদীর [1, 0, 0, ...]দৈর্ঘ্যের উপর নির্ভর করে একটি তালিকা থাকবে । নদী না থাকলে তালিকাটি হবে [1]
    • ⌈/≢¨: প্রতিটি নদীর দৈর্ঘ্য পান এবং এর সর্বাধিক মান পান।
  • ⊃G/⍨V=⌊/V: থেকে G, প্রথম আইটেমটি নির্বাচন করুন যার জন্য দীর্ঘতম নদীর দৈর্ঘ্য সমস্ত আইটেমের জন্য সর্বনিম্নের সমান।
  • {1↓∊⍵,3⊃⎕TC}¨: প্রতিটি লাইনের জন্য, সমস্ত শব্দের এক সাথে যুক্ত করুন, মুঠো আইটেমটি সরিয়ে দিন (শুরু থেকে অতিরিক্ত স্থান) এবং শেষের দিকে একটি নতুন লাইন যুক্ত করুন।
  • : সমস্ত লাইন একসাথে যোগদান।

এটি 200 বাইট, 105 নয়
ব্যবহারকারী 11153

3
@ ব্যবহারকারী 11153 আমি ইউটিএফ -8 এনকোডিং হিসাবে নির্দিষ্ট করে নেই। এপিএল অক্ষর সেটটি একটি একক কোডপেজে ফিট হয়ে যায় (এবং সেই কোড কোডটি উপস্থিত রয়েছে ), অর্থাত্ একটি বিদ্যমান এনকোডিং রয়েছে যার মাধ্যমে সেই সমস্ত অক্ষর একটি বাইটে ফিট করে, এবং তাই 105 পুরোপুরি ঠিক আছে।
মার্টিন ইন্ডার

জানা ভাল! :)
ব্যবহারকারী 11153

8

বাশ + কোর্টিলস, 236 157 বাইট

একটি পৃথক পদ্ধতির সাথে সম্পাদিত - আগের চেয়ে বেশ খানিকটা খাটো:

a=(`for i in {71..91};{
for((b=1;b++<i;));{
fold -s$i<<<$@|cut -b$b|uniq -c|sort -nr|grep -m1 "[0-9]  "
}|sort -nr|sed q
}|nl -v71|sort -nk2`)
fold -s$a<<<$@

কমান্ড লাইন থেকে ইনপুট স্ট্রিং পড়ে।

3 নেস্টেড প্রকারের সাথে, আমি এটির জন্য বিগ-ও-টাইম জটিলতা কী তা ভাবতে কাঁপছি তবে এটি আমার মেশিনে 10 সেকেন্ডের নীচে উদাহরণটি পূর্ণ করবে।


3

পাইথন, 314 বাইট

SP3000, grc এবং FryAmTheEggman কে অনেক ধন্যবাদ:

b=range;x=len
def p(i):
 l=[];z=''
 for n in t:
  if x(z)+x(n)<=i:z+=n+' '
  else:l+=[z];z=n+' '
 return l+[z]*(z!=l[x(l)-1])
t=input().split();q=[]
for i in b(70,91):l=p(i);q+=[max(sum(x(l[k+1])>j<x(l[k])and l[k][j]is' '==l[k+1][j]for k in b(x(l)-1))for j in b(i))]
print(*p(q.index(min(q))+70),sep='\n')

2
পাই-থোন-এর মতো আরও বেশি
অপ্টিমাইজার

3

জাভাস্ক্রিপ্ট (ES6) 194 202

আইট্রেটিভ সমাধান, পুনরাবৃত্তি করা হলে সংক্ষিপ্ততর হতে পারে

F=s=>{
  for(m=1e6,b=' ',n=70;n<91;n++)
    l=b+'x'.repeat(n),x=r=q='',
    (s+l).split(b).map(w=>
      (t=l,l+=b+w)[n]&&(
        l=w,r=r?[...t].map((c,p)=>x<(v=c>b?0:-~r[p])?x=v:v,q+=t+'\n'):[]
      )
    ),x<m&&(o=q,m=x);
  alert(o)
}

ব্যাখ্যা

F=s=> {
  m = 1e9; // global max river length, start at high value
  for(n=70; n < 91; n++) // loop on line length
  {
    l=' '+'x'.repeat(n), // a too long first word, to force a split and start
    x=0, // current max river length
    q='', // current line splitted text
    r=0, // current river length for each column (start 0 to mark first loop)
    (s+l) // add a too long word to force a last split. Last and first row will not be managed
    .split(' ').map(w=> // repeat for each word 
      (
        t=l, // current partial row in t (first one will be dropped)
        (l += ' '+w)[n] // add word to partial row and check if too long
        &&
        (
          l = w, // start a new partial row with current word
          r=r? // update array r if not at first loop
          ( 
            q+=t+'\n', // current row + newline added to complete text 
            [...t].map((c,p)=>( // for each char c at position p in row t
              v = c != ' ' 
                ? 0 // if c is not space, reset river length at 0
                : -~r[p], // if c is space, increment river length
              x<v ? x=v : v // if current > max, update max
            ))
          ):[]  
        )  
      )
    )
    x < m && ( // if current max less than global max, save current text and current max
      o = q,
      m = x
    )
  }
  console.log(o,m)
}

টেস্ট ফায়ারফক্স / Firebug কনসোলে।

F('Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eismod tempor incididunt ut labore et dolore maga aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eismod tempor incididunt ut labore et dolore maga aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.')

আউটপুট

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eismod tempor
incididunt ut labore et dolore maga aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt
in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor
sit amet, consectetur adipisicing elit, sed do eismod tempor incididunt ut
labore et dolore maga aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum.

3

পাইথন 3, 329 বাইট

import re,itertools as s
def b(t,n):
 l=0;o=""
 for i in t.split():
  if l+len(i)>n:o=o[:-1]+'\n';l=0
  l+=len(i)+1;o+=i+' '
 return o
t=input();o={}
for n in range(90,69,-1):o[max([len(max(re.findall('\s+',x),default='')) for x in ["".join(i) for i in s.zip_longest(*b(t,n).split('\n'),fillvalue='')]])]=n
print(b(t,o[min(o)]))

অবরুদ্ধ সংস্করণ:

# Iterates over words until length > n, then replaces ' ' with '\n'
def b(t,n):
    l = 0
    o = ""
    for i in t.split():
        if l + len(i) > n:
            o = o[:-1] + '\n'
            l = 0
        l += len(i) + 1
        o += i + ' '
    return o

t = input()
o = {}
# range from 90 to 70, to add to dict in right order
for n in range(90,69,-1):
    # break text at length n and split text into lines
    temp = b(t,n).split('\n')
    # convert columns into rows
    temp = itertools.zip_longest(*temp, fillvalue='')
    # convert the char tuples to strings
    temp = ["".join(i) for i in temp]
    # findall runs of spaces, get longest run and get length
    temp = [len(max(re.findall('\s+',x),default='')) for x in temp]
    # add max river length as dict key, with line length as value
    o[max(temp)] = n

print(b(t,o[min(o)]))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.