ฉันจะหงายท้อง?


36

ภาพรวม

รับสาย 3 สายคิดออกว่าโครงสร้างตกไปทางซ้ายยอดคงเหลือหรือตกไปทางขวา

โครงสร้างอินพุต

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

1  7 4        a
===============
        |

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

บรรทัดที่สองคือคัน ความยาวของแท่งแต่ละอันมีน้ำหนัก 1 หน่วย บรรทัดนี้เท่ากับเครื่องหมาย ( =) เท่านั้น

บรรทัดที่สามคือจุดหมุน สามารถวางได้ทุกที่และแสดงเป็นจำนวนของช่องว่างตามด้วย|อักขระไปป์เดียว ( )

ตัวอย่าง

การป้อนข้อมูล:

=====
  |

ผลลัพธ์: ยอดคงเหลือ

การป้อนข้อมูล:

=====
   |

เอาท์พุท: ตกเหลือ

การป้อนข้อมูล:

    %
=====
   |

เอาท์พุท: สมดุล (เพราะ%มีน้ำหนักพอที่จะตอบโต้น้ำหนักของด้านซ้ายของแกน)

การป้อนข้อมูล:

 AA
=======
   |

เอาท์พุท: อยู่ทางขวา (เพราะaด้านขวาอยู่ห่างจากจุดหมุน)

การป้อนข้อมูล:

1  7 4        A
===============
        |

เอาท์พุท: ตกเหลือ

การป้อนข้อมูล:

1  7 4        a
===============
        |

เอาท์พุท: ถูกต้อง (ตัวอักษรตัวพิมพ์เล็กหนัก!)

การป้อนข้อมูล:

            $ ~
===============
             |

ผลลัพธ์: ยอดคงเหลือ

หมายเหตุ

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


โปรแกรมอาจใช้สามบรรทัดเป็นสามสตริงที่แยกกัน (เช่นสามอาร์กิวเมนต์ไปยังฟังก์ชันหรือเป็นรายการองค์ประกอบสามรายการ)
notjagan

@notjagan การป้อนข้อมูลต้องเป็นสตริงเดี่ยวคั่นด้วยอักขระบรรทัดใหม่
Daffy

ที่เกี่ยวข้อง , ล่อที่เป็นไปได้
xnor

@xnor ไม่ใช่คู่หูเพราะคำถามนั้นเกี่ยวข้องกับตัวอักษรตัวพิมพ์ใหญ่เท่านั้นและเป้าหมายคือการค้นหาเดือย คำถามของฉันเกี่ยวกับอักขระ ascii ทั้งหมด> = 32 และฉันจะส่งเดือยให้และถามว่าโครงสร้างจะล้มลงหรือไม่ โดยพื้นฐานแล้วสิ่งที่ตรงกันข้ามที่คุณลิงค์ไว้
Daffy

คำตอบ:


8

JavaScript (ES6), 116 111 108 106 ไบต์

-5 ไบต์จากข้อสรุปทางแทนeval(array.join`+`) array.reduce()
-3 ไบต์โดยการกำหนดค่าเริ่มต้น1เป็นแทนที่จะ32 - 31อนุญาตให้ลบวงเล็บได้
-2 ไบต์เนื่องจากจุดหมุนคือความยาวของบรรทัดสุดท้าย - 1

(s,[t,r,b]=s.split`
`)=>Math.sign(eval([...r].map((_,i)=>(t.charCodeAt(i)-31||1)*(i-b.length+1)).join`+`))

เอาต์พุต-1, 0หรือ1, สำหรับซ้าย, สมดุลหรือขวา, ตามลำดับ จบลงด้วยความคล้ายคลึงกับคำตอบหลามของ Chas Brownดังนั้นเครดิตจึงไปที่นั่น

สามารถบันทึก 4
(31-t.charCodeAt(i))*(b.length+~i)ไบต์ถ้าบรรทัดแรกเป็นเบาะเพื่อให้ตรงกับความยาวของคันโดยใช้

ตัวอย่างการทดสอบ

รวมเอาต์พุตเพิ่มเติม ( Left/ Balanced/ Right) พร้อมกับหมายเลข

