ราพันเซลราพันเซลปล่อยผมของคุณ!


20

ลักษณะ

ฉันเดาว่าทุกคนรู้เทพนิยายของราพันเซลและเจ้าชาย สำหรับผู้ที่ไม่ได้อ่านที่นี่ อย่างไรก็ตามราพันเซลเพิ่งตัดผมของเธอดังนั้นมันอาจจะไม่นานพอที่จะให้เจ้าชายของเธอปีนขึ้นไป! เธออาจเศร้ามาก ..

ท้าทาย

งานของคุณคือการเขียนฟังก์ชั่นที่ประเมินว่าราพันเซลจะพูดอะไรเมื่อเจ้าชายเรียกให้เธอปล่อยผมของเธอ: เมื่อผมของเธอยาวกว่าหรือเท่ากับหอคอยนั้นสูง veeeery มีความสุขและบอกว่าAaaah!มีจำนวนของas length of her hair - height of the towerเป็นเช่นเดียวกับ มิฉะนั้นผมของเธอไม่ได้มีความยาวเพียงพอและเธอก็เริ่มร้องไห้: Booho!ที่os ก่อนที่hเท่ากับสองในสามของheight of the tower - length of her hairและoหลังจากเอชเป็นส่วนที่เหลือ จำนวนos หลังจากที่Bต้องได้รับการปัดเศษดังนั้นถ้าคุณได้รับ2.6จะมี 3 oวินาที, และคนอื่น ๆ hจะต้องเป็นหลังจากที่

I / O

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

กรณีทดสอบ

ในกรณีทดสอบหมายเลขแรกจะเป็นความยาวของผม

0, 0 -> 'Bh!' (probably a dry sob..)
2, 1 -> 'Aah!'
1, 2 -> 'Boh!'
1, 4 -> 'Booho!'
4, 1 -> 'Aaaah!'
2, 4 -> 'Boho!'

นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!


5
ดังนั้นเธอจึงไม่สามารถลงได้ถ้าความสูงของหอคอยคือ0อะไร? BTW, จำนวนเต็มบวก (รวมถึง null) == จำนวนเต็ม _non-negative :)
Stewie Griffin

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

4
@StewieGriffin Yep สมมติว่าผมของเธอยาว0เกินไป ถึงกระนั้นเธอก็ต้องออกไปนอกหน้าต่างและมีข้อ จำกัด เรื่องความปลอดภัยเช่นกัน! ไม่มีทางที่เธอจะแต่งงานกับเขาได้หากเธอมีคอหัก
racer290

คำตอบ:


5

เยลลี่ ,  43 41 40 38 34 33 32  31 ไบต์

มีวิธีที่สั้นกว่านี้ไหม! ? ... นี่มันค่อนข้างเล่นกอล์ฟ!

‘:3;ạ¥⁸4ẋ+;€⁹¦7Ṛṭ;8ị“øŻPLC»
ạç>

โปรแกรมเต็มรูปแบบพิมพ์ผลลัพธ์ *

ลองออนไลน์!

อย่างไร?

‘:3;ạ¥⁸4ẋ+;€⁹¦7Ṛṭ;8ị“øŻPLC» - Link 1: number, abs(hair-tower); number, (hair > tower)?
‘                           - increment -> abs(hair-tower)+1
 :3                         - integer divide by 3 -> (abs(hair-tower)+1)//3
                            -   ...the remainder amount after removing 2/3 rounded
      ⁸                     - chain's left argument, abs(hair-tower)
     ¥                      - last two links as a dyad:
    _                       -   subtract (yields the 2/3 rounded amount)
   ;                        - concatenate
       4ẋ                   - repeat 4 (vectorises) (i.e. [[4,4,...],[4,...]])
         +                  - add (hair > tower)? (vectorises) (i.e. 4s->5s if so)
             ¦              - sparse application:
          ;€  7             - of:  concatenate €ach with a 7
            ⁹               - to indexes: chain's right argument, (hair-tower)?
               Ṛ            - reverse the list
                ṭ           - tack (hair-tower)?
                 ;8         - concatenate an 8
                    “øŻPLC» - compression of the word "Abroach" & the string "!B"
                   ị        - index into "Abroach!B" (1-indexed & modular, so 0->B)
                            - implicit (smashed) print

