โปรแกรมเมอร์ของการ์เด้น


12

โปรแกรมเมอร์ของการ์เด้น

ในฐานะนักพัฒนาซอฟต์แวร์มืออาชีพคุณไม่สามารถเสี่ยงที่จะเปิดเผยตัวคุณเองต่อแสงที่ไม่ใช้แสงจากดวงอาทิตย์ แต่คุณมีจุดอ่อนสำหรับดอกไม้และต้องการให้สวนของคุณอยู่ในสภาพดีตลอดปี

ด้วยเหตุนี้จึงมีการว่าจ้างนักทำสวนในแต่ละเดือนเพื่อจัดระเบียบสวนดอกไม้ที่เชิงบ้านของคุณ อย่างไรก็ตามคุณต้องแน่ใจว่าคนสวนกำลังทำงานของเขาอย่างถูกต้องและหาเงินที่เหมาะสมสำหรับเพื่อนที่ทำงานหนัก โดยธรรมชาติแล้วโซลูชันซอฟต์แวร์ที่ดีที่สุด

อินพุต

โปรแกรมของคุณจะได้รับการป้อนข้อมูลป้อนดอกไม้ที่ปรากฏในปัจจุบันและรายละเอียดของรายการที่ต้องลบออก โปรแกรมจะต้องส่งออกสวนที่ปราศจากความยุ่งเหยิงและพิมพ์รายละเอียดของชาวสวนจ่าย อินพุตอาจมาจาก STDIN หรือเป็นอาร์กิวเมนต์บรรทัดคำสั่งเดียว

บรรทัดแรกของการป้อนข้อมูลเป็นรูปแบบ

width height unwanted_item_type_count

โดยที่widthความกว้างของ flowerbed heightคือความสูงของ flowerbed (ทั้งในตัวอักษร ASCII) และunwanted_item_type_countบอกคุณว่ามีกี่บรรทัดที่จะมีคำอธิบายของรายการประเภทที่จะลบออกจากสวน

แต่ละบรรทัดสำหรับรายการที่ไม่ต้องการแต่ละประเภทมีรูปแบบ

width height string_representation name fee_per_item

โดยที่widthความกว้างของรายการheightคือความสูงของรายการ (ทั้งในตัวอักษร ASCII) string_representationคือการแสดงสตริงของรายการโดยไม่มีตัวแบ่งบรรทัดnameเป็นตัวระบุสำหรับประเภทรายการ (ช่องว่างจะถูกแทนที่ด้วยขีดล่าง) และfee_per_itemคือเท่าใดคนสวนต้องจ่ายเงินสำหรับการลบรายการแต่ละประเภท

ตัวอย่างเช่น

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 ของ flowerbed ของความกว้างและความสูงที่กำหนด

เอาท์พุต

ผลลัพธ์ควรเป็น STDOUT หรือทางเลือกอื่นที่เหมาะสมหากภาษาของคุณไม่รองรับ

เอาท์พุทเริ่มต้นด้วยการพิมพ์ออกมาจาก flowerbed แต่มีรายการที่ไม่พึงประสงค์ทั้งหมดออก (แทนที่ด้วยจุด) เพื่อให้คุณสามารถดูว่ามันควรจะปรากฏขึ้นและตรวจสอบสวนได้ทำงาน แต่ละรายการใน flowerbed จะถูกล้อมรอบด้วยสี่เหลี่ยมของจุดและจะเป็นรายการที่ต่อเนื่องกัน (เช่นจะไม่มีจุดแยกอยู่ภายในรายการ) ตัวอย่างเช่น

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

แสดง 2 รายการแยกกัน

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

แสดง 1 รายการ

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