f=
(s,[t,r,b]=s.split`
`)=>Math.sign(eval([...r].map((_,i)=>(t.charCodeAt(i)-31||1)*(i-b.length+1)).join`+`))
<textarea id=I rows=3 cols=20></textarea><br><button onclick="O.value=I.value?`${x=f(I.value)} (${['Left','Balanced','Right'][x+1]})`:''">Run</button> <input id=O disabled>

อีก 106 วิธีไบต์

(s,[t,r,b]=s.split`
`)=>Math.sign(eval(r.replace(/./g,(_,i)=>"+"+(t.charCodeAt(i)-31||1)*(i-b.length+1))))

แทนที่จะjoinไอเอ็นจีอาร์เรย์บน+s +เราจะสร้างสตริงของตัวเลขแต่ละหน้าด้วย ผู้นำ+จะถูกเพิกเฉย


1
ฉันคิดว่า(b.length+~i)อาจช่วยในการบันทึกไบต์ (ฉันก็ไม่เข้าใจว่าทำไมคุณมี||1)
Neil

1
@Neil b.length+~iส่งคืนค่าลบของi-b.length+1; ที่สามารถช่วยถ้าฉันสามารถคัดค้านส่วนอื่น ๆ สำหรับ||1นั่นก็เพราะฉันสมมติว่าบรรทัดแรกไม่ได้เบาะเพื่อให้ตรงกับความยาวของแท่งดังนั้นt.charCodeAt(i)จะกลับมาNaNเกินปลายบรรทัดแรก
Justin Mariner

ฉันไม่ได้ลองใช้ชุดทดสอบแบบไม่มีเบาะ ขอบคุณที่อธิบาย
Neil

3

Python 2 , 112 110 ไบต์

def f(s):w,b,p=s.split('\n');return cmp(sum((ord((w+' '*-~i)[i])-31)*(i-p.find('|'))for i in range(len(b))),0)

ลองออนไลน์!

แก้ไข: ในที่สุดก็จัดการเพื่อกำจัดenumerateและrjustสำหรับ 2 ไบต์ที่เลวทรามต่ำช้า ... meh!

ใช้เวลาในสตริง; เอาท์พุท -1,0 หรือ 1 สำหรับการตกหล่นคงเหลือยอดตกไปทางขวาตามลำดับ

การผ่านครั้งแรกที่ 112 ไบต์คือ:

def f(s):w,b,p=s.split('\n');return cmp(sum((ord(c)-31)*(i-p.find('|'))for i,c in enumerate(w.rjust(len(b))),0)

(ord(c)-31)เอาฉันสักครู่เพื่อตระหนักว่านี่คือการรวมน้ำหนักของแกนตัวเองพร้อมกับรายการ ฉลาดมาก!
Daffy

1
ตาม metaคุณสามารถแทนที่returnด้วยprint-1 ไบต์ (แม้ว่าจะไม่ได้เล่นกับรหัส TIO ปัจจุบันอย่างแท้จริง)
notjagan

3

Haskell, 212 171 ไบต์ (188 ถ้ารับเป็นหนึ่งสตริง)

o!p=map(fst)(zip[p-0,p-1..]o)
x#p=sum(zipWith(\c w->(max(fromEnum c-32)0)*w)x(x!p))+sum(x!p)
x?c=length(takeWhile(==c)x)

ตัวแปร 171 ไบต์

r a b c=signum(take(b?'=')(a++repeat ' ')#(c?' '))

ตัวแปร 188 ไบต์

x%y=lines x!!y
r i=signum(take(i%1?'=')(i%0++repeat ' ')#(i%2?' '))

คำอธิบาย

o!p=map(fst)(zip[p-0,p-1..]o)        Creates weights coefs list. 
                                     o - list, p - pivot position
                                     for list "abcdf" and p=3 (pivot under 'd')
                                     outputs [3,2,1,0,-1]

x#p                                  Calculates total balance
                                     x-list of "objects" on lever, p-pivot place
  sum(zipWith                        sum of zipped lists
   (\c w->(max(fromEnum c-32)0)*w)   weight of ascii "object" times
                                     distance from pivot
    x(x!p))                          x-ascii objects, 
                                     (x!p)-distances list(weight coefs)
  +sum(x!p)                          balance of lever ("==") itself

x?c=length(takeWhile(==c)x)          length of list before non c element met
                                     used to find '|' position
                                     and length of "===" lever
                                     before right whitespaces met

r a b c=                             Sums it all up =)
                                     a-ascii objects, b-lever, c-pivot line
   signum(                           1-tips left, 0-balance, -1-tips right
     take(b?'=')(a++repeat ' ')      takes all object on lever 
                                     plus whitespaces up to length of the lever
      #                              calculate the balance
       (c?' ')                       determine place of pivot

1
คุณสามารถใช้fromEnumแทนและวางord สามารถทำให้ง่ายขึ้น(หรือด้วย) และในขณะที่คุณกำลังใช้งานเพียงครั้งเดียวแบบอินไลน์ importcc p=max(ord p-32)0fromEnum
nimi

หรือคุณอาจจะเพิ่ม (Lambdabot) เพื่อชื่อของคุณการนำเข้านี้ทุกอย่างสวยมากที่คุณต้องดูที่นี่
ბიმო

1
ฟังก์ชั่นcสามารถแม้จะง่าย (ตัวละครภายใต้ 32 ยังไม่ได้รับการพิจารณา) c p=ord p-32ต่อไป นอกจากนี้ยังpเป็นพื้นlength(ลบ 1) ดังนั้นp x=length x-1จะทำงานมากเกินไป (และคุณสามารถ inline มันมากเกินไป) ดูวิธีการแก้ปัญหาของฉันวิธีใช้signum- คุณสามารถทำสิ่งr o l s = signum $ 2 * z ...ที่ส่งคืน0,1,-1สำหรับ B, L, R
ბიმო

1
นอกเหนือจากนั้นวิธีนี้ดูเหมือนจะล้มเหลวในกรณีทดสอบ[3,4,7]และใช้ 3 สายแทนหนึ่ง (ดูlines)
ბიმო

1
นี่คือรุ่นที่มีเคล็ดลับเล็กน้อยที่ใช้ (ช่วยให้คุณประหยัด 29 ไบต์))
ბიმო

2

เยลลี่ 30 ไบต์

O_31×J_¥A+\sṪ€µ÷ḢṪ_2Ṡ
ỴṪLç@ỴḢ$

ชุดทดสอบ

เอาต์พุต 0 สำหรับบาลานซ์, 1 สำหรับขวาและ -1 สำหรับซ้าย

มันทำงานอย่างไร

O_31×J_¥A+\sṪ€µ÷ḢṪ_2Ṡ - helper function. Arguments position of pivot and first line
O                        - char codes of first line
 _31                     - subtract 31 to get weight
    ×                    - elementwise product with:
     J_¥                 - distances from the pivot
        A                - absolute value
         +\              - cumulative sum
           s             - split to get [[...,left weight],...,[..., right + left weight]]
            Ṫ€           - last element of each sublist: [left weight, ... right weight]
              µ÷Ḣ        - get ratio of each element over left weight: ratio n indicates
                              right + left = n × left ===> right = left if n = 2
                 _2      - subtract 2: positive is right>left and negative is right<left
                   Ṡ     - return the sign of this


ỴṪLç@ỴḢ$              - main link. Argument: 3 line string.
   ç@                  - apply helper function with arguments:
Ỵ                        - split by linefeeds
 Ṫ                       - last line
  L                      - length (returns position of pivot)
       $               - and
     Ỵ                   - split by linefeeds
      Ḣ                  - first line              

2

เยลลี่ 24 ไบต์

ṪO_31
ỴµṪLạЀṪL$×Çṣ0S€IṠ

ลองออนไลน์!

-1สำหรับการล้มซ้าย0การทรงตัว1การล้ม (โปรแกรมเต็ม)
[-1]สำหรับซ้ายตก[0]สำหรับสมดุล[1]สำหรับตกขวา (ฟังก์ชัน)

บรรทัดแรกต้องมีช่องว่างต่อท้ายบรรทัดสุดท้ายต้องไม่

คำอธิบาย (เราเริ่มด้วยบรรทัดล่างสุด):

ก่อนอื่นเรากำลังทำงานกับแต่ละบรรทัดดังนั้นเราจึงจำเป็นต้องได้รับมัน นั่นคืองานสำหรับ จากนั้นเราต้องจัดการกับ\n-split เวอร์ชันของอินพุตเหมือนกับว่าเป็นอินพุตดั้งเดิมดังนั้นเราจึงใช้µเพื่อสร้าง monadic chain ที่ใช้กับค่าปัจจุบัน

ตอนนี้เราเริ่มทำงานจริงและงานแรกของเราคือการคำนวณปัจจัยของน้ำหนัก โดยพื้นฐานแล้วนี่คือช่วง [ระยะทางจากซ้ายสุดถึง pivot..0 ระยะทางจากเดือยไปทางขวาสุด] ก่อนอื่นเราต้องหาดัชนีที่ใช้ 1 เดือยซึ่งก็คือความยาวของบรรทัดสุดท้ายโดยไม่ต้องเว้นวรรค ดังนั้นเราจึงปรากฏบรรทัดสุดท้าย (สายเดือย) จากรายการเดิมของเราด้วยเนื่องจากเราจะไม่จำเป็นต้องใช้มันอีกต่อไปและจากนั้นเราจะใช้ความยาวของมันด้วย Lจากนั้นเราจะต้องใช้ความยาวของก้านที่ที่เราทำสิ่งเดียวกันกับสายในขณะนี้ที่ผ่านมา (สายคัน) ṪL$ด้วย ในที่สุดเพื่อรับช่วงเราแมป| x - y | ถึง [1..rod length] โดยที่xคือดัชนี pivot และyเป็นองค์ประกอบของรายการที่เราแผนที่แต่ละ เราทำสิ่งนี้โดยใช้ạЀซึ่งคำนวณ| x - y | และЀทำให้ช่วงจาก 1 ถึงและรวมถึงความยาวก้าน ตอนนี้เราจะมีช่วงที่เราต้องการ

หลังจากนั้นเราจะต้องคูณจำนวนเต็มแต่ละอันแทนชิ้นส่วนของแท่งด้วยน้ำหนักที่สอดคล้องกัน ในการคำนวณน้ำหนักเราใช้Çไปที่บรรทัดบนสุดของรหัสของเรา เราใช้เส้นที่เหลือ, charcodes ด้วยOและจากนั้นเราจะคำนวณx - 31ใช้_31, xเป็นแต่ละ charcode จากนั้นเรากำหนดพื้นที่ให้มีน้ำหนัก 1 (0 + ชิ้นส่วนแท่ง = 1) !ถึงน้ำหนัก 2 (1 + 1) ฯลฯ เราทำเสร็จแล้วด้วยเส้นบนสุดดังนั้นตอนนี้Çจะส่งคืนรายการน้ำหนักซึ่งเราคูณด้วยค่าที่สอดคล้องกัน ×จำนวนเต็มตัวแทนของชิ้นส่วนคันที่มี

หลังจากนั้นเราแยกด้วยṣ0จุด pivot ซึ่งมี 0 (เนื่องจากน้ำหนักใด ๆ จะไม่ส่งผลต่อผลลัพธ์) ทำให้รายการของแบบฟอร์ม [[น้ำหนักแรกน้ำหนักอันดับ 2 ... น้ำหนักก่อนหมุน] , น้ำหนัก [หลัง pivot, น้ำหนักหลังน้ำหนักก่อน ... น้ำหนักสุดท้าย]] รายการเหล่านี้แสดงถึงด้านข้างของแกนด้านซ้ายและขวา ตอนนี้เรารวมรายการแต่ละรายการที่ใช้S€เพื่อให้ได้น้ำหนักรวมในแต่ละด้านและใช้Iเพื่อหาเดลต้าซึ่งจะเป็นลบหากด้านซ้ายหนักกว่าศูนย์ถ้ามีน้ำหนักเท่ากันและบวกถ้าด้านขวาหนักกว่า . ดังนั้นเพื่อที่จะกลับผลสุดท้ายใช้นี้อย่างถูกต้องเพื่อประโยชน์ของเราเราจะเข้าสู่ระบบด้วย


2

APL (Dyalog) 43 ไบต์ *

{×(¯31+⎕UCS⊃⍵)+.×(⍳≢⊃⍵)-'|'⍳⍨⊃⌽⍵}⎕TC[2]∘≠⊆⊢

ลองออนไลน์!

⊆⊢ การแบ่งอาร์กิวเมนต์ให้เป็นจำนวนอักขระที่แบ่งออกเป็น

⎕TC[2]∘≠ แตกต่างจาก2 ครั้ง T erminal Cข้อมูลควบคุมตัวอักษร (เลื่อนบรรทัด) **

{} ใช้ฟังก์ชันที่ไม่ระบุชื่อต่อไปนี้ในรายการสตริง:

⊃⌽⍵ ในสตริงแรกของรายการที่กลับรายการ (เช่นสุดท้าย)

'|'⍳⍨ ค้นหาɩ ndex ของจุดหมุน

()- ลบออกจากรายการต่อไปนี้:

  ⊃⍵ สตริงแรก

   ความยาวของมัน

   ทั้งหมดɩ ndices ว่า

(... )+.× ผลรวมถ่วงน้ำหนักกับน้ำหนักและค่าต่อไปนี้:

  ⊃⍵ สตริงแรก

  ⎕UCS จุดรหัสในU niversal C haracter S et

  ¯31+ บวกลบสามสิบเอ็ด (32 สำหรับชดเชยที่จำเป็นลบหนึ่งสำหรับแกน)

× สัญลักษณ์ของสิ่งนั้น


* สำหรับ 1 ไบต์ต่อถ่านใช้กับ{×(¯31+⎕UCS↑⍵)+.×(⍳≢↑⍵)-'|'⍳⍨↑⌽⍵}⎕TC[3]∘≠⊂⊢ ลองออนไลน์! ** เลิกใช้แล้วและใช้ที่นี่เพื่อการเล่นกอล์ฟเท่านั้น ในรหัสการผลิตหนึ่งควรใช้⎕ML←3
⎕TC⎕UCS 10


2

Haskell (แลมบ์บ็อต), 142 ไบต์

l=length
g[a,c,b]=splitAt(l b)$a++(' '<$[1..l c-l a])
k e=sum$zipWith((*).(-31+).ord)e[1..]
f=signum.uncurry(-).(k.drop 1.reverse***k).g.lines

ลองออนไลน์!

เวอร์ชันที่ไม่ถูกปรับแต่ง:

-- for readability, allows reading top-down/left-right
(.>) = flip (.)

ungolfed =
     lines                                 -- separate out lines into..
  .> (\[a,b,c] ->                          -- a,b,c (first,second,third)
                                           -- ' ' pad the first line & split on pivot
       splitAt (length c) (a ++ replicate (length b - length a) ' ')
     )
  .> (weight.drop 1.reverse *** weight)    -- reverse left half, drop element above pivot & get weight for both
  .> uncurry (-)                           -- subtract right from left
  .> signum                                -- get sign

-- get ord of the character subtract 31 ('=' char from bar),
-- then multiply with scales ([1..]) and sum it all up
weight es = sum $ zipWith (ord .> subtract 31 .> (*)) es [1..]

2

Python 2 , 90 ไบต์

def f(s):L=len(s)/3;print cmp(sum((ord(s[i])-31)*(i-s[-L:].find('|'))for i in range(L)),0)

คาดว่าบรรทัดอินพุตจะถูกเพิ่ม (ด้วยการเว้นวรรค) ให้มีความยาวที่ถูกต้อง ขาออก-1สำหรับน้ำตกซ้าย , 0สำหรับความสมดุลและ1สำหรับตกอยู่ทางขวา

ลองออนไลน์!


94 ไบต์

สำหรับ +4 ไบต์เราสามารถมีเวอร์ชันที่ใช้whileลูปต้องใช้เส้นที่มีการปล้นมากกว่าสายที่มีเบาะ :

def f(s):
 i=r=0
 while''<s[i]:r+=(ord(s[i])-31)*(i-s[-3::-1].find('='));i+=1
 print cmp(r,0)

ลองออนไลน์!


1

Ruby, 543 ไบต์

def willittip(s)
leftw=0;
rightw=0;
arr=[];
fields=s.split("\n")
pos=fields[2].index("|")
fields[0].split("").each do |i|
arr << i.ord-32
end
arr[pos+1..-1].each_with_index do |x,y|
rightw=rightw+1
if x>0
if pos>0
rightw=rightw+x*(pos-y).abs
else
rightw=rightw+x
end
end
end
arr[0..pos-1].each_with_index do |x,y|
leftw=leftw+1
if x>0
if pos>0
leftw=leftw+x*(pos-y).abs
else
leftw=leftw+x
end
end
end
if leftw==rightw
return "Equal"
elsif leftw<rightw
return "Right"
elsif leftw>rightw
return "Left"
end
end

10
ยินดีต้อนรับสู่ PPCG! : D เป้าหมายของความท้าทายการเล่นรหัสคือการทำให้รหัสของคุณเล็กที่สุดเท่าที่จะเป็นไปได้ คุณสามารถลดขนาดรหัสของคุณโดยทำให้ตัวแปรและชื่อฟังก์ชั่นทั้งหมดเป็นตัวอักษรเดียวและโดยการลบช่องว่างเมื่อใดก็ตามที่เป็นไปได้
Daffy

1

C (gcc) , 106107 121 123 124 129 131 ไบต์

c,b,l,i;f(char*a){l=strlen(a)/3;for(i=b=c=0;32/a[l*2+c];++c);for(;i<l-1;b+=(a[i]-31)*(i++-c));a=b>0?2:!b;}

ผลตอบแทน 0 สำหรับการตกซ้าย 1 เพื่อความสมดุลและ 2 สำหรับการตกทางขวา

ต้องการทั้งสามบรรทัดที่มีความยาวเท่ากันและจบด้วย\nเพื่อกำหนดความยาวของสตริง

ลองออนไลน์!


1

Mathematica, 91 92 ไบต์

Sign[(v=(g=ToCharacterCode)@#&@@(d=#~StringSplit~"
")-31).(Range@(l=Length)@v-l@g@Last@d)]&

บรรทัดแรกควรมีความยาวเท่ากันกับแกน บรรทัดที่สามควรไม่มีช่องว่างต่อท้าย

ผลตอบแทน -1, 0, 1 สำหรับการตกทางซ้าย, สมดุลและการตกที่เหมาะสม


1

C # (. NET Core) , 127 95 90 + 18 = 108 ไบต์

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

s=>s.Split('\n')[0].Select((c,i)=>(c-31)*(i-s.Split('\n')[2].Length+1)).Sum().CompareTo(0)

ลองออนไลน์!

ขาออก:

-1 สำหรับทิปซ้าย
0 สำหรับสมดุล
1 สำหรับทิปขวา


1

Python 3, 217 ไบต์

ใช้งานได้ใน Python 2.7

def f(s):i,b,p=s.split('\n');c=p.find('|');l=sum((ord(e)-32)*(c-i.find(e))for e in i[:c])+sum(x for x in range(1,c+1));r=sum((ord(e)-32)*i[c:].find(e)for e in i[c:])+sum(x for x in range(len(b[c:])));return(l>r)-(r>l)

ส่งคืน 1 สำหรับด้านซ้าย, -1 สำหรับด้านขวาหรือศูนย์หากสมดุล

รุ่นที่อ่านได้:

def f(s):
    i,b,p = s.split('\n')
    c = p.find('|')

    l = sum((ord(e)-32)*(c-i.find(e))for e in i[:c])+sum(x for x in range(1, c+1))
    r = sum((ord(e)-32)*i[c:].find(e)for e in i[c:])+sum(x for x in range(len(b[c:])))

    return(l>r)-(r>l)

1
คุณไม่ต้องการsum([...])คุณสามารถทำได้sum(...)
Mr. Xcoder

@Daffy นี้ควรเป็น 100% ตามข้อกำหนดของคุณและทุกตัวอย่างที่ได้รับ หากคุณเห็นด้วยโปรดแจ้งให้เราทราบเพื่อที่ฉันจะได้ทำการปรับให้เหมาะสมต่อไป ขอขอบคุณ.
veganaiZe

@veganaiZe ผ่านการทดสอบทั้งหมดของฉันแล้วดูดี! :)
Daffy

1
สิ่งที่จะย่อให้เล็กลง: i[c:].find(e)สามารถi.find(e,c)ใช้i,m,n=s.split('\n')และหลีกเลี่ยงความต้องการsได้เลยใช้return 2*(r>l) or l>rเพื่อลดค่าใช้จ่ายในการทดสอบอย่างมากในตอนท้าย (ค่าส่งคืนเทียบเท่ากับตัวเลข แต่มันเป็นTrueแทนที่จะเป็น1และFalseแทนที่จะเป็น0) หรือใช้ชุดผลตอบแทนที่แตกต่างกัน ค่าและทำreturn (l>r)-(r>l)เพื่อส่งกลับ 1, 0 หรือ -1 ตามที่cmpฟังก์ชันเก่าทำ
ShadowRanger

ขอบคุณ ShadowRanger, Mr. Xcoder และ Daffy! @ShadowRanger ฉันต้องติดกับi[c:]เพราะวิธีที่สั้นกว่าทำให้เกิดปัญหาแบบออฟไลน์สำหรับการป้อนข้อมูลตัวพิมพ์เล็ก ๆ (ลองวาง|ตรงกลาง - เหนือแถบ)
veganaiZe

1

PHP, 105 ไบต์

for([$a,$b,$c]=explode("
",$argn);$b[$i];)$w+=(strpos($c,"|")-$i++)*8*(max(1,ord($a[$i])-31));echo$w<=>0;

พิมพ์-1/ 0/ 1สำหรับซ้าย / สมดุล / ขวา ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์

ทำให้พังถล่ม

for([$a,$b,$c]=explode("\n",$argn); # import input
    $b[$i];)                        # loop through bar
    $f+=                                # add to force:
        ($i-strpos($c,"|"))             # distance (<0 if left, >0 if right of pivot)
        *8                              # *8
        *(max(1,ord($a[$i++])-31));     # *weight
echo$f<=>0;                         # print -1 if $f<0, 1 if $f>0, 0 if $f==0

1

ถ่าน 31 ไบต์

A⁰ξFLθA⁺ξ×⁻ι⌕ζ|⁻℅§θι³¹ξI⁻›ξ⁰‹ξ⁰

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด เอาท์พุท 0 สำหรับยอดคงเหลือหรือ -1 หรือ 1 สำหรับการตกทางซ้ายหรือขวา แก้ไข: การเปลี่ยนแปลงใน Charcoal ตอนนี้หมายความว่าใช้≔ΣEθ×⁻κ⌕ζ|⁻℅ι³¹ξI⁻›ξ⁰‹ξ⁰งานได้ 24 ไบต์: ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด หมายเหตุ: คำตอบทั้งสองจำเป็นต้องมีการป้อนข้อมูลแบบเสริม แต่สามารถปรับให้รับแบบไม่มีการเสริมได้ที่ราคา 3 ไบต์: ≔⁰ξFLη≔⁺ξ×⁻ι⌕ζ|⁻℅§◨θLηι³¹ξI⁻›ξ⁰‹ξ⁰ ลองออนไลน์! ≔ΣE◨θLη×⁻κ⌕ζ|⁻℅ι³¹ξI⁻›ξ⁰‹ξ⁰ ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด


คุณอาจต้องการพูดถึงสิ่งนี้สิ่งนี้คาดว่าบรรทัดอินพุตจะถูกเพิ่มความยาวให้ถูกต้องด้วยช่องว่างดังนั้นอินพุตที่ไม่ได้เพิ่มอาจไม่ทำงาน
FlipTack

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