রাইট-সারিবদ্ধ পাঠ্য


27

আপনার কাজটি একটি স্ট্রিং ইনপুট এবং একটি নম্বর নেওয়া এবং স্ট্রিংটিকে ডানদিকে সারিবদ্ধ করা, পাঠ্যের প্রস্থকে সংখ্যাটি তৈরি করা। যখন একটি লাইন দীর্ঘ হয়, এটি ভাঙ্গা এবং বাকিটি পরবর্তী লাইনে লাগান, এটি প্রয়োজনীয় না হওয়া পর্যন্ত পুনরাবৃত্তি করুন। যদি কোনও লাইন প্রস্থের চেয়ে কম হয় তবে স্পেস দিয়ে প্যাড করুন। একাধিক নিউলাইনগুলি ঘটতে পারে এবং অন্য কোনও একক চরিত্রের মতো আচরণ করা উচিত।

উদাহরণস্বরূপ, স্ট্রিং

Programming
Puzzles
&
Code
Golf

এবং সংখ্যা 5উত্পাদন করবে:

Progr
ammin
    g
Puzzl
   es
    &
 Code
 Golf

যেখানে একই স্ট্রিং এবং সংখ্যাটি 10উত্পাদন করবে:

Programmin
         g
   Puzzles
         &
      Code
      Golf

স্ট্রিং

a

b

এবং 5 নম্বর উত্পাদন করবে:

    a
      <-- note the 5 spaces
    b

সবচেয়ে কম কোড জয়!


1
পাঠ্যটিতে " যখন প্রয়োজন হয় তখন লাইনগুলি ভাঙ্গুন [...]" বলে উল্লেখ করা হয়েছে, তবে আপনার উদাহরণগুলির সাহায্যে আপনি প্রতিটি শব্দের পরে ভাঙতে চান এমনকি এটি উপযুক্ত হবে। দয়া করে পরিষ্কার করুন: আমরা কি প্রতিটি শব্দ একটি নতুন লাইনে রাখি, বা আমরা একটি আসল শব্দ-মোড়ক অ্যালগরিদম বাস্তবায়ন করি?
টিমভি

একটি ইনপুট লাইনের মাঝখানে ফাঁকা স্থান থাকতে পারে, যেমন Programming Puzzles\n&\nCode Golf?
Sp3000

@ sp3000 স্পেস সহ যে কোনও চরিত্র থাকতে পারে।
ট্রেবুচেট

@ টিমউই: উদাহরণটিতে প্রতি লাইনে একটি শব্দ রয়েছে। কোনও লাইনের মধ্যে স্থান বিশেষ নয় তা পরিষ্কার করে দেওয়ার জন্য কিছু মাল্টি-ওয়ার্ড লাইন অন্তর্ভুক্ত করা ভাল ছিল। (অর্থাত্ কেবলমাত্র নিউলাইনগুলি এবং অ-নিউলাইনগুলিই রয়েছে))
পিটার কর্ডেস

উত্তর:



10

পাইথন 2, 84

s,n=input()
for w in s.split('\n'):
 w=w or' '
 while w:print w[:n].rjust(n);w=w[n:]

ইনপুট হিসাবে নতুন লাইন এবং একটি সংখ্যা দিয়ে একটি স্ট্রিং নেয় এবং ফলাফল মুদ্রণ করে। ইনপুটটির প্রতিটি লাইনের জন্য, প্রিন্ট করার আগে ফাঁকা জায়গায় বামটি প্যাড করতে nঅন্তর্নির্মিতটি ব্যবহার করে একবারে চরগুলি নিয়ে যায় এবং rjustমুদ্রণ করে।

আমি হ্যাক দিয়ে ফাঁকা লাইন কেস ঠিক করেছি w=w or' '। সম্ভবত একটি আরও ভাল পদ্ধতি আছে তবে আমি এটি সম্পর্কে খুব বেশি চিন্তা করব না।


8

সিজেম, 21 বাইট

