প্রোগ্রামার গার্ডেন


12

প্রোগ্রামার গার্ডেন

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

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

ইনপুট

আপনার প্রোগ্রামটি বর্তমান হিসাবে প্রদর্শিত হবে হিসাবে ফ্লাওয়ারবেড বর্ণিত ইনপুট এবং আইটেমগুলি মুছে ফেলা দরকার তার বিবরণ দেওয়া হবে। প্রোগ্রামটি অবশ্যই বিশৃঙ্খলা বিহীন উদ্যানটিকে আউটপুট করতে হবে এবং উদ্যানপালকদের বেতন একটি বিচ্ছিন্নতা মুদ্রণ করবে। ইনপুটটি হয় STDIN থেকে হতে পারে, বা একক কমান্ড লাইন আর্গুমেন্ট হিসাবে।

ইনপুট প্রথম লাইন বিন্যাস হয়

width height unwanted_item_type_count

widthফ্লাওয়ারবেডের প্রস্থটি কোথায় , ফ্লাওয়ারবেডের heightউচ্চতা (উভয়ই এএসসিআইআই অক্ষর), এবং unwanted_item_type_countআপনাকে জানায় যে বাগান থেকে সরানোর জন্য এক ধরণের আইটেমের বিবরণ যুক্ত কতগুলি রেখাগুলি অনুসরণ করবে।

প্রতিটি অযাচিত ধরণের আইটেমের জন্য প্রতিটি লাইন বিন্যাসে

width height string_representation name fee_per_item

widthআইটেমটির প্রস্থ কোথায় , আইটেমের heightউচ্চতা (উভয় এএসসিআইআই অক্ষর), string_representationলাইন ব্রেক ছাড়াই আইটেমটির স্ট্রিং প্রতিনিধিত্ব, আইটেমের nameধরণের জন্য শনাক্তকরণ (স্পেসগুলি আন্ডারস্কোর দ্বারা প্রতিস্থাপন করা হবে), এবং fee_per_itemপ্রতিটি ধরণের আইটেম অপসারণের জন্য মালীকে কত অর্থ প্রদান করতে হবে is

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

3 2 .R.\|/ rouge_flower 3

নামের একটি আইটেম ধরণের প্রতিনিধিত্ব করে rouge_flower, এটি অপসারণ করতে 3 টি ব্যয় হয় এবং এটি দেখতে দেখতে:

.R.
\|/

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

3 1 ( ) space 0
1 1 . dot 0
2 1 .! bang 0
3 2 .@.\|/. plant 0

নোট করুন 0 তবে একটি বৈধ ফি (ফি সর্বদা পূর্ণসংখ্যার -1 এর চেয়ে বেশি হবে)।

আরও মনে রাখবেন যে ফ্লাওয়ারবেডটি মূলত .স্পেসগুলির চেয়ে বিন্দুগুলি ( ) দ্বারা গঠিত এবং আপনি সমস্ত ইনপুটগুলির জন্য নিরাপদে সাদা স্থানটি সীমানা হিসাবে ব্যবহার করতে পারেন। ফুলফলটি সর্বদা বিন্দু দ্বারা আবদ্ধ।

অযাচিত আইটেমের ধরণের তালিকাভুক্ত হওয়ার পরে প্রদত্ত প্রস্থ এবং উচ্চতার ফ্লাওয়ারবেডের ASCII প্রতিনিধিত্ব আসে।

আউটপুট

আউটপুট STDOUT এ হওয়া উচিত, বা আপনার ভাষা যদি সমর্থন না করে তবে উপযুক্ত বিকল্প হতে হবে।

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

.....
.#.#.
.....

2 পৃথক আইটেম দেখায়

.....
.\@/.
.....

1 আইটেম দেখায়

......
.#....
....|.
....|.
.o--/.
......

