พรรค Laser Mirror Portal


27

บอร์ด 2D จะมีวัตถุดังต่อไปนี้:

  • ^, >, vหรือ<: เลเซอร์อีซีแอลหันขึ้นขวาลงหรือซ้ายตามลำดับ อาจมีมากกว่าหนึ่ง เลเซอร์จะเดินทางเป็นเส้นตรงในพื้นที่ว่าง (พื้นที่ว่างจะแสดงด้วยจุด.) เลเซอร์ไม่ผ่านตัวปล่อย
  • *: เป้าหมาย เลเซอร์ผ่านเป้าหมาย อาจมีมากกว่าหนึ่ง

บอร์ดอาจมีวัตถุต่อไปนี้:

  • @: ผนังทึบ เลเซอร์จะไม่ผ่านที่นี่
  • \: ตัวสะท้อนแสงเอนซ้าย เปลี่ยนทิศทางของเลเซอร์ตามตารางต่อไปนี้:

    Direction laser is travelling     Direction of laser after hitting reflector
    Up                                Left
    Right                             Down
    Down                              Right
    Left                              Up
    

    มันควรจะเป็นสัญชาตญาณของการสะท้อนแสง แค่คิดว่าพวกเขาเป็นกระจกสองด้านจริงและทิศทางควรชัดเจน

  • /: ตัวสะท้อนแสงเอนด้านขวา เปลี่ยนทิศทางของเลเซอร์ตามตารางต่อไปนี้:

    Direction laser is travelling     Direction of laser after hitting reflector
    Up                                Right
    Right                             Up
    Down                              Left
    Left                              Down
    
  • 1, 2, 3... 9: เป็นพอร์ทัล หมายเลขบ่งบอกถึงช่องทางของพอร์ทัล - จะมีสองพอร์ทัลที่แน่นอนของช่องเดียวกัน (ตัวอย่างเช่นจะไม่มีสามพอร์ทัล1) พอร์ทัลเปลี่ยนตำแหน่งของเลเซอร์เป็นตำแหน่งของพอร์ทัลอื่นของช่องทางเดียวกัน ตัวอย่างเช่น

    >     1     @     1     *
    

    เลเซอร์จะยิงไปที่เป้าหมายเพราะเมื่อกระทบกับวัตถุแรก1มันจะถูกเคลื่อนย้ายไปยังตำแหน่งที่สอง1ในอีกด้านหนึ่ง เลเซอร์รักษาทิศทางเดียวกับที่พวกเขาเคยทำมาก่อน

    พอร์ทัลจะไม่ส่งผ่านทางไกลเลเซอร์พอร์ทัลของช่องที่แตกต่างกัน (เช่นจะไม่ส่งผ่านทางไกลเลเซอร์ไปยัง19

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

นี่คือกรณีทดสอบบางส่วน:

  1. อินพุต

    >....\
    ..*...
    >./../
    ..*...
    

    เอาท์พุต

    True
    
  2. อินพุต

    >..........\
    1........../
    2..........1
    3..........2
    4..........3
    5..........4
    6..........5
    7..........6
    8..........7
    9..........8
    *..........9
    

    เอาท์พุต

    True
    
  3. อินพุต

    >.@............*
    >..@...........*
    >...@..........*
    >....@.........*
    >.....@........*
    >...*..@........
    >.......@......*
    

    เอาท์พุต

    False
    
  4. อินพุต

    ../\.
    >./**
    

    เอาท์พุต

    False
    
  5. อินพุต

    /.......*.......\/3.....
    @..............//\.\....
    *.............2\.1\/\...
    \..............///.....<
    .........*...//\\/.....\
    >.............\.1.///.4.
    4.......*/...\2\/3/\/..^
    

    เอาท์พุต

    True
    
  6. อินพุต

    vvvvvvvvvvvvvvvvv
    \\\\\\\\\\\\\\\\\
    /////////////////
    \\\\\\\\\\\\\\\\\
    /////////////////
    \\\\\\\\\\\\\\\\\
    /////////////////
    *****************
    

    เอาท์พุท (สังเกตเป้าหมายที่ด้านขวาสุด)

    False
    

มันจะไม่สมเหตุสมผลหรือไม่ถ้าตัวสะท้อนแสงด้านขวา (/) เปลี่ยนทิศทางของลำแสงเลเซอร์จากซ้าย (←) เป็นลง (↓)?
ossifrage คลื่นไส้

@squeamish ossifrage ฉันขอโทษฉันไม่เข้าใจคำถามของคุณ ซึ่งสะท้อนให้เห็นถึงกฎบนโต๊ะสะท้อนซ้ายพิงที่คุณคิดว่าไม่ถูกต้อง?
Absinthe

ฉันคิดว่าคุณถูกทิ้งและผสมปนเปกันไปแล้ว
squeamish ossifrage

1
จะเกิดอะไรขึ้นถ้าเลเซอร์มาถึงเส้นตาราง
DavidG

2
@DavidG ไม่มีอะไรเลยหรือมันกลับมาในแบบที่มันเป็น (สิ่งเหล่านี้เทียบเท่าในกรณีนี้) มันไม่ 'ล้อมรอบ' ดังที่เห็นได้จากตัวอย่างที่ 6
Dennis Jaheruddin

คำตอบ:


8

งูหลาม 310 302 287 278 277 260

ไม่แตกต่างจากโพสต์ Python ที่มีอยู่อย่างสิ้นเชิง แต่ฉันคิดว่ามีหนึ่งหรือสองเทคนิคที่น่าจดจำ นอกจากนี้ยังจัดการ "ไม่ยุติ" 1>1การป้อนข้อมูลเช่น แก้ไข : โอ๊ะโอ! ตัวปล่อยบล็อคเลเซอร์

def t(b):
 w=len(b[0])+1;B=list('@'*w+'@'.join(b));i=l=len(B);C="<>^v@"
 while i:
    j=l-i;i-=1;d=C.find(B[j]);c='.'
    while c not in C:
     if'+'>c:B[j]='.'
     if'0'<c<C:j=(B*2).index(c,j+1)%l
     elif'.'<c:d^=2+(c<C)
     j-=[1,-1,w,-w,j][d];c=B[j%l]
 return'*'not in B

t รับรายการสตริง (บรรทัดอินพุต) และส่งคืนผลลัพธ์บูลีน

นี่คือโค้ด gif ที่ดีที่มีการแปลลง:

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข : Gif Awsome มารยาทของ Will ขอขอบคุณ!


ข้อมูลจำเพาะระบุว่า"เลเซอร์ไม่ผ่านตัวปล่อย" ดังนั้น1>1จะยุติ ฉันไม่ได้รับสามารถที่จะหาบางสิ่งบางอย่างที่ไม่ได้บอกเลิก แต่ผมไม่ได้ใช้ความพยายามมากเป็นมันและสวยมากคิดว่ามันไม่ได้เกิดขึ้นสำหรับการดำเนินงานของฉัน แน่นอนฉันจะพิจารณาอีกครั้งหากมีคนสามารถเสนอได้
VisualMelon

4
@VisualMelon: กฎเป็นแบบสมมาตรยกเว้นที่จุดที่เลเซอร์เกิดหรือตายซึ่งหมายความว่าทุกอย่างจะต้องยุติ (เนื่องจากคุณสามารถติดตามมันกลับไปยังจุดที่มันเกิดขึ้นได้โดยไม่ซ้ำกันและผู้ปล่อยไม่สามารถมีส่วนร่วมได้ ของวง)
คาห์

@Micah ฮิฮิขอบคุณสำหรับคำอธิบายที่เหมาะสมเช่นผมบอกว่าผมไปกับสัญชาตญาณและไม่ต้องกังวลกับมันมากขอบคุณสำหรับการวางเครื่องมืออื่นในกล่องของฉัน
VisualMelon

Yup ผมอ่านมันผิด
Ell

หมวกออกไป Ell! ทำได้ดีมาก ฉันคิดว่าคุณสามารถโกนหนวดได้อีกสองสามไบต์โดยใช้ความจริงที่.find(d)ส่งกลับค่า -1 หากไม่พบ ถ้าคุณเอาif-1<d:คำสั่งและแทนที่จะทำj+=[-1,1,w,-w,-i][d]ที่ด้านบนของห่วงขณะที่ไม่พบ -1 จะกลายเป็นเพิ่มล่าสุดองค์ประกอบในอาร์เรย์ที่jซึ่งจะทำให้j0 ซึ่งที่เรารู้คือ@... ?
Will

7

Perl, 647

นี่เป็นครั้งแรกที่ฉันพยายามเล่นกอล์ฟและฉันค่อนข้างเขินที่ไม่ได้คะแนน C # แต่ฉันคิดว่ามันน่าสนใจ (หรือสนุกหรือแค่ร้ายกาจ) เพื่อทำสิ่งต่างๆทั้งหมดในฐานะ ชุดของการแทน regex (ฉันก็คิดว่ามันคงจะสนุกที่ได้แปรง Perl แต่ตอนท้ายฉันเสียใจอย่างมากที่ไม่ได้ใช้มันใน Ruby หรือ Python)

ฉันไม่ได้ทำการทดสอบมากนัก แต่ฉันคิดว่ามันควรจะจัดการทุกกรณี

ตารางการป้อนข้อมูลผ่านทาง STDIN ต้องมีการขึ้นบรรทัดใหม่อย่างน้อยหนึ่งรายการ (เช่นแถวเดียวที่ไม่มีบรรทัดใหม่จะไม่ทำงาน)

%s=(d,'[|+#$vk%ZX]',u,'[|+#$^W%KX]',r,'[-G+#>k%KX]',l,'[-G+#<W%ZX]');%o=(d,'[-.*G/k\\\\Z',u,'[-.*G/W\\\\K',r,'[|.*$\\\\/kK',l,'[|.*$\\\\/ZW');for$d(d,u,r,l){$o{$d}.='123456789qwertyuio]'}%u=(d,'.|-+*$G#/Wk%\KZX',u,'.|-+*$G#/kW%\ZKX',r,'.-|+*G$#/Wk%\ZKX',l,'.-|+*G$#/kW%\KZX');@q=split//,"qwertyuio";local$/;$_=<STDIN>;for$i(1..9){$m{$i}=$q[$i-1];$m{$m{$i}}=$i;s/$i/$m{$i}/e}/.*?\n/;$l='.'x((length$&)-1);do{$c=0;for$d(d,u,r,l){%p=(d,"(?<=$s{d}$l)$o{d}",u,"$o{u}(?=$l$s{u})",r,"(?<=$s{r})$o{r}",l,"$o{l}(?=$s{l})");%h=split//,$u{$d};$c+=s!$p{$d}!$h{$&}||($v=$&,($o{$d}=~s/$v// && $s{$d}=~s/]/$m{$v}]/),$v)!es}}while($c);print/\*/?"False\n":"True\n"

คำอธิบาย: โค้ดจะอัพเดตสตริงกริดอย่างซ้ำ ๆ ตามที่เลเซอร์ส่งผ่าน -แสดงให้เห็นถึงเลเซอร์แนวนอน|เลเซอร์แนวตั้ง+เลเซอร์ข้ามกระจกด้วยเลเซอร์ใหญ่ปิดด้านบนK\k/กระจกด้วยเลเซอร์ใหญ่ปิดด้านล่าง,Z\กระจกด้วยเลเซอร์ใหญ่ปิดด้านล่างและกระจกด้วยเลเซอร์ใหญ่ปิด ด้านบน. เป็นกระจกที่มีเลเซอร์ทั้งสองด้านในขณะที่เป็นกระจกที่มีเลเซอร์ทั้งสองด้าน (สิ่งเหล่านี้ต้องตรงตามตัวพิมพ์ใหญ่ - เล็ก) ฉันพยายามเลือกตัวอักษรที่ค่อนข้างเหมาะสม - ตัวอย่างเช่นและW/%/X\kKเป็นตัวเลือกที่ค่อนข้างชัดเจน - แต่น่าเสียดายที่เอฟเฟกต์นั้นไม่มีประโยชน์จริงๆ ฉันควรใส่ข้อมูลนี้ลงในตารางจริงๆ แต่ตอนนี้ฉันหมดแรงไปแล้ว)