ạç> - Main link: number, hair; number, tower
ạ   - absolute difference -> abs(hair-tower)
  > - greater than? -> (hair > tower)? (1 if so, else 0)
 ç  - call the last link (1) as a dyad

* เป็นลิงค์ monadic มันจะคืนค่ารายการของตัวละครและรายชื่อตัวละครเช่น['B', [['o', 'o', 'h'], ['o']], '!']เป็นโปรแกรมเต็มรูปแบบที่พิมพ์โดยปริยายแตกเช่นนี้Booho!



ใช่ฉันเริ่มต้นด้วยแนวคิดของการใช้AL€œs3และพบข้อผิดพลาด div โดยไม่มีศูนย์แล้วหลังจากที่ฉันแจ้งว่าด้วยโค้ดที่ยาวกว่านั้นฉันพบว่าฉันยังจำเป็นต้องใช้ตัวพิมพ์เล็กและยาวเท่ากัน ฉันคิดว่าวันนี้ฉันพยายามและใช้วิธีที่ต่างออกไป แต่ดูเหมือนว่าคุณได้ทำไปแล้ว
Jonathan Allan

... ใจคุณฉันคิด 25-30 bytes :)
Jonathan Allan


4

05AB1E , 38 35 32 ไบต์

ป้อนคำสั่งซื้อ: length of hair,height of tower

‹i¹α'a×"Aÿh!"ë¹-x‚>3÷R'o×'hý…Bÿ!

ลองออนไลน์!

คำอธิบาย

‹i                                  # if h < l
  ¹α                                # push absolute difference of h and l
    'a×                             # repeat "a" that many times
       "Aÿh!"                       # interpolate between "A" and "h!"
 ë                                  # else 
  ¹-                                # push h-l
    x‚                              # pair with its double
      >3÷                           # increment and integer divide by 3
         R                          # reverse the list
          'o×                       # for each, repeat "o" that many times
             'hý                    # merge the o's on "h"
                …Bÿ!                # interpolate between "B" and "!"

คุณดูเหมือนจะลืมสิ่ง3ที่ปรากฏบน TIO
Erik the Outgolfer

@EriktheOutgolfer: ขอบคุณสำหรับการแจ้งเตือน ฉันได้รับการแก้ไขคำอธิบายเพื่อให้สอดคล้องกับรหัส :)
Emigna

โอ้และคุณมีปัญหาในการเว้นวรรคกับคำอธิบายของคุณ
Erik the Outgolfer

@EriktheOutgolfer: ฉันไม่เห็น ถ้าคุณหมายถึงความจริงที่ว่าพวกมันอยู่ในเส้นทแยงมุม 2 เส้นนั่นเป็นการแยกโดยเจตนาของ if-else เพื่อลดการใช้พื้นที่แนวนอน หากมีอย่างอื่นฉันต้องตาบอด
Emigna

โอ้ฉันสับสนกับช่องว่างที่ไม่เกี่ยวข้องในนั้น ...
Erik the Outgolfer

4

Javascript, 105 97 ไบต์

ขอบคุณโอกิที่ช่วยประหยัดได้ 7 ไบต์!

p=(t,s)=>(s||"o").repeat(t)
l=>h=>(d=l-h,o=d/3-.5|0,l>h?`A${p(d,"a")}h`:`B${p(o-d)}h`+p(-o))+"!"

กำหนดฟังก์ชั่นการปิดบังที่ไม่ระบุชื่อ ใช้เหมือนf(length)(height)

ลองออนไลน์!


ดูเหมือนจะใช้งานf(1)(4)ไม่ได้ การแทนที่p(o+d)ด้วยp(-o-d)สามารถแก้ไขได้ นอกจากนี้คุณสามารถใช้o=-d*2/3+.5|0เพื่อบันทึก 7 ไบต์
โอกิ

@ โอกิขอบคุณสำหรับการชี้ให้เห็นข้อผิดพลาดนั้นและแสดงการปัดเศษที่สั้นกว่า
DanTheMan

