หอจะสมดุลหรือไม่


36

บทนำ

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

ตัวอย่างเช่นหอคอยแรกยอดคงเหลือ แต่ที่สองตกไปทางซ้าย

  # #            # #
  ###            ### 
 ###            ### 
 # #            # # 
#####          ##### 
 ###            ### 
 ###              #

นี่เป็นความท้าทายครั้งแรกของฉัน ฉันหวังว่าคุณจะสนุกกับมัน.

คำสั่ง

หอประกอบด้วยบล็อกการเชื่อมต่อแทนด้วย#รูปแบบและวัตถุแข็ง แต่ละบล็อกเป็นสี่เหลี่ยมจัตุรัสที่มีความกว้างและความสูงของหนึ่งหน่วยและมีความหนาแน่นคงที่ มีสองแรงที่กระทำบนหอคอยน้ำหนักและแรงลม กองกำลังทั้งหมดทำหน้าที่ในแต่ละบล็อกและผ่านจุดศูนย์กลางของบล็อก

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

ธงจะมีลักษณะตรงตามที่ปรากฏด้านล่าง

Flag design and corresponding wind direction:

 o~~        ~~o
 |~~        ~~|

--->        <---

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

ตัวอย่าง

  o~~
  |~~
  # #              > > 
  ###              >## 
 ###              >##  
 # #              > >  
#####            >#### 
 ###              >##  
 ###              >##  

Wind force: 1    Wind direction: --->

ลมพัดไปทางขวาและจะผลักดันบล็อกที่แสดงด้วย>ด้านบนขวา โปรดทราบว่าลมทำหน้าที่อยู่ภายในรู

(0,0)สมมติที่มุมซ้ายล่างของหอคอยมีพิกัด ช่วงเวลารอบฐานด้านซ้ายของหอที่(0,0)71 หน่วยตามเข็มนาฬิกาดังนั้นหอจะไม่ตก ช่วงเวลารอบฐานด้านขวาของหอคอยที่ (0,3) คือ 8 หน่วยตามเข็มนาฬิกาดังนั้นหอคอยจะตกลง

ถ้าลมพัดไปทางซ้ายช่วงเวลาตามลำดับจะเป็น 2 หน่วยตามเข็มนาฬิกาและ 61 หน่วยทวนเข็มนาฬิกาในจุดเดียวกันดังนั้นหอคอยจะสมดุล

อินพุต

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

เอาท์พุต

  • หนึ่งในตัวละครB, LหรือRขึ้นอยู่กับว่าหอคอยจะสมดุลตกไปทางซ้าย (ทวนเข็มนาฬิกา) หรือตกไปทางขวา (ตามเข็มนาฬิกา)
  • ผลลัพธ์อาจมีการขึ้นบรรทัดใหม่ที่ต่อท้าย

นี่คือ ; ใช้กฎมาตรฐานและช่องโหว่

B กรณีทดสอบ:

Wind: 1
    ~~o
    ~~|
      # #
      ###
     ###
     # #
    #####
     ###
     ###

Wind: 0
##
# ##
###

Wind: 1.7
o~~
|~~
#
##

Wind: 0.768
      o~~
      |~~
      # #
      ###
     ###
     # #
    #####
     ###
     ###

Wind: 0.1
#
#
#
#
#
# o~~
# |~~

Wind: 0
#

Wind: 0
############

Wind: 144
               o~~
############   |~~

Wind: 0
#######
 ##
 #
 ##

Wind: 0
                ############
           ############
       ############
    ############
   ############
 ############
############

Wind: 41
                 ############
            ############
        ############
     ############
    ############
  ############     ~~o
 ############      ~~|

L กรณีทดสอบ:

Wind: 0
#####
   #


Wind: 42
                 ############
            ############
        ############
     ############
    ############
  ############     ~~o
 ############      ~~|

Wind: 4
########
    ###
 ~~o# ##
 ~~|#  #

Wind: 3
########
    ###
 o~~# ##
 |~~   #

R กรณีทดสอบ:

Wind: 1
      o~~
      |~~
      # #
      ###
     ###
     # #
    #####
     ###
     ###

Wind: 2
o~~
|~~
#

Wind: 0.001
                 ############
            ############
        ############
     ############
    ############
  ############     o~~
 ############      |~~

Wind: 145
               o~~
############   |~~

Wind: 1
#
#
#
#
#
# o~~
# |~~

Wind: 0.26
#######
 ##
 #   o~~
 ##  |~~