การจัดการพอร์ทัลในวิธีเดียวกัน (เช่นการกำหนดตัวเลขแต่ละตัวให้มีชุดอักขระพิเศษตามตำแหน่งเลเซอร์อินพุต / เอาท์พุตที่เป็นไปได้) จะต้องมี 144 อักขระ (รวมถึงต้นฉบับ 9) ดังนั้นเมื่อเลเซอร์เข้าสู่พอร์ทัล "อินพุต" ฉันเพิ่มอักขระพอร์ทัล "เอาท์พุท" ในชุดของอักขระที่เปล่งแสงเลเซอร์ในทิศทางที่เหมาะสม (สิ่งนี้ต้องการความแตกต่างระหว่างอินพุตและเอาต์พุตพอร์ทัลฉันใช้ตัวอักษรqwertyuioสำหรับสิ่งนี้)

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

# Throughout, d,u,r,l represents lasers going down, up, left, or right
# `sources` are the character classes representing laser "sources" (i.e. any
# character that can, on the next round, cause a laser to enter the space
# immediately adjacent to it in the proper direction)
%sources=(d,'[|+#$vk%ZX]',u,'[|+#$^W%KX]',r,'[-G+#>k%KX]',l,'[-G+#<W%ZX]');
# `open` characters will not block a laser
%open=(d,'[-.*G/k\\\\Z',u,'[-.*G/W\\\\K',r,'[|.*$\\\\/kK',l,'[|.*$\\\\/ZW');
# One of each portal is changed into the corresponding letter in `qwertyuio`.
# At the start, each portal is 'open' and none of them is a source.
for$d(d,u,r,l){$open{$d}.='123456789qwertyuio]'}
# A mapping of 'open' characters to the characters they become when a laser
# goes through them. (This is used like a hash of hashes; see the assignment
# of `%h` below.)
%update=(d,'.|-+*$G#/Wk%\KZX',
    u,'.|-+*$G#/kW%\ZKX',
    r,'.-|+*G$#/Wk%\ZKX',
    l,'.-|+*G$#/kW%\KZX');
