นำทางไปยังฟิลด์ดาวเคราะห์น้อยสำเร็จ


36

บทนำ

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

ด้วยความกลัวต่อชีวิตเทียมของคุณคุณตัดสินใจที่จะเขียนรหัสในภาษาถิ่นของเรือ ( อ่าน: ภาษาโค้ดกอล์ฟที่คุณชื่นชอบ ) โปรแกรมการหลีกเลี่ยงดาวเคราะห์น้อยที่จะตัดสินใจว่าจะใช้เส้นทางใดในเขาวงกต ASCII ของดาวเคราะห์น้อย

อินพุต

Millenium Falcon มีโปรแกรมการแมปดาวเคราะห์น้อยซึ่งให้ข้อมูลคล้ายกับสิ่งนี้:

|   #####           #########  |
| ######  #          ###   #   |
|   # #  #  #  ####   #        |
@              ##    ####       
|#   #   #       ###   ##      |
|##      ##      ####   #  #   |
|####           ##### #   ##   |

แถวบนสุดอยู่ทางด้านซ้ายของเหยี่ยวนกเขาแถวด้านล่างอยู่ทางด้านขวาของเหยี่ยวนกเขาและเสาเป็นตัวแทนของสิ่งที่อยู่ด้านหน้าเรือ

  • แต่ละ#คนเป็นอุปสรรค
  • แต่ละพื้นที่คือพื้นที่ว่างเปล่าที่เรือสามารถบินได้
  • อินพุตมีความสูง 7 อักขระเสมอ นี่เป็นขีดจำกัดความกว้างของการทำแผนที่ดาวเคราะห์น้อย
  • อินพุตมีความยาว 32 อักขระเสมอ (30 สำหรับฟิลด์นั้นและ 2 สำหรับการ จำกัด การเริ่มต้นและสิ้นสุด) นี่เป็นขีดจำกัดความลึกของการทำแผนที่ดาวเคราะห์น้อย แถบแนวตั้ง|ทำเครื่องหมายจุดเริ่มต้นและจุดสิ้นสุดของการทำแผนที่
  • @คือเหยี่ยว มันจะอยู่ในแถวกลางเสมอ (แถวที่ 4) และคอลัมน์แรกในอินพุต
  • พื้นที่ที่เหลือในแถบแนวตั้งในคอลัมน์สุดท้ายคือสถานที่ที่เรือต้องมาถึง มันจะอยู่ในแถวกลางเสมอ (แถวที่ 4) และคอลัมน์สุดท้ายในอินพุต

อินพุตสามารถนำมาเป็นสตริงหลายบรรทัดอาร์เรย์ของสตริงจาก STDIN หรือพารามิเตอร์ฟังก์ชันหรืออ่านจากไฟล์

การซ้อมรบที่เป็นไปได้

คุณถูกติดตามโดย TIE-Fighters ดังนั้นคุณต้องก้าวไปข้างหน้าเสมอ ดังนั้นจึงมีสามวิธีที่เรือสามารถบินได้ในแต่ละขั้นตอน:

  • - ข้างหน้า

  • / ไปข้างหน้าและเลี้ยวซ้าย

  • \ ไปข้างหน้าและเลี้ยวขวา

ตัวอย่างเช่นเหล่านี้เป็นเส้นทางที่ถูกต้อง:

@---

  --
 /  \ /
@    -

   -
  / \
 /   \
@     \

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

เหยี่ยวฟอลคอนล่มหากการเคลื่อนไหวครั้งหนึ่งนำพาให้เรืออยู่ในจุดที่มีสิ่งกีดขวาง ตัวอย่างเช่นการเคลื่อนไหวเหล่านี้นำไปสู่การล่ม:

@-#

@
 \
  #

  #
 /
@

โปรดทราบว่านี่ไม่ใช่ความผิดพลาด:

@-#
  \
   -

เอาท์พุต