ไม่ถูกต้องเนื่องจากหิน (#) สามารถจับคู่ได้งู (คุณไม่สามารถบอกได้ว่ามันเป็นงู?) ไม่สามารถทำได้เพราะหินนั้นรบกวนการล้อมรอบจุดที่ต้องการ

...
\@.
...

นอกจากนี้ยังไม่ถูกต้องเนื่องจากหอยทากอยู่บนขอบของ flowerbed และขอบจะต้องล้อมรอบด้วยจุดในอินพุตที่ถูกต้อง

หลังจากนี้ควรมีรายชื่อของรายการที่ไม่ต้องการแต่ละประเภทให้นับต้นทุนต่อรายการและต้นทุนสำหรับรายการทั้งหมด (นับ * ต้นทุนต่อรายการ) ในรูปแบบ:

<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

เอาต์พุตต้องถูกยกเลิกโดยการขึ้นบรรทัดใหม่

นี่คือรหัสกอล์ฟอาจเป็นรหัสที่สั้นที่สุดที่จะชนะ

กรณีทดสอบเพิ่มเติม

แก้ไข: สิ่งนี้เคยมี Unicode ซึ่งไม่ได้รับอนุญาตในแปลงดอกไม้ที่ทันสมัยเกินไป สิ่งนี้ได้รับการแก้ไขขออภัยเกี่ยวกับเรื่องนี้

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

เราขอสมมติว่ากล่องที่ จำกัด ของแต่ละรายการที่ไม่ต้องการนั้นแน่นอนหรือไม่ นั่นคือไม่มีเส้นขอบในคำอธิบายของรายการเป็นจุดเต็ม?
John Dvorak

@JanDvorak ใช่ว่าเป็นข้อ จำกัด ที่สมเหตุสมผลพอสมควร ฉันจะเพิ่มเข้าไปในคำถามและฉันจะขอยืมถ้อยคำของคุณในข้อสันนิษฐานว่าคุณจะไม่รังเกียจที่จะทำเช่นนั้น
VisualMelon

หอยทากจะคลานไปในทิศทางที่แตกต่างเช่นกันหรือไม่? \@และ@/ยกตัวอย่าง .. หรือว่าพวกมันจะชี้ไปทางทิศตะวันตกตลอดไป?
Han Soalone

@SickDimension รายการที่ไม่ต้องการควรจับคู่อย่างแม่นยำตามที่อธิบายไว้ไม่ควรจับคู่การหมุนและการพลิกที่แตกต่างกัน สิ่งนี้ไม่ได้ขัดขวางความเป็นไปได้ที่หอยทากจะคลานไปในทิศทางอื่น แต่ไม่มีใครได้รับการจ่ายเงินให้นำมันออกจากตัวอย่าง
VisualMelon

คำตอบ:


3

Perl - 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"}

635 ตัวอักษร + 1 สำหรับการ-Cตั้งค่าสถานะเพื่อจัดการยูโร

หากคุณมีอินพุตที่เก็บไว้ใน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
}

อย่าลังเลที่จะแนะนำการปรับปรุง!


เป็นงานที่ดีและฉันกลัวว่าฉันทำบาปฉันได้ระบุว่า flowerbed จะเป็น ASCII และจากนั้นก็ตื่นเต้นและใส่ Unicode ในตัวอย่าง - ฉันจะเปลี่ยนตัวอย่างเพื่อที่จะเป็นแค่ ASCII ขอโทษที่ทำให้การทำงานสำหรับ คุณ.
VisualMelon

1
@VisualMelon เป็นเรื่องที่น่าสนใจที่จะเรียนรู้วิธีรับหนึ่งซับในการทำงานกับยูนิโค้ด ฉันไม่รู้เกี่ยวกับ-Cธงก่อนหน้านี้ ฉันจะปล่อยให้มันอยู่ในนั้นเพื่อให้เข้ากันได้เพราะมันมีความแตกต่างเพียง 1 ตัวอักษร
hmatt1

0

Python 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ชอบกลอุบาย ฉันไม่สามารถทดสอบได้ในตอนนี้ แต่ฉันจะพยายามทำในภายหลังในวันนี้
VisualMelon

ฉันไม่สามารถเรียกใช้งานได้อย่างถูกต้อง ( ValueError: not enough values to unpack (expected 3, got 1), python 3.6.6); คุณสามารถให้ลิงค์ TIO หรือคำอธิบายเกี่ยวกับวิธีการเรียกใช้ ฉันคิดว่ามันอาจเป็นการดัดกฎโดยสมมติว่าอินพุตอยู่ในบรรทัดเดียว แต่ฉันไม่ชัดเจนเลยในคำถามดังนั้นฉันจะไม่บ่น
VisualMelon

@VisualMelon - อ่าฉันอาจทำสำเนา / พาสต้ามีบางอย่างไม่ถูกต้อง ฉันไปที่ TIO ไม่ได้ดังนั้นฉันจะตรวจสอบงานของฉันและโพสต์ลิงก์ในวันนี้
ตรีโกณมิติ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.