@q=split//,"qwertyuio";
local$/;$_=<STDIN>;
for$i(1..9){
    $m{$i}=$q[$i-1];
    $m{$m{$i}}=$i;
    s/$i/$m{$i}/e}
print "After substituting portals:\n";
print;
print "\n";
# Find the number of characters in each line and create a string of `.`'s,
# which will be used to correlate characters above/below one another in the
# grid with each other.
/.*?\n/;
$l='.'x((length$&)-1);
do{
    $changes=0;
    for$d(d,u,r,l){
        # `patterns` is a mapping from each direction to the regex representing
        # an update that must occur (i.e. a place where a laser must progress).
        # Each pattern is either a lookahead or lookbehind plus the necessary
        # "open" character class.
        %patterns=(d,"(?<=$sources{d}$l)$open{d}",
            u,"$open{u}(?=$l$sources{u})",
            r,"(?<=$sources{r})$open{r}",
            l,"$open{l}(?=$sources{l})");
        %h=split//,$update{$d};
        # Match against the pattern for each direction. Note whether any
        # matches were found.
        $changes+=s!$patterns{$d}!
            # If the "open" character for a map is in the `update` map, return
            # the corresponding value. Otherwise, the "open" character is a
            # portal.
            $h{$&} || ($v=$&,
                        # For portals, remove the input portal from the
                        # proper "open" list and add the output portal to
                        # the proper "source" list.
                       ($open{$d}=~s/$v// && $sources{$d}=~s/]/$m{$v}]/),
                       $v)
                    # This whole substitution should allow `.` to match
                    # newlines (see the definition of `$l` above), and the
                    # replacement must be an expression rather than a string
                    # to facilitate the portal logic. The `g` allows multiple
                    # updates per "frame"; it is left out of the golfed code.
                    !egs
    }
    # Print the next "frame".
    print;
    print "\n";
# Continue updating until no "open" spaces are found.
}while($changes);
# Print whether `*` is still present in the input.
print/\*/?"False\n":"True\n"

ฉันทดลองวิธีการนี้ (โดยใช้อาร์เรย์ bool แทนที่จะเป็น regex) ใน Python แต่ไม่สามารถเข้าใกล้จุดเล็ก ๆ นี้ได้ ฉันคิดว่านี่เป็นวิธีที่กระตุ้นความคิดจริงๆ! ความพยายามของฉันได้รับอิทธิพลผิด headedly โดยcatpad.net/michael/aplกับ vid ดีyoutube.com/watch?v=a9xAKttWgP4และpetercollingridge.co.uk/blog/python-game-of-life-in-one-line
จะ

1
@ จะขอบคุณ! ฉันตระหนักดีว่าความพยายามของฉันคล้ายกันกับ GoL ในช่วงเวลาที่ฉันทำงานออกไปว่ามันเป็นไปได้ที่จะใช้ตัวละครที่แตกต่างกันสำหรับการผสมผสานของเลเซอร์ที่เป็นไปได้ในการเข้าและออกจากพอร์ทัล ฉันคิดว่าฉันสามารถกำจัดตัวละครออกไปได้อีกสองสามตัว แต่ ... นี่ชัดเจนว่าไม่ใช่วิธีที่ดีที่สุด!
Kyle Strand

นอกจากนี้ถ้าใครรู้วิธีที่ดีกว่าที่จะจัดการกับสามหนี `` 's ในชั้นเรียนตัวอักษรในไม่กี่บรรทัดแรกว่าจะน่ารัก ...
ไคล์ Strand

6

Python 338 351

def t(b):
 L=len;w=L(b[0])+3;b=list("@"*w+"@@".join(b)+"@"*w);w-=1;I=b.index
 for i in range(L(b)):
  c=b[i];d={"^":-w,"<":-1,">":1,"v":w}.get(c)
  if d:
   while c!='@':
    i+=d;c=b[i]
    if c=='*':b[i]='.'
    elif c in '/\\':d={-w:-1,w:1,1:w,-1:-w}[d]*(-1 if c=='/' else 1)
    elif c>'0':i+=I(c)-i or I(c,i+1)-i
 return "*" not in b

เวอร์ชันที่ไม่ระบุของฉันจริง ๆ แล้วเป็นเส้นทางเลเซอร์บนกระดานซึ่งค่อนข้างสวย:

>-+--\
..X..|
>-/--/
..X...

>----------\
1----------/
2----------1
3----------2
4----------3
5----------4
6----------5
7----------6
8----------7
9----------8
X----------9

>-@............*
>--@...........*
>---@..........*
>----@.........*
>-----@........*
>---X--@........
>-------@......*

/-------X+------\/3.....
@........|.....//\+\....
X........|....2\+1\/\...
\--------+----+///+++--<
.........X...//\\/+++--\
>--------+---+\+1+///-4|
4-------X/...\2\/3/\/..^

vvvvvvvvvvvvvvvvv
\\\\\\\\\\\\\\\\\
/////////////////
\\\\\\\\\\\\\\\\\
/////////////////
\\\\\\\\\\\\\\\\\
/////////////////
XXXXXXXXXXXXXXXX*

def debug(board,x,y):
    emit_dir = {
        "^":    ( 0, -1),
        "<":    (-1,  0),
        ">":    ( 1,  0),
        "v":    ( 0,  1),
    }
    class PortalException(Exception): pass
    xdir, ydir = emit_dir[board[y][x]]
    while True:
        # print "step (%d, %d) (%d, %d)" % (x, y, xdir, ydir)
        x += xdir
        y += ydir
        if y < 0 or y >= len(board) or x < 0 or x >= len(board[y]):
            return
        ch = board[y][x]
        if ch == '/':
            xdir, ydir = -ydir, -xdir
        elif ch == '\\':
            xdir, ydir = ydir, xdir
        elif ch in '@^><v':
            return
        elif ch == '*':
            board[y] = board[y][:x] + 'X' + board[y][x+1:]
        elif ch in '.-|':
            ch = ('-' if xdir else '|') if ch == '.' else '+'
            board[y] = board[y][:x] + ch + board[y][x+1:]
        elif ch in '123456789':
            try:
                for r in range(len(board)):
                    for c in range(len(board[r])):
                        if board[r][c] == ch and (r != y or c != x):
                            x, y = c, r
                            raise PortalException()
                raise Exception("could not find portal %s (%d,%d)" % (ch, x, y))
            except PortalException:
                pass

5

C # - 515 414 400 ไบต์

เสร็จสิ้นโปรแกรม C # ไม่มีเอาต์พุตที่ดีอย่าง Will's ทำงานโดยไปตามเส้นทางเลเซอร์สำหรับแต่ละอันที่ปล่อยออกมาและเก็บอาร์เรย์ของเซลล์ที่เราเคยเยี่ยมชมเพื่อให้เราสามารถตรวจสอบว่าเราได้ไปเยี่ยมดาวทั้งหมดในตอนท้าย แก้ไข: สตริจำนวนไบต์ขนาดใหญ่โดยการทำทุกอย่าง 1D และโดยใช้ถ่านแทนการ int เพื่อจัดเก็บถ่านปัจจุบัน

w0lf เตือนฉันว่าฉันมีการใช้ for-loop ด้านล่างตรงกลางโค้ดของฉันดังนั้นฉันจึงคิดว่าฉันควรใช้ความพยายามครั้งสุดท้ายและทำให้มันใช้งานได้ดีขึ้น วงเล็บปีกกา ฉันจะไม่แกล้งทำเป็นชอบการยุบวงที่สองของวงรหัสตอนนี้มันยุ่งเหยิงอย่างน่ากลัว แต่มันช่วยสองสามไบต์ ในกระบวนการฉันเขียนการจัดการพอร์ทัลอีกครั้ง ฉันยังพบวิธีที่สั้นกว่าสำหรับการดำเนินการ "ย้าย" ด้วยการซ้อนมากกว่าการดำเนินการตามเงื่อนไขแบบรวม

รหัส Golfed:

using C=System.Console;class P{static void Main(){var S=C.In.ReadToEnd().Replace("\r","");int W=S.IndexOf('\n')+1,l=S.Length,i=l,d,m,n;var M=new int[l];for(char c;i-->0;)for(d="^<v>".IndexOf(c=S[m=i]);c>14&d>-1;d=(m+=d==2?W:d>0?d-2:-W)>=0&m<l&&"@^<v>".IndexOf(c=S[m])<0?d:-1)for(d=c==47?3-d:c==92?d^1:d,M[n=m]=1;c%49<9&&(m=S.IndexOf(c,m+1))==n|m<0;);for(;l-->0;)W*=S[l]==42?M[l]:1;C.WriteLine(W>0);}}

รหัส golfed น้อยกว่า:

using C=System.Console;

class P
{
    static void Main()
    {
        var S=C.In.ReadToEnd().Replace("\r",""); // read the grid, remove pesky carriage returns
        int W=S.IndexOf('\n')+1,l=S.Length,i=l,d,m,n; // find "width"
        var M=new int[l]; // defaults to 0s

        for(char c;i-->0;) // for each cell

            for(d="^<v>".IndexOf(c=S[m=i]); // find initial direction, if any
                c>14&d>-1; // loop only if we have direction
                d=(m+=d==2?W:d>0?d-2:-W) // move (after iteration)
                >=0&m<l&&"@^<v>".IndexOf(c=S[m])<0?d:-1) // terminate if we hit something or go off edge

                for(d=c==47?3-d:c==92?d^1:d, // mirrors
                    M[n=m]=1; // we have seen this spot
                    c%49<9&&(m=S.IndexOf(c,m+1))==n|m<0;); // portals

        for(;l-->0;) // for each cell
            W*=S[l]==42?M[l]:1; // if *, then mul by whether seen

        C.WriteLine(W>0);
    }
}

รหัสการจัดการพอร์ทัลใหม่ใช้ประโยชน์จากความจริงที่ว่าฟังก์ชั่น String.IndexOf ส่งกลับอย่างมีความสุข -1 (เช่นไม่พบตัวอักษร) ถ้าคุณขอให้มันเริ่มมอง 1 ตัวอักษรเกินสตริง (ข้อยกเว้นถ้าคุณขอให้มันเริ่มต้นเพิ่มเติม นี่เป็นข่าวสำหรับฉัน แต่สะดวกมากในกรณีนี้


+1 การเล่นกอล์ฟที่ยอดเยี่ยม! ฉันแค่คิดถึงกลอุบาย: คุณสามารถหยิบm+=(d>0?d-2:0)+(d<3?d-1:0)*W;มันแล้วผลักเข้าไปในforนั้นได้เช่นนี้for(char c;i-->0;m+=(d>0?d-2:0)+(d<3?d-1:0)*W). ด้วยวิธีนี้คุณจะประหยัดถ่านหนึ่งอันเพราะคุณจะสูญเสียอัฒภาค
Cristian Lupascu

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