คุณต้องส่งออก ASCII ของดาวเคราะห์น้อยเช่นเดียวกับเส้นทางที่ถูกต้องไปยังจุดสิ้นสุด เหยี่ยวจะต้องพิมพ์ที่จุดสิ้นสุดแทนจุดเริ่มต้น

ตัวอย่างเช่นเอาต์พุตที่ถูกต้องสำหรับตัวอย่างอินพุตที่กำหนดก่อนหน้าจะเป็น:

|   #####           #########  |
| ######  #--------  ###   #   |
|   # #  #/ #  ####\  #        |
 ---------      ##  \ #### ----@
|#   #   #       ### \ ## /    |
|##      ##      #### \ #/ #   |
|####           ##### #-- ##   |

เส้นทางของคุณต้องไม่ให้เหยี่ยวชนเท่านั้น ไม่จำเป็นต้องเป็นเส้นทางที่สั้นที่สุด

คุณสามารถสันนิษฐานได้ว่าจะมีเส้นทางที่เป็นไปได้อย่างน้อยหนึ่งเส้นทางไปยังจุดสิ้นสุด

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

กรณีทดสอบ

  • ฟิลด์ดาวเคราะห์น้อยปกติ

    |   #####           #########  |
    | ######  #          ###   #   |
    |   # #  #  #  ####   #        |
    @              ##    ####       
    |#   #   #       ###   ##      |
    |##      ##      ####   #  #   |
    |####           ##### #   ##   |
    

    ผลลัพธ์ที่เป็นไปได้

    |   #####           #########  |
    | ######  #--------  ###   #   |
    |   # #  #/ #  ####\  #        |
     ---------      ##  \ #### ----@
    |#   #   #       ### \ ## /    |
    |##      ##      #### \ #/ #   |
    |####           ##### #-- ##   |
    
  • ฟิลด์ดาวเคราะห์น้อยหลายมิติ

    |# # # # # # # # # # # # # # # |
    | # # # # # # # # # # # # # # #|
    |# # # # # # # # # # # # # # # |
    @ # # # # # # # # # # # # # #   
    |# # # # # # # # # # # # # # # |
    | # # # # # # # # # # # # # # #|
    |# # # # # # # # # # # # # # # |
    

    ผลลัพธ์ที่เป็นไปได้

    |# # # # # # # # # # # # # # # |
    | # # # # # # # # # # # # # # #|
    |# # # # # # # # # # # # # # # |
     -# #-# #-# #-# #-# #-# #-# #--@
    |#\#/#\#/#\#/#\#/#\#/#\#/#\#/# |
    | #-# #-# #-# #-# #-# #-# #-# #|
    |# # # # # # # # # # # # # # # |
    
  • แกนกลางของดาวมรณะ

    |    #    #    #         #     |
    |         #    #    #          |
    |    #    #    #    #    #     |
    @    #    #    #    #    #      
    |    #    #         #    #     |
    |    #    #    #    #    #     |
    |    #         #    #    #     |
    

    ผลลัพธ์ที่เป็นไปได้

    |    #    #    #   --    #     |
    |  ---    #    #  / #\   -     |
    | /  #\   #    # /  # \ /#\    |
     -   # \  #    #/   #  - # ----@
    |    #  \ # ----    #    #     |
    |    #   \#/   #    #    #     |
    |    #    -    #    #    #     |
    
  • สลักดาวมรณะ

    |##############################|
    |##############################|
    |##############################|
    @                               
    |##############################|
    |##############################|
    |##############################|
    

    เอาท์พุต

    |##############################|
    |##############################|
    |##############################|
     ------------------------------@
    |##############################|
    |##############################|
    |##############################|
    
  • ถ้ำดาวเคราะห์น้อย

    |### ##########################|
    |## # ############### ## ######|
    |# ###  ######## ### ## # #####|
    @ ###### ###### ### ## ###      
    |########  ### ### ## #########|
    |########## # ### ## ##########|
    |###########              #####|
    

    ผลลัพธ์ที่เป็นไปได้

    |###-##########################|
    |##/#\############### ##-######|
    |#/###--######## ### ##/#\#####|
     -######\###### ### ##/###-----@
    |########--### ### ##/#########|
    |##########\# ### ##/##########|
    |###########--------      #####|
    