p=(t,s='o')=>s.repeat(t)
tsh


2

เยลลี่ 32 ไบต์

_‘”aẋŒt;⁾h!ɓ_÷1.,3+.”oẋ“Bh!”żð>?

ลองออนไลน์!

-1 ขอบคุณที่โจนาธานอัลลัน

ทำงานเป็นโปรแกรมเต็มรูปแบบเท่านั้น

ข้อโต้แย้งอยู่ในลำดับ: ผมหอคอย


บันทึกไบต์โดยแทนที่ær0ด้วย+.
Jonathan Allan

@JanathanAllan Ooh มันใช้งานได้จริง (แช่งสร้างขึ้นสองไบต์)
Erik the Outgolfer

0

จูเลีย 101 ไบต์

g(h,t)=h>t?string("A","a"^(h-t),"h!"):string("B","o"^round(Int,(t-h)*2/3),"h","o"^round(Int,(t-h)/3))

ข้อโต้แย้งที่จะฟังก์ชั่นที่มีการดำเนินการในการสั่งซื้อ,length of Hairheight of Tower


Typo: ความสูงของ Hower
racer290

0

เยลลี่ , 84 76 ไบต์

มันค่อนข้างยาวมาก แต่ฉันใช้เวลามากเกินไปในการไม่โพสต์ รับอาร์กิวเมนต์จำนวนเต็มสองรายการ:

  1. ความยาวของผม
  2. ความยาวของหอคอย

เคล็ดลับใด ๆ เกี่ยวกับการเล่นกอล์ฟนี้จะได้รับการชื่นชม

³>⁴×111ð;ø³>⁴¬×97
97ðxø³ạ⁴
111ðxø¢L÷3×⁸ær0:1
2Çṭ2£“h”ṭµ1ÇṭµFḟ1£
>¬+65¥;¢;33Ọ

ลองออนไลน์!


ดีมีอยู่แล้วคำตอบที่สั้นมาก Jelly
Cœur

0

R, 117 ไบต์

x=diff(scan());cat(`if`(x>0,paste0("A",rep("a",x),"h!"),paste0("B",rep("o",F<-round(-2*x/3)),"h",rep("o",-x-F),"!")))

ค่อนข้างยาวค่อนข้างแน่ใจว่าสิ่งนี้สามารถลงสนามได้ นำข้อมูลจาก STDIN Tower, Hairในการสั่งซื้อ


เอ่อโอ้; สิ่งนี้ใช้งานไม่ได้กับอินพุตจริงๆ1 4
จูเซปเป้


0

Python 2 , 77 ไบต์

lambda h,t:("BA"+(abs(h-t)*2+1)/3*"oa"+"h"+(abs(h-t)+1)/3*"ao"+"h!!")[h>t::2]

ฟังก์ชันที่ไม่มีชื่อซึ่งใช้ความยาวของผมhและความสูงของหอคอยtและส่งคืนสตริง

ลองออนไลน์!

สร้างสตริงที่เริ่มต้นด้วยBAตามด้วยสองในสามของความแตกต่างโค้งมนของสตริงoaซ้ำตามด้วยซิงเกิ้ลhแล้วจำนวนเงินที่เหลือของการทำซ้ำและในที่สุดก็ao h!!ค่าตอบแทนเป็นแล้วตัวละครทุกตัวที่สองเริ่มต้นด้วยการอย่างใดอย่างหนึ่งBหรือผ่านทางสัญกรณ์ชิ้นA[h>t::2]


0

Perl, 107 ไบต์

ใช้ความยาวของผมก่อน, ความยาวของหอคอยที่สอง

sub b{(($c=$_[0]-$_[1])>0?'A'.'a'x--$c.'h':do{$o=int(2/3*($c*=-1)+.5);'B'.('o'x$o).'h'.('o'x($c-$o))}).'!'}

คุณสามารถกำจัด `` `และตั้งใจให้โค้ดของคุณมีช่องว่าง 4 ช่องเพื่อทำให้ดูดีขึ้น ..
Roman Gräf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.