অবৈধ, পাথরটি (#) মেলাতে পারার সময়, সাপটি (আপনি এটি একটি সাপ বলতে পারেননি?) পাথরটি বিন্দুগুলির আশেপাশে প্রয়োজনীয় চারপাশে হস্তক্ষেপ করে।

...
\@.
...

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

এর পরে, বিন্যাসে প্রতিটি ধরণের অযাচিত আইটেমের একটি তালিকা থাকা উচিত, গণনা প্রদান করা উচিত, প্রতি আইটেমের ব্যয় এবং সমস্ত আইটেমের জন্য মূল্য (গণনা * প্রতি আইটেম প্রতি খরচ): ফর্ম্যাটটিতে:

<count> <name> at <cost_per_item> costs <cost>

এর পরে, মোট ব্যয় উপার্জনের একটি একক লাইন থাকা উচিত (অযাচিত আইটেমগুলির জন্য ব্যয়ের যোগফল):

total cost <total_cost>

উদাহরণ

এই প্রদত্ত ইনপুট জন্য

25 18 3
4 2 .\/.\\// weeds 5
2 1 \@ snails 2
1 1 # stones 1
.........................
.\@/.................\@..
............\/...........
......O....\\//..^|^.....
.#...\|/.........^|^.....
..................|......
.................\|/.....
..\@.....\/...........#..
........\\//....#........
....*....................
...\|/......\/......\@/..
...........\\//..........
..................*......
.......\@/.......\|/.....
...O.....................
..\|/.......*............
.......#...\|/....\@.....
.........................

প্রোগ্রামটি এই আউটপুট উত্পাদন করা উচিত

.........................
.\@/.....................
.........................
......O..........^|^.....
.....\|/.........^|^.....
..................|......
.................\|/.....
.........................
.........................
....*....................
...\|/..............\@/..
.........................
..................*......
.......\@/.......\|/.....
...O.....................
..\|/.......*............
...........\|/...........
.........................
3 weeds at 5 costs 15
3 snails at 2 costs 6
4 stones at 1 costs 4
total cost 25

আউটপুটটি অবশ্যই একটি লাইন-ব্রেক দ্বারা শেষ করা উচিত

এটি কোড-গল্ফ, সংক্ষিপ্ততম কোড জিততে পারে।

অতিরিক্ত পরীক্ষার মামলা

সম্পাদনা করুন: এটিতে ইউনিকোড রয়েছে, যা ফ্লাওয়ারবেডে অনুমোদিত নয়, অনেক বেশি আধুনিক। এটি সংশোধন করা হয়েছে, সে সম্পর্কে দুঃখিত।

25 15 5
5 3 ..@..\\|//.\|/. overgrown_plants 3
5 3 @-o....|...\|/. semi-articulated_plant 4
3 2 .|.\@/ mutant_plants 5
1 1 $ dollars 0
1 1 # stones 1
.........................
........@................
....$..\|/...........@...
............|.......\|/..
...#.......\@/...........
.........................
.........................
......@.......@......@...
.....\|/....\\|//...\|/..
.............\|/.........
.#....................#..
.........$.......|.......
...\/.......\/..\@/..\/..
..\\//.....\\//.....\\//.
.........................

প্রত্যাশিত আউটপুট:

.........................
........@................
.......\|/...........@...
....................\|/..
.........................
.........................
.........................
......@..............@...
.....\|/............\|/..
.........................
.........................
.........................
...\/.......\/.......\/..
..\\//.....\\//.....\\//.
.........................
1 overgrown_plants at 3 costs 3
0 semi-articulated_plants at 4 costs 0
2 mutant_plants at 5 costs 10
2 dollars at 0 costs 0
3 stones at 1 costs 3
total cost 16

আমরা কি প্রতিটি অযাচিত আইটেমের বাউন্ডিং বক্সটি সঠিক বলে ধরে নিতে পারি? অর্থাৎ, আইটেমের বর্ণনায় কোনও সীমানা পুরোপুরি বিন্দু নয়?
জন ডিভোরাক

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

শামুকটি পাশাপাশি বিভিন্ন দিকে ক্রল হবে? \@এবং @/উদাহরণস্বরূপ .. বা তারা চিরকাল পশ্চিম দিকে নির্দেশ করতে বাধ্য?
হান সোলোন

@ সিকডাইমেনশন অযাচিত আইটেমগুলি কেবল বর্ণিত হিসাবে ঠিক মিলে যাওয়া উচিত, স্বতন্ত্র ঘূর্ণন এবং ফ্লিপগুলি মিলে যাওয়া উচিত নয়। এটি শামুকটি অন্য দিকে ক্রল হওয়ার সম্ভাবনাটি হ্রাস করে না, তবে উদাহরণের মধ্যে সেগুলি সরিয়ে দেওয়ার জন্য কাউকে অর্থ প্রদান করা হচ্ছে না।
ভিজ্যুমেলন

উত্তর:


3

পার্ল - 636

অবশ্যই আরও কিছু গল্ফিং করা যেতে পারে। এবং সম্ভবত এটি আরও ভাল উপায়।

<>;while(<>){if(/ /){chomp;push@v,$_}else{$t.=$_}}for(@v){r(split/ /)}say$t.$y."total cost $u";sub r{my($e,$w,$c,$h,$z)=@_;($i,$f,$q,$d)=(1,0,0,"."x$e);@m=($c=~/($d)/g);@l=split/\n/,$t;while($i>0){($g,$j)=(1,0);for(0..$#l){if($j==0&&$l[$_]=~/^(.*?)\.\Q$m[$j]\E\./){$j++;$l="."x length$1}elsif($j<@m&&$l[$_]=~/^$l\.\Q$m[$j]\E\./){$j++}elsif($j>0){$l[$_-1]=~s!.\Q$m[$j-1]\E.!" ".$m[$j-1]=~s/\./ /gr." "!e;($j,$g)=(0,0)}if($j==@m){$k=$j;for($f=$_;$f>$_-$j;$f--){$k--;$o="."x length$m[$k];$l[$f]=~s/^($l)\.\Q$m[$k]\E\./$1.$o./}($g,$j)=(0,0);$q++}}if($g){$i--}}$t=join("\n",@l)."\n";$t=~s/ /./g;$p=$z*$q;$u+=$p;$y.="$q $h at $z costs $p\n"}

-Cইউরো পরিচালনা করতে পতাকাটির জন্য 635 টি অক্ষর +1 ।

আপনার যদি ইনপুট সঞ্চিত থাকে তবে input.txtআপনি এটি দিয়ে চালাতে পারেন:

cat input.txt | perl -C -E'<>;while(<>){if(/ /){chomp;push@v,$_}else{$t.=$_}}for(@v){r(split/ /)}say$t.$y."total cost $u";sub r{my($e,$w,$c,$h,$z)=@_;($i,$f,$q,$d)=(1,0,0,"."x$e);@m=($c=~/($d)/g);@l=split/\n/,$t;while($i>0){($g,$j)=(1,0);for(0..$#l){if($j==0&&$l[$_]=~/^(.*?)\.\Q$m[$j]\E\./){$j++;$l="."x length$1}elsif($j<@m&&$l[$_]=~/^$l\.\Q$m[$j]\E\./){$j++}elsif($j>0){$l[$_-1]=~s!\Q$m[$j-1]\E!$m[$j-1]=~s/\./ /gr!e;($j,$g)=(0,0)}if($j==@m){$k=$j;for($f=$_;$f>$_-$j;$f--){$k--;$o="."x length$m[$k];$l[$f]=~s/^($l)\.\Q$m[$k]\E\./$1.$o./}($g,$j)=(0,0);$q++}}if($g){$i--}}$t=join("\n",@l)."\n";$t=~s/ /./g;$p=$z*$q;$u+=$p;$y.="$q $h at $z costs $p\n"}'

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

BEGIN { # These are the features we get with -C and -E flags
    $^H{'feature_unicode'} = q(1); # -C gives us unicode
    $^H{'feature_say'} = q(1); # -E gives us say to save 1 character from print
    $^H{'feature_state'} = q(1);
    $^H{'feature_switch'} = q(1);
}
<ARGV>; # throw away the first line
while (defined($_ = <ARGV>)) { # read the rest line by line
    if (/ /) { # if we found a space (the garden doesn't have spaces in it)
        chomp $_; # remove the newline
        push @v, $_; # add to our array
    }
    else { # else, we construct the garden
        $t .= $_;
    }
}
foreach $_ (@v) { # call the subroutine r by splitting our input lines into arguments
    r(split(/ /, $_, 0)); # the arguments would be like r(3,2,".R.\|/","rouge_flower",3)
}
say $t . $y . "total cost $u"; # print the cost at the end

# this subroutine removes weeds from the garden and counts them
sub r {
    BEGIN {
        $^H{'feature_unicode'} = q(1);
        $^H{'feature_say'} = q(1);
        $^H{'feature_state'} = q(1);
        $^H{'feature_switch'} = q(1);
    }
    my($e, $w, $c, $h, $z) = @_; # get our arguments
    ($i, $f, $q, $d) = (1, 0, 0, '.' x $e); # initialize some variables
    @m = $c =~ /($d)/g; # split a string like this .R.\|/ into .R. and \|/
    @l = split(?\n?, $t, 0); # split the garden into lines to process line by line
    while ($i > 0) {
        ($g, $j) = (1, 0);
        foreach $_ (0 .. $#l) { # go through the garden
            if ($j == 0 and $l[$_] =~ /^(.*?)\.\Q$m[$j]\E\./) { # this matches the top part of the weed. \Q and \E make it so the weed isn't intepreted as a regex. Capture the number of dots in front of it so we know where it is
                ++$j;
                $l = '.' x length($1); # this is how many dots we have
            }
            elsif ($j < @m and $l[$_] =~ /^$l\.\Q$m[$j]\E\./) { # capture the next line
                ++$j;
            }
            elsif ($j > 0) { # if we didn't match we have to reset
                $l[$_ - 1] =~ s[.\Q$m[$j - 1]\E.][' ' . $m[$j - 1] =~ s/\./ /rg . ' ';]e; # this line replaces the dots next to the weed and in the weed with spaces
                # to mark it since it didn't work but the top part matches
                # that way when we repeat we go to the next weed
                ($j, $g) = (0, 0);
            }
            if ($j == @m) { # the whole weed has been matched
                $k = $j;
                for ($f = $_; $f > $_ - $j; --$f) { # remove the weed backwards line by line
                    --$k;
                    $o = '.' x length($m[$k]);
                    $l[$f] =~ s/^($l)\.\Q$m[$k]\E\./$1.$o./; 
                }
                ($g, $j) = (0, 0);
                ++$q;
            }
        }
        if ($g) {
            --$i; # all the weeds of this type are gone
        }
    }
    $t = join("\n", @l) . "\n"; # join the garden lines back together
    $t =~ s/ /./g; # changes spaces to dots 
    $p = $z * $q; # calculate cost
    $u += $p; # add to sum
    $y .= "$q $h at $z costs $p\n"; #get message
}

উন্নতি প্রস্তাব নির্দ্বিধায়!


ভাল কাজ, এবং আমি ভয় পাচ্ছি যে আমি পাপ করেছি, আমি নির্দিষ্ট করে দিয়েছি যে ফ্লাওয়ারবেডটি ASCII হবে, এবং তারপরে সমস্ত উত্সাহিত হয়ে ইউনিকোডকে উদাহরণে রাখবে - আমি উদাহরণটি পরিবর্তন করব যাতে এটি কেবল ASCII, কাজ করার জন্য দুঃখিত আপনি.
ভিজ্যুমেলন

1
@ ভিজুয়ালমেলন ইউনিকোডের সাথে কাজ করার জন্য কীভাবে ওয়ান-লাইনার পাবেন তা শিখতে আকর্ষণীয় ছিল। আমি এর -Cআগে পতাকা সম্পর্কে জানতাম না । এটি যেহেতু সামঞ্জস্যপূর্ণ হওয়ার জন্য আমি এটি সেখানে রেখে দেব কারণ এটি কেবলমাত্র 1 টি চরিত্রের পার্থক্য।
hmatt1

0

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

    from re import*
E=input()
W,H,C=map(int,E[0].split())
B,T,O='\n'.join(E[~H:]),0,''
for L in E[1:~H]:
 w,h,s,n,c=L.split();w,h,c=map(int,(w,h,c));r,t='.'*(w+2),0;a=[r]+['.%s.'%s[i:i+w]for i in range(0,w*h,w)]+[r]
 for L in['(%s)'%'\\n'.join('.{%d})%s(.*'%(i,escape(b))for b in a)for i in range(W)]:t+=len(findall(L,B));B=sub(L,r.join('\\%d'%b for b in range(1,h+4)),B,MULTILINE)
 O+='%d %s at %d costs %d\n'%(t,n,c,t*c);T+=t*c
print(B+O+'total cost',T)

ধরে নিই ইনপুটটি স্ট্রিংয়ের তালিকা হিসাবে দেওয়া হবে।


আমি ~Hকৌশলটি পছন্দ করি ; আমি এখন এটি পরীক্ষা করতে পারি না, তবে আমি আজকের পরে এটি করার চেষ্টা করব।
ভিজুয়ালমেলন

আমি এটি সঠিকভাবে চালানোর জন্য পেয়েছি বলে মনে হচ্ছে না ( ValueError: not enough values to unpack (expected 3, got 1), পাইথন ৩.6..6); আপনি কীভাবে টিআইও লিঙ্ক বা এটি চালাতে পারেন তার কিছু বিবরণ সরবরাহ করতে পারেন। আমি মনে করি এটি ইনপুটটি সমস্ত এক লাইনেই ধরে নিয়ে নিয়মগুলি বাঁকানো হতে পারে, তবে আমি প্রশ্নটিতে সে সম্পর্কে সম্পূর্ণ পরিষ্কার ছিলাম না তাই আমি অভিযোগ করব না।
ভিজুয়ালমেলন

@ ভিজুয়ালমেলন - বাহ, আমি সম্ভবত কোনও কিছু ভুলভাবে কপি / পাস্তা করেছি। আমি কর্মক্ষেত্রে টিআইওতে যেতে পারছি না, তাই আমি আমার কাজটি যাচাই করব এবং আজকের পরে একটি লিঙ্ক পোস্ট করব।
ট্রিগারনমেট্রি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.