เกณฑ์การให้คะแนน

R2D2 กำลังยุ่งอยู่กับการว่ายน้ำในหนองน้ำดังนั้นคุณจะต้องเขียนโปรแกรมควบคุม Falcon ด้วยตัวเองซึ่งน่าเบื่อ ดังนั้นที่สั้นที่สุดชนะรหัส


@DJMcMayhem: เทคนิคบรรทัดแรกคือ "การแนะนำ";)
อเล็กซ์ A.

2
ฉันเรียงลำดับว่ามันควรจะดูจากตัวอย่าง แต่การเข้ารหัสของการเคลื่อนไหวยังค่อนข้างสับสนสำหรับฉัน หากคุณมองหาตัวอย่างที่ "ตัวอย่างหลายมิติ" ยกเว้นการย้ายครั้งแรก / ครั้งสุดท้ายคุณจะย้ายแนวทแยงมุมเสมอ แต่มันมี-อยู่ในเส้นทางในแต่ละเทิร์นซึ่งถูกกำหนดให้เป็นการเคลื่อนที่แบบ "ไปข้างหน้า" แต่การเคลื่อนไหวที่เกิดขึ้นจริงนั้นจะอยู่ทางซ้ายสองเส้นทแยงมุมเสมอตามด้วยขวาสองเส้นทแยงมุม
Reto Koradi

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

@apsillers ทั้งสองถูกต้องถ้าฉันเข้าใจคุณอย่างถูกต้องคำตอบของคุณควรจะดี
Fatalize

คำตอบ:


11

JavaScript (ES6), 186 201

f=([...s])=>(g=(i,l,c=k=" ")=>s[i]!=k&&s[i]!="@"?0:(i-130)?(s[i]=c,([..."/-\\"].some((c,j)=>!((--j&l&&j!=l)||!g(i+33*(l||j)+1,j,c)))||!(s[i]=k))):(s[i]="@",!console.log(s.join(""))))(99)

ตัวอย่างโค้ดที่รันได้:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><textarea cols="33" rows="7" id="t"></textarea><br><button><b>Solve &gt;&gt;&gt;</b></button><hr><button id="1">Normal</button> <button id="2">Hyperregular</button> <button id="3">Death Star core</button> <button id="4">Death Star trench</button> <button id="5">Asteroid cave</button><script>f=(function($__0){var $__2,$__3,$__4,$__5;s = $__4 = $__0.split("");return (g = (function(i, l) {var c = arguments[2] !== (void 0) ? arguments[2] : k = " ";return s[i] != k && s[i] != "@" ? 0 : (i - 130) ? (s[i] = c, ("/-\\".split("").some((function(c, j) {return !((--j & l && j != l) || !g(i + 33 * (l || j) + 1, j, c));})) || !(s[i] = k))) : (s[i] = "@",$("#t").val(s.join("")));}))(99);});$("button").click(function() {this.id?$("#t").val(inputs[this.id]):f($("#t").val());});inputs = [,`|   #####           #########  |\n| ######  #          ###   #   |\n|   # #  #  #  ####   #        |\n@              ##    ####       \n|#   #   #       ###   ##      |\n|##      ##      ####   #  #   |\n|####           ##### #   ##   |`,`|# # # # # # # # # # # # # # # |\n| # # # # # # # # # # # # # # #|\n|# # # # # # # # # # # # # # # |\n@ # # # # # # # # # # # # # #   \n|# # # # # # # # # # # # # # # |\n| # # # # # # # # # # # # # # #|\n|# # # # # # # # # # # # # # # |`,`|    #    #    #         #     |\n|         #    #    #          |\n|    #    #    #    #    #     |\n@    #    #    #    #    #      \n|    #    #         #    #     |\n|    #    #    #    #    #     |\n|    #         #    #    #     |`,`|##############################|\n|##############################|\n|##############################|\n@                               \n|##############################|\n|##############################|\n|##############################|`,`|### ##########################|\n|## # ############### ## ######|\n|# ###  ######## ### ## # #####|\n@ ###### ###### ### ## ###      \n|########  ### ### ## #########|\n|########## # ### ## ##########|\n|###########              #####|`];$("#t").val(inputs[1]);</script