li_qN/Sfe|f/ff{\Se[N}

1 বাইট বন্ধ করে আরও 3 টির জন্য পথ সুগম করার জন্য @ স্প3000 কে ধন্যবাদ

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

কিভাবে এটা কাজ করে

li                     Read an integer L from the first line of input.
  _                    Push a copy.
   qN/                 Split the remaining input at linefeeds.
      Sfe|             Map `OR " "'; the replaces empty lines with a space.
          f/           Split each line into chunks of length L.
            ff{     }  For each chunk, push L and the chunk; then:
               \         Swap L with the chunk.
                Se[      Left-pad the chunk to length L by prepending " ".
                   N     Push a linefeed.


4

পার্ল, 39 বাইট

perl -ni5 -e 's!^$|.{1,$^I}!printf"%${^I}s
",$&!ge'

36 বাইট + 3 বাইট জন্য -ni। মোড়কের প্রস্থটি আর্গুমেন্ট হিসাবে পাস করা হয়েছে -i

ফাঁকা রেখাগুলি স্পেস দিয়ে প্যাড করে সঠিকভাবে পরিচালনা করে:

$ echo -e "Programming\nPuzzles\n\n&\n\nCode\nGolf" | perl -ni5 -e 's!^$|.{1,$^I}!printf"%${^I}s
",$&!ge'
Progr
ammin
    g
Puzzl
   es

    &

 Code
 Golf

কিভাবে এটা কাজ করে

এই সমাধানটি সমপরিমাণ forলুপের উপর একটি বাইট সংরক্ষণ করে ইনপুটটি লুপ করতে বিকল্প অপারেটরটি ব্যবহার করে । আসল কৌশলটি, প্রতিস্থাপনের এলএইচএসের রেজিজেসে রয়েছে:

^$|.{1,$^I}

গ্লোবাল মডিফায়ারের সাথে এটি এক সাথে $^Iঅক্ষরের সাথে মিলবে ; যখন $^Iস্ট্রিং-এ অক্ষরের চেয়ে কম অবশিষ্ট থাকবে, তখন এটি শেষের সাথে সমস্ত কিছুর সাথে মিলবে। ^$ফাঁকা লাইনগুলি হ্যান্ডেল করার জন্য বিকল্পটি প্রয়োজন। উদাহরণ স্বরূপ:

$ echo -e "foo\n\nbar" | perl -ni2 -E 'say "<$_>" for /^$|.{1,$^I}/g'
<fo>
<o>
<>
<ba>
<r>

প্রতিস্থাপনের আরএইচএস কেবল printfফাঁকা জায়গাগুলির সাথে মেলে খণ্ডটি বাম-প্যাডে ব্যবহার করে।


আমি সবসময় সম্পর্কে ভুলে যাই $^I!
ডোম হেস্টিংস

@ ডোমহাস্টিংস আমি চিলিমাজিক থেকে সেই কৌশলটি শিখেছি, যিনি এটি অন্য চ্যালেঞ্জের মন্তব্যে উল্লেখ করেছিলেন ।
এইসুইটসআইবলাকনট 21

3

জাভাস্ক্রিপ্ট (ES6), 107

আমি চাই জেএসের প্যাড ফাংশনটি বিল্ট ইন ছিল। আচ্ছা ভালো.

(a,b)=>a.replace(eval(`/(.{${b}})(?!\\n)/g`),`$1
`).split`
`.map(c=>(Array(b).join` `+c).slice(-b)).join`
`

ব্যাখ্যা:

(a, b)=>

  // searches for sequences of characters longer than b without a newline after them and
  // adds a newline after every b characters of the sequence
  a.replace(eval(`/(.{${b}})(?!\\n)/g`), '$1\n')
    .split('\n')
    .map(c=>

      // prepends b spaces to each string then slices it from the right down to length b
      ( Array(b).join(' ') + c ).slice(-b)

    ).join('\n')

3

জুলিয়া, 126 বাইট

f(s,n)=for i=split(s,"\n") while length(i)>0 println(lpad(i[1:min(n,end)],n));length(i)<n?break:(i=i[min(n+1,end):end])end;end

Ungolfed:

function f(s::String, n::Int)
    for i in split(s, "\n")
        while length(i) > 0
            println(lpad(i[1:min(n,end)], n))
            length(i) < n ? break : (i = i[min(n+1,end):end])
        end
    end
end

2

বাশ, 62 , 61 + বৈশিষ্ট্য, 59

Nইনপুট প্রথম লাইন হিসাবে এটি পড়ার পরিবর্তে, কলার দ্বারা সেট করা যেতে পারে যদি সংক্ষিপ্ত ।

# width as a function arg: 59 chars
f()while read -rn$1 r;do [[ $r ]]&&printf %$1s\\n "$r";done
# width on stdin: 64 chars  (not updated with later suggestions&ideas)
read N;while read -rn$N r;do [[ $r ]]&&printf %$N's\n' "$r";done

এটি ইনপুটটিতে খালি লাইনগুলি পরিচালনা করতে ব্যর্থ। অন্যথায়, এটি শব্দ-বিভক্তকরণ, পথের নাম প্রসারণ বা অন্যথায় কেবল কাঁচা ডেটার চেয়ে বেশি হিসাবে বিবেচনা করে না।

read -n$Nএকটি চরিত্র সংরক্ষণ করে, তবে readমুঙ্গ করে দেয় \

[[ $r ]]&&প্রয়োজন হয় কারণ read -n4দেখতে আগামী গৃহস্থালির কাজ একটি newline হয় lookahead করতে পারবে না। সুতরাং এটি rএকটি 4-চর স্ট্রিংয়ে সেট করে এবং পরবর্তী পঠন শূন্য-চর খালি স্ট্রিং উত্পাদন করে। সত্যিকারের নিউলাইনগুলি ফিল্টার না করে এই মিথ্যা নিউলাইনগুলি ফিল্টার করার জন্য ট্র্যাকিংয়ের অবস্থা প্রয়োজন: পূর্ববর্তী লাইনটি সর্বোচ্চ দৈর্ঘ্যের ছিল কি না। হয় আরও কোড বা সম্পূর্ণ ভিন্ন পদ্ধতির প্রয়োজন হবে।

[[ $r ]][ -n "$r" ]লাইনটি শুরু হলে -z foo, বা হয় *বা যদি আপনি ব্যবহার করেন তবে কোনও কিছু যদি ত্রুটিগুলি এড়াতে প্রয়োজন তার চেয়ে কম হয় [ $r ]

ন্যায়বিচার স্ট্যান্ডার্ড প্রিন্টফ "% 4s" ফর্ম্যাট স্ট্রিংয়ের সাথে ঘটে।

সঙ্গে পরীক্ষা

f()(while read -rn$1 r;do [[ $r ]]&&printf %$1s\\n "$r";done); (echo 4; echo -e "*\n\\"; cat /tmp/lines) | f 4

1. আমি -rবাইট গণনা অন্তর্ভুক্ত করব । 2. f()(while ... done)কিছুটা খাটো।
ডেনিস

@ ডেনিস: [[ $r ]]&&এন = 4 ব্যতীত , দৈর্ঘ্যের 4 ইনপুট লাইন একটি ফাঁকা আউটপুট লাইন তৈরি করবে যেখানে আগে ছিল না। কারণ read4 টি অক্ষরের স্ট্রিং প্রদান করে, তারপরে পরবর্তী কলটিতে একটি নতুন লাইন দেখায় এবং ঠিক এখনই ফিরে আসে। এছাড়াও, ()টিপ জন্য ধন্যবাদ । আমি জানতাম না যে আপনি ফ্যানসকে সেভাবে সংজ্ঞায়িত করতে পারেন।
পিটার কর্ডস

আমি বাশে গল্ফ করার টিপস পড়ার পরামর্শ দিই । এটি একটি দুর্দান্ত সম্পদ।
ডেনিস

আসলে, যেহেতু whileইতিমধ্যে যৌগিক, আপনার এমনকি প্রথম বন্ধনীগুলিরও দরকার নেই:f()while ... done
ডেনিস

@ ডেনিস: বাহ, হ্যাক্সক্স লিঙ্কের জন্য ধন্যবাদ। এই জিনিসগুলির একটি দু'টি আমার কাছে নতুন ছিল এবং আমি একটি উত্তরে দুটি জিনিস ঠিক করেছিলাম :) আমি সাধারণত গল্ফ করি না, তবে কমান্ড-লাইনের জাঙ্কি হওয়ার 15 বছর আমাকে একটি বা দুটি জিনিস শিখিয়েছে :)
পিটার কর্ডস

2

হাস্কেল, 108 বাইট

import Data.List.Split
k[]=[""]
k x=x
f n=unlines.(map(\l->([1..n-length l]>>" ")++l).k.chunksOf n=<<).lines

ব্যবহারের উদাহরণ:

*Main> putStr $ f 5 "a\n\nb\ncd\nMatamorphosis"
    a

    b
   cd
Matam
orpho
  sis

কিভাবে এটা কাজ করে

                              .lines   -- split input string at newlines
                           =<<         -- for every line
                  chunksOf n           --    split into chunks of length n
                k                      --    fix empty lines
    map                                --    for every chunk
        \l->([1..n-length l]>>" "      --      make a string of missing spaces
                        ++l            --      and append the chunk
unlines                                -- join padded chunks with newlines in-between

1

GNU awk + bash, 70

f()(awk -vFPAT=.\{,$1} '{for(i=0;i++<NF;){printf "%'$1's\n",$i}}/^$/')

অ্যাশকে প্রোগ্রামে কাউন্ট স্লট করতে ব্যাশ ব্যবহার করা সম্ভবত। এটি একটি NR==1{N=$0}ব্লক সহ পড়ার চেয়ে ছোট ।

একবারে একটি লাইন পড়ুন। এফপ্যাট ব্যবহার করে সর্বোচ্চ -4-চরিত্রের অংশগুলিতে বিভক্ত করুন। (বিভাজকগুলির চেয়ে ক্ষেত্রগুলির সাথে মেলে G GNU এক্সটেনশন)) প্রতিটি ক্ষেত্র আলাদাভাবে প্রিন্ট করুন। (ডিফল্ট ORS = \ n)।

/^$/নিয়ম খালি লাইন, যা এন এফ = 0 আছে এবং তাই অন্য ব্লক সমস্ত এ প্রিন্ট না সেখানে প্রিন্ট হয়। সুতরাং আমার খাঁটি-বাশ সমাধানের বিপরীতে, এটি আসলে সাধারণ ক্ষেত্রে কাজ করে।

আধা-সম্পর্কিত নয়, তবে পার্লের এখনও পর্যন্ত আমার ধারণাটি কেবল পার্ল কোডের জন্য ১১২ টি অক্ষর:

(echo 4; echo -e 'foo\nbar'; echo -e "*\n\\"; echo '~$(true)'; cat /tmp/lines) |  # test input
perl -e '$N=<>;$/=\1;print "$N\n"; while(<>){if(/\n/ or length($l)>=$N){printf("%$4s\n",$l);$l=/\n/?"":$_;}else{$l.=$_;}}'

এটি নিউলাইনগুলির একটি খায় এবং এটি বেশ দীর্ঘ। $/=\1একবারে একটি বাইট পড়ে। আমরা to l তে সংযোজন করি। সম্ভবত নির্দিষ্ট-প্রস্থের বিভক্ত পদ্ধতির সাথে একটি লাইন-এ-সময় কম হবে।


1

বাশ + জিএনইউ ব্যবহার, 41

fold -$1|sed ":;s/^.\{,$[$1-1]\}\$/ &/;t"

স্ট্রিংটি STDIN এর মাধ্যমে ইনপুট হয়, প্রস্থটি কমান্ড-লাইন আর্গ দ্বারা ইনপুট হয়:

ubuntu@ubuntu:~$ echo 'Programming
Puzzles
&
Code
Golf'|./ralign.sh 10
Programmin
         g
   Puzzles
         &
      Code
      Golf
ubuntu@ubuntu:~$

1

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

s,n=input();N='\n'
for w in[i.lstrip()if i.replace(' ','').isalpha()else i for i in s.replace(N,'\n ').split(N)]:
 while w:print w[:n].rjust(n);w=w[n:]

এটি উপরের @ xnor এর উত্তরের একটি রূপান্তর, কারণ তিনি সঠিকভাবে নিউলাইনগুলি পরিচালনা করেন না।


forলুপ থেকে পরিবর্তিত হয়েছে:

for w in s.split('\n'):

করুন:

for w in[i.lstrip()if i.replace(' ','').isalpha()else i for i in s.replace(N,'\n ').split(N)]:

উদাহরণ

$ python main.py
"Programming\n\n\nPuzzles\n\n&\n\nCode\nGolf", 5
Progr
ammin
    g


Puzzl
   es

    &

 Code
 Golf

1

সি #, 143 বাইট

(s,n)=>Join("\n",s.Split('\n').SelectMany(l=>(l.Any()?l:" ").Select((c,i)=>new{c,i}).GroupBy(o=>o.i/n,o=>o.c).Select(g=>Concat(g).PadLeft(n))))

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

Func<string, int, string>এটি চালানোর জন্য ল্যাম্বডাকে একটি বরাদ্দ করুন

কম গল্ফড:

Func<string, int, string> Align = (s, n) => Join("\n", 
    s.Split('\n')
     .SelectMany(l => (l.Any() ? l : " ")
         .Select((c, i) => new { c, i })
         .GroupBy(o => o.i / n, o => o.c)
         .Select(g => Concat(g).PadLeft(n))));

1

গ্রোভি, 63 বাইট

সঠিকভাবে স্বাক্ষরিত স্ট্রিংটি দেয়। এখনও অবধি জানা নেই যে এখানে কোনও প্যাড লেফট (এবং প্যাডরাইট, প্যাডসেন্টার) ফাংশন রয়েছে।

f={s,n->s.split("(?<=\\G.{$n})|\n")*.padLeft(n," ").join("\n")}

1

জাভাস্ক্রিপ্ট 174 136

function R(s,x){return s.replace(new RegExp(".{"+x+"}","g"),"$&\n").replace(/[^\n]*/g,function(m){
while(m.length<x)m=" "+m;return m;})}


1

মতলব, 99 বাইট

6 বাইট অপসারণ করার জন্য @ বেকারকে ধন্যবাদ!

বেনামে ফাংশন ব্যবহার এবং ব্যবহার:

@(s,k)fliplr(char(cellfun(@fliplr,strsplit(regexprep(s,sprintf('\\S{%i}',k),'$0\n'),'\n'),'un',0))) 

ফাংশনটি সংজ্ঞায়িত করুন এবং ansএটি কল করার জন্য ব্যবহার করুন :

>> @(s,k)fliplr(char(cellfun(@fliplr,strsplit(regexprep(s,sprintf('\\S{%i}',k),'$0\n'),'\n'),'un',0)))

ans =

@(s,k)fliplr(char(cellfun(@fliplr,strsplit(regexprep(s,sprintf('\\S{%i}',k),'$0\n'),'\n'),'un',0)))

>> ans(['Programming' 10 'Puzzles' 10 '&' 10 'Code' 10 'Golf'], 5) %% 10 is line feed

ans =

Progr
ammin
    g
Puzzl
   es
    &
 Code
 Golf

1

বারলেস্কে, 28 বাইট

নীচের সংস্করণ হিসাবে একই, তবে 1 নম্বরটিকে সংখ্যা হিসাবে এবং অন্যান্য রেখাকে স্ট্রিং হিসাবে গণ্য করে।

lng_riPpun{pPco{pP' lp}mu}Wl

হিসাবে ব্যবহার:

$ cat input.txt | blsq --stdin "lng_riPpun{pPco{pP' lp}mu}Wl"
Progr
ammin
    g
Puzzl
   es
    &
 Code
 Golf

পুরানো সংস্করণ (16 বাইট):

{5co{5' lp}mu}Wl

উদাহরণ:

blsq ) "Programming\nPuzzles\n&\nCode\nGolf"{5co{5' lp}mu}Wl
Progr
ammin
    g
Puzzl
   es
    &
 Code
 Golf
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.