โซลูชันอ้างอิง (JavaScript)

ลองออนไลน์

function balanced(tower, wind) {
    var rows = tower.split('\n').reverse(); // Reverse so row index matches height of row.
    var height = rows.length;
    var leftEdge = rows[0].indexOf('#'); // Find bottom left corner of tower.
    var rightEdge = rows[0].lastIndexOf('#') + 1; // Find bottom right corner of tower.
    var leftMoment = 0, rightMoment = 0; // Moments around the bottoms corners of tower.
    wind *= tower.indexOf('~o')>-1 ? -1 : 1; // Find direction of the wind.

    // Sum the moments for each block in the tower.
    for (var i = height - 1; i >= 0; i--) {
        rows[i].split('').map(function(ch, index, arr) {
            if (ch=='#') {
                // If there's not a block toward the windward side of the current one.
                if ((wind < 0 && arr[index-1] != '#') || (wind > 0 && arr[index+1]!='#')) {
                    // Add moments from wind.
                    leftMoment += (i+0.5)*-wind;
                    rightMoment += (i+0.5)*-wind; 
                }

                leftMoment += leftEdge - (index + 0.5);
                rightMoment += rightEdge - (index + 0.5);
            }
        }, 0);
    }
    if (leftMoment > 0) return 'L';
    else if (rightMoment < 0) return 'R';
    else return 'B';
}

ลีดเดอร์บอร์ด

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

# Ruby, <s>104</s> <s>101</s> 96 bytes

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

# Perl, 43 + 2 (-p flag) = 45 bytes

นอกจากนี้คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างกระดานแต้มนำ:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


17
ยินดีต้อนรับสู่ PPCG; นี่เป็นความท้าทายแรกที่เขียนอย่างยอดเยี่ยม! :)
Doorknob

คำตอบ:


2

JavaScript (ES6), 239 ไบต์

ฉันนำการอ้างอิงไปใช้ ฉันสามารถบันทึก bytes โดยการเปลี่ยน for loop เป็น a map, การใช้&&และ||การลัดวงจรถ้า statement และการใช้,โอเปอเรเตอร์เพื่อให้พอดีกับทุกอย่างในหนึ่ง statement เพื่อหลีกเลี่ยงการส่งคืนค่าที่ชัดเจนในฟังก์ชัน

(a,b)=>((c=a.split`
`.reverse(),d=c[f=g=0].indexOf`#`,e=c[0].lastIndexOf`#`+1),a.match`o~`&&(b*=-1),c.map((h,i)=>h.replace(/#/g,(j,k,l)=>(b>0&l[k-1]!='#'|b<0&l[k+1]!='#'&&(f+=(i+=0.5)*b,g+=i*b),f+=d-k-0.5,g+=e-k-0.5))),f>0?'L':g<0?'R':'B')

มันอาจจะเป็นไปได้ที่จะเล่นกอล์ฟนี้อีก ข้อเสนอแนะยินดีต้อนรับ


+1 ดีกว่าโซลูชันไร้เดียงสาของฉัน
Conor O'Brien

1

JavaScript ES6, 297 293 ไบต์

โดยพื้นฐานแล้วเวอร์ชันบีบอัดของการนำไปใช้งานที่กำหนด

b=(n,e)=>{r=n.split`
`.reverse(),t=r.length,a=r[0].indexOf`#`,f=r[i=l=0].lastIndexOf`#`+1;e*=n.indexOf`~o`>-1?-1:1;for(d=t-1;d>=0;d--)r[d].split``.map((n,r,t)=>{(j="#")==n&&((0>e&&j!=t[r-1]||e>0&&j!=t[r+1])&&(i+=(d+.5)*-e,l+=(d+.5)*-e),i+=a-(r+.5),l+=f-(r+.5))},0);return i>0?"L":0>l?"R":"B"}

กึ่งขยาย:

b = (n, e) => {
    r = n.split `
`.reverse(), t = r.length, a = r[0].indexOf `#`, f = r[i = l = 0].lastIndexOf `#` + 1;
    e *= n.indexOf `~o` > -1 ? -1 : 1;
    for (d = t - 1; d >= 0; d--) r[d].split ``.map((n, r, t) => {
        (j = "#") == n && ((0 > e && j != t[r - 1] || e > 0 && j != t[r + 1]) && (i += (d + .5) * -e, l += (d + .5) * -e), i += a - (r + .5), l += f - (r + .5))
    }, 0);
    return i > 0 ? "L" : 0 > l ? "R" : "B"
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.