ฟังก์ชั่นนี้รับสายเดียวด้วยการขึ้นบรรทัดใหม่ ฟังก์ชั่นแยกสตริงเป็นอาร์เรย์ที่ใช้...ประกอบการและได้รับดัชนีสำหรับพิกัดโดย(x,y)(33 * y) + x

ฟังก์ชั่นนี้ทำงานซ้ำ ๆ ทดสอบการเคลื่อนไหวที่เป็นไปได้ที่แตกต่างกันสำหรับแต่ละพื้นที่ เมื่อมันเจอสิ่งกีดขวางมันจะคืนค่าที่เป็นเท็จและเมื่อมันมาถึงพื้นที่เป้าหมายสุดท้ายมันจะกลับtrueมา (ในรหัส golfed นี้trueถูกสร้างขึ้นโดย!console.log(...).)

โปรดทราบว่ารหัสนี้ไม่ได้ใช้การเลี้ยวขวาแบบยาว ๆ แต่เป็นการเว้นวรรคด้วยการเคลื่อนที่ตรง นั่นคือจะมีตัวเลือกที่สองด้านล่างไม่ใช่ตัวเลือกแรก:

\                       \
 \   (<= not this!)      -   (<= yes this!)
  \                       \

สิ่งนี้ดูเหมือนจะถูกกฎหมายเนื่องจาก-สามารถมาก่อนหรือหลังการเปิดได้ตามกฎหมายดังนั้นทำไมไม่ทั้งสองพร้อมกัน? มันดูแปลกมากในตอนท้ายเมื่อการเคลื่อนไหวครั้งสุดท้ายเป็น\แต่จะแสดงเป็น@:

|  --#    #    #   ------#  -  |
| /  \    #    #  / #    \ / \ |
|/   #-   #    # /  #    #-   -|
     # \  #    #/   #    #     @
|    #  - # ----    #    #     |
|    #   \#/   #    #    #     |
|    #    -    #    #    #     |

c=k=" "ที่ชื่นชอบสับกอล์ฟที่น่ารังเกียจของที่นี่คือการละเมิดข้อโต้แย้งที่เริ่มต้นด้วย ข้อโต้แย้ง(i,l,c=" ")จะพูดว่า "ใช้สตริง" "สำหรับcหากfไม่ได้ระบุอาร์กิวเมนต์ที่สาม" อย่างไรก็ตามโดยการทำc=k=" "เราพูดว่า "ถ้าcไม่ได้รับการจัดเก็บ" "ในตัวแปรทั่วโลกkและจากนั้นเก็บค่าในcเช่นกัน" เนื่องจากการเรียกซ้ำเริ่มต้นด้วยอาร์กิวเมนต์เพียงตัวเดียวkจึงถูกกำหนดค่าเริ่มต้นเสมอในการเรียกใช้ฟังก์ชันแรก

ungolfed อย่างอ่อนโยน:

// `i` - index in the string we're working on
// `l` - move character for this space (`/`, `\`, or `-`)
search = (i,l,c)=>{

  // not an open space; nip this recursive branch
  if(s[i]!=" "&&s[i]!="@") { return 0; }

  // we made it! the 130th space is (31,3)
  if(i==130) {
      s[i]="@";
      console.log(s.join(""));
      return true;
  }

  // fill in space with move character or a blank
  // (the space is only to blank out the initial `@`)
  s[i] = c || " ";

  // iterate through the 3 options and recursively explore the map
  return ['/','-','\\'].some((c,j)=>{
    --j;
    // if last move was sideways, and this is the opposite move, skip it
    if(l && j && j!=l) { return 0; }

    // recursively call search function on space pointed to by this move or the last move
    return search(i+33*(l||j)+1, j, c);
  })

  // if the `some` call is false (i.e. all options fail for this space)
  // then blank out this space and return false
  || !(s[i]=" ");

}

@ vihan1086 ใช่ฉันพลาดช่องว่างเหล่านั้นทั้งหมดเมื่อเล่นกอล์ฟ D: และการสลับจากอาเรย์เป็นสตริงที่แยกก็เป็นการเปลี่ยนแปลงที่ดีเช่นกัน ขอบคุณ :) ฉันยังได้ทำการเปลี่ยนแปลงอื่น ๆ อีกสองสาม (ทำให้ตัวละครย้ายปัจจุบันเป็นอาร์กิวเมนต์ที่สามแทนการพิจารณาในฟังก์ชั่นและเก็บไว้" "ในตัวแปร) ที่ทำให้คะแนนของฉันลดลง
apsillers

7

C (โปรแกรมสมบูรณ์), 249 247 235 ไบต์

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

char f[7][33];g(i,j,c){return(i<0|i>6|f[i][j]%32?0:j<31?c%45-2?g(i,j+1,c)||g(i+1,j+1,92)||g(i-1,j+1,47):g(i+c/30-2,j+1,c)||g(i+c/30-2,j+1,45):1)?f[i][j]=j?j-31?c:64:32:0;}main(int p,char**v){read(open(v[1],0),f,231);g(3,0,45);puts(f);}

Ungolfed:

/* the field */
char f[7][33];

/* i - row
 * j - col
 * c - movement
 */
g(i,j,c)
{
    return
            /* if we're in bounds and not on an obstacle */
            (i >= 0 & i<7 & f[i][j] % 32 == 0 ?
                    /* if we haven't reached the end */
                    j < 31 ?
                            /* are we going straight ahead? */
                            c%45-2 ?
                                    /* try to go straight */
                                    g(i,j+1,c)
                                    /* try to turn right */
                                    || g(i+1,j+1,92)
                                    /* try to turn left */
                                    || g(i-1,j+1,47)
                            /* turning */
                            :
                                    /* try to keep turning */
                                    g(i+c/30-2,j+1,c)
                                    /* try to go straight */
                                    || g(i+c/30-2,j+1,45)
                    /* done */
                    :1 /* replace this with c==45 to better represent the last move being a turn */
            /* invalid move, fail */
            :0)
            /* add the correct movement to the field */
            ? f[i][j] = j ? j - 31 ? c : 64 : 32
            /* no path, much sads :( */
            :0;
}

main(int p,char*v[])
{
    /* read input file */
    read(open(v[1],0),f,231);

    /* calculate the path */
    g(3,0,45);

    /* print it out */
    puts(f);
}

เอาท์พุท:

$ ./a.out test.inp
|   #####           #########  |
| ######  #          ###   #   |
|   # #  #  #  ####   #      --|
 ------------- ##----####   /  @
|#   #   #    \ /### \ ##  /   |
|##      ##    - #### \ # /#   |
|####           ##### #---##   |

$ ./a.out test2.inp
|# # # # #-# # # # # #-# # # # |
| # # # #/#\# # # # #/#\# # # #|
|# # # #/# #\# # # #/# #\# # # |
 -# # #/# # #\# # #/# # #\# #  @
|#\# #/# # # #\# #/# # # #\# #/|
| #\#/# # # # #\#/# # # # #\#/#|
|# #-# # # # # #-# # # # # #-# |

$ ./a.out test3.inp
|    #    #    #   ------#     |
|    -    #    #  / #    \     |
|   /#\   #    # /  #    #\    |
 --- # \  #    #/   #    # \   @
|    #  \ #    /    #    #  \ /|
|    #   \#   /#    #    #   - |
|    #    ---- #    #    #     |

$ ./a.out test4.inp
|##############################|
|##############################|
|##############################|
 ------------------------------@
|##############################|
|##############################|
|##############################|

$ ./a.out test5.inp
|###-##########################|
|##/#\############### ##-######|
|#/###--######## ### ##/#\#####|
 -######\###### ### ##/###-----@
|########--### ### ##/#########|
|##########\# ### ##/##########|
|###########--------      #####|

ดูเหมือนว่าคุณพลาดจุดสิ้นสุดในการทดสอบครั้งแรก
Reto Koradi

@RetoKoradi มันเป็น-ตามด้วย\แต่ถูกปกคลุมขึ้นโดย\ @(โปรแกรมของฉันทำสิ่งเดียวกัน)
apsillers

1
@RetoKoradi การแจ้งเตือนก่อนหน้านี้เกี่ยวกับกรณีนี้ดีกว่า มันคือ 4 ไบต์ ฉันสังเกตเห็นวิธีการแก้ปัญหาของ apsillers ในทำนองเดียวกันดังนั้นฉันเลือกที่จะประหยัดพื้นที่
Cole Cameron

ฉันเห็น. มันไม่ถูกต้องสำหรับฉัน แต่ขึ้นอยู่กับ OP เพื่อตัดสินใจว่าจะอนุญาตอะไร ฉันเห็นว่าพวกเขาให้อิสระในการเคลื่อนไหว ฉันอยากจะเห็นคำจำกัดความที่ชัดเจนและเป็นเอกลักษณ์ตั้งแต่เริ่มต้น ดูเหมือนว่าจะเป็นปัญหาที่สนุก แต่ก็ไม่ได้น่าสนใจกับความคลุมเครือ
Reto Koradi

3

Lisp สามัญ, 303 ไบต์

สนุกมากกับการท้าทายนี้มันเป็นภารกิจ codegolf แรกที่ฉันทำ โดยทั่วไปมีฟังก์ชั่นแบบเรียกซ้ำง่าย ๆ ซึ่งจะพยายามทุกการเคลื่อนไหวที่มีชีวิตจนกระทั่งถึงตำแหน่งสุดท้าย

แข็งแรงเล่นกอล์ฟ / ลดขนาดลง

(let((s(open "i"))(n nil)(f(make-string 231)))(read-sequence f s)(labels((r(p s u d)(and(< 0 p 224)(find(aref f p)" @")(setf(aref f p)(cond((= 130 p)#\@)((or(unless d(r(- p 32)#\/ t n))(unless u(r(+ p 34)#\\ n t))(r(+ p(cond(u -32)(d 34)(t 1)))#\- n n))s)((return-from r)))))))(r 99 #\- n n)(princ f)))

อ่านอินพุตจากไฟล์iในไดเร็กทอรีการทำงาน ฉันค่อนข้างมั่นใจว่ายังมีช่องว่างสำหรับการปรับปรุง

รหัสธรรมดา

(defun run-test (file)
  (let ((stream (open file)) ;;should use with-open-file for autoclose..
        (no nil) ;; alias for brevity
        (field (make-string 231)))
    (read-sequence field stream)
    (labels ((doit (pos sym going-up going-down)
               (and
                 (< 0 pos 224)
                 (find (aref field pos) " @")
                 (setf (aref field pos)
                       (cond
                         ((= 130 pos) #\@)
                         ((or
                            (unless going-down (doit (- pos 32) #\/ t no))
                            (unless going-up (doit (+ pos 34) #\\ no t))
                            (doit (+ pos (cond (going-up -32)
                                               (going-down 34)
                                               (t 1)))
                                  #\- no no))
                          sym)
                         ((return-from doit)))))))
      (doit 99 #\- no no)
      (princ field)
      nil)))

ตัวอย่างผลลัพธ์

|   #####       --  #########  |
| ######  #    /  \  ###   # - |
|   # #  #  # /####\  #     / \|
--   -       / ##   \####  /   @
|#\ /#\  #  /    ### \ ## /    |
|##-   \ ##/     #### \ #/ #   |
|####   ---     ##### #-- ##   |

|  --#    #    #   --    #-    |
| /  \    #    #  / #\   / \   |
|/   #\   #    # /  # \ /#  \  |
-    # \  #    #/   #  - #   \ @
|    #  \ # ----    #    #    -|
|    #   \#/   #    #    #     |
|    #    -    #    #    #     |

|# #-# # # # # #-# # # # # #-# |
| #/#\# # # # #/#\# # # # #/#\#|
|#/# #\# # # #/# #\# # # #/# #\|
--# # #\# # #/# # #\# # #/# #  @
|# # # #\# #/# # # #\# #/# # # |
| # # # #\#/# # # # #\#/# # # #|
|# # # # #-# # # # # #-# # # # |

2

ActionScript 3, 364 ไบต์

ฉันแบ่งสิ่งนี้ออกเป็นสองฟังก์ชั่น หนึ่งอันเพื่อเปลี่ยนอาร์เรย์เป็นอาร์เรย์ของอาร์เรย์และอีกอันหนึ่งเรียกซ้ำเพื่อคำนวณเส้นทางการบิน

function m(f){for(var i=0;i<f.length;i++){f[i]=f[i].split("");}n(f,0,3,0);return f;}function n(f,x,y,m){var P=f[y][x],X=x+1,A=y-1,B=y,C=y+1,T=true,F=false,E='-';if (y<0||y>6||P=='#'||P=='|')return F;if (x==31){f[y][x]='@';return T;}if(m<0&&y>0){B=A;C=9;E='/';}else if(m>0&&y<6){A=9;B=C;E='\\';}if (n(f,X,B,0)||n(f,X,A,-1)||n(f,X,C,1)){f[y][x]=E;return T;return F;}

เวอร์ชัน Ungolfed ในโปรแกรมที่มีฟิลด์ดาวเคราะห์น้อยตัวอย่างหนึ่งฟิลด์กำหนดไว้:

package
{
    import flash.display.Sprite;

    public class AsteroidNavigator extends Sprite
    {
        var field:Array;
        public function AsteroidNavigator()
        {
            field = [
"|   #####           #########  |",
"| ######  #          ###   #   |",
"|   # #  #  #  ####   #        |",
"@              ##    ####       ",
"|#   #   #       ###   ##      |",
"|##      ##      ####   #  #   |",
"|####           ##### #   ##   |"];
            m(field);
            printField();
        }

        function m(f){
            for(var i=0;i<f.length;i++){
                f[i]=f[i].split("");\
            }
            n(f,0,3,0);
            return f;
        }

        private function n(field,x,y,m) {
            var C = field[y][x];
            if (x > 31 || C == '#' || C == '|') {
                return false;
            }
            if (x == 31 && y == 3) {
                field[y][x] = '@';
                return true;
            }
            if (m == 0) {
                if (n(x+1, y, 0) || ((y>0) && n(x+1, y-1, -1)) || ((y<6) && n(x+1, y+1, 1))) {
                field[y][x] = '-';
                return true;
                }
            } else if ((m<0) && (y>0)) {
                if ((n(x+1, y-1, -1) || n(x+1, y-1, 0))) {
                    field[y][x] = '/';
                    return true;
                }
            } else if ((m>0) && (y<6)) {
                if ((n(x+1, y+1, 1) || n(x+1, y+1, 0))) {
                    field[y][x] = '\\';
                    return true;
                }
            }
            return false;
        }

        private function printField() {
            var sb = "";
            for each (var row:Array in field) {
                sb += row.join("") + "\n";
            }
            trace(sb);
        }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.