Rapunzel, Rapunzel, lepaskan rambutmu!

20

Deskripsi

Saya kira semua orang tahu dongeng Rapunzel dan sang pangeran. Bagi yang tidak: baca di sini. Namun, Rapunzel baru saja memotong rambutnya, jadi mungkin tidak cukup lama untuk membiarkan pangeran memanjat! Dia mungkin sangat sedih ..

Tantangan

Tugas Anda adalah menulis fungsi yang mengevaluasi apa yang akan dikatakan Rapunzel ketika sang pangeran memanggilnya untuk membiarkan rambutnya rontok: Ketika rambutnya lebih panjang atau sama dengan menara itu tinggi ditambah meter tambahan (pedoman keselamatan), ia menjadi veeeery senang dan berkata Aaaah!, dengan jumlah ayang sama dengan length of her hair - height of the tower. Kalau tidak, rambutnya tidak memiliki panjang yang cukup, dan dia mulai menangis:, di Booho!mana os sebelum hdua pertiga dari height of the tower - length of her hair, dan os setelah h adalah sisanya. Jumlah os setelah Bharus dibulatkan, jadi jika Anda dapatkan 2.6, akan ada 3 os, dan yang lainnya harus setelah h.

I / O

Anda diberi bilangan bulat positif (termasuk nol) sebagai argumen, sebagai daftar atau dua angka tunggal, dalam urutan yang Anda anggap paling nyaman, tetapi Anda harus menyatakan dalam urutan mana Anda mengambilnya. Sebagai hasilnya, cetak apa yang akan dikatakan Rapunzel.

Uji kasus

Dalam kasus uji, angka pertama adalah panjang rambut.

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

Ini , jadi jawaban tersingkat dalam byte menang!

racer290
sumber
5
Jadi dia tidak bisa turun jika ketinggian menara itu 0? BTW, bilangan bulat positif (termasuk nol) == bilangan bulat negatif-negatif :)
Stewie Griffin
2
Saya bermaksud melakukan ini pada posting pertama Anda, tetapi saya ingin memberi tahu Anda tentang Sandbox , tempat Anda dapat memposting tantangan untuk mendapatkan umpan balik sebelum mempostingnya ke utama. Ini sepertinya tantangan yang cukup menarik tetapi orang bisa terbawa suasana.
caird coinheringaahing
4
@StewieGriffin Yep, dengan asumsi bahwa panjang rambutnya 0juga. Tetap saja, dia harus keluar dari jendela, dan pembatasan keamanan juga berlaku di sini! Tidak mungkin dia bisa menikah dengannya jika lehernya patah.
racer290

Jawaban:

5

Jelly ,  43 41 40 38 34 33 32  31 byte

Mungkin ada banyak. Apakah ada cara yang lebih pendek ! ? ... ini golf!

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

Program lengkap mencetak hasilnya *.

Cobalah online!

Bagaimana?

‘: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

* Sebagai tautan monadik ia mengembalikan daftar karakter dan daftar karakter mis. ['B', [['o', 'o', 'h'], ['o']], '!'], Sebagai program lengkap cetakan implisit menghancurkan eg iniBooho!

Jonathan Allan
sumber
Ya ada. :-)
Erik the Outgolfer
Ya saya mulai dengan ide untuk menggunakan AL€œs3dan menemukan div dengan nol kesalahan dan kemudian setelah saya mengatasinya dengan kode yang jauh lebih lama ditemukan saya masih perlu kasus khusus kasus panjang yang sama. Saya pikir saya akan mencoba dan menerapkan cara yang berbeda hari ini, tetapi sepertinya Anda sudah melakukannya.
Jonathan Allan
... ingatlah, aku sedang memikirkan 25-30 byte :)
Jonathan Allan
4

Python 3 , 87 byte

lambda l,h:["B"+"o"*round((h-l)*2/3)+"h"+"o"*round((h-l)/3),"A"+"a"*(l-h)+"h"][l>h]+"!"

Cobalah online!

Argumen untuk fungsi yang diambil dalam urutan length of hair, height of tower.

notjagan
sumber
4

05AB1E , 38 35 32 byte

Agar masukan: length of hair,height of tower

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

Cobalah online!

Penjelasan

‹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 "!"
Emigna
sumber
Anda sepertinya sudah lupa 3yang ditampilkan di TIO.
Erik the Outgolfer
@EriktheOutgolfer: Terima kasih telah memberi tahu. Saya telah memperbaiki penjelasan agar sesuai dengan kode :)
Emigna
Oh, dan Anda memiliki masalah jarak dengan penjelasan Anda.
Erik the Outgolfer
@EriktheOutgolfer: Saya tidak melihatnya. Jika Anda maksudkan fakta bahwa mereka berada dalam 2 garis diagonal, itu adalah pemisahan yang disengaja dari if-else untuk mengurangi ruang horizontal yang digunakan. Jika ada hal lain saya pasti buta.
Emigna
Oh, saya bingung dengan ruang kosong di
luarnya
4

Javascript, 105 97 byte

Terima kasih kepada Oki karena telah membantu menghemat 7 byte!

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))+"!"

Menentukan fungsi kari anonim. Gunakan likef(length)(height)

Cobalah online!

DanTheMan
sumber
Sepertinya tidak berhasil f(1)(4). Mengganti p(o+d)dengan p(-o-d)bisa memperbaiki ini. Anda juga dapat menggunakan o=-d*2/3+.5|0untuk menyimpan 7 byte.
Oki
@Oki terima kasih telah menunjukkan kesalahan itu dan menunjukkan pembulatan yang lebih pendek kepada saya!
DanTheMan
p=(t,s='o')=>s.repeat(t)
tsh
2

PHP> = 7.1, 111 byte

[,$h,$t]=$argv;echo BA[$b=$h>$t],($r=str_repeat)(oa[$b],$c=round(($a=abs($h-$t))*($b?:2/3))),h,$r(o,$a-$c),"!";

PHP Sandbox Online

Jörg Hülsermann
sumber
Urutan argumen 1. rambut 2. menara?
racer290
@ racer290 Ya $ h rambut $ t menara
Jörg Hülsermann
2

Jelly , 32 byte

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

Cobalah online!

-1 terima kasih kepada Jonathan Allan .

Hanya berfungsi sebagai program lengkap.

Argumennya berurutan: rambut, menara

Erik the Outgolfer
sumber
Simpan satu byte dengan menggantinya ær0dengan+.
Jonathan Allan
@ Jonathan Allan Ooh itu memang bekerja. (builtin dua byte sialan)
Erik the Outgolfer
0

Julia, 101 byte

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))

Argumen untuk fungsi yang diambil dalam urutan length of Hair, height of Tower.

Tanj
sumber
Typo: heigth of Hower
racer290
0

Jelly , 84 76 byte

Ini agak lama, tapi saya menghabiskan terlalu banyak waktu untuk tidak mempostingnya. Membawa dua argumen integer:

  1. panjang rambut
  2. panjang menara

Setiap tips tentang golf ini akan sangat dihargai.

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

Cobalah online!

Élektra
sumber
yah, sudah ada jawaban Jelly yang jauh lebih pendek
Cœur
0

R, 117 byte

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),"!")))

Agak panjang, cukup yakin ini bisa diturunkan. Mengambil input dari STDIN dalam urutan Tower, Hair.

JAD
sumber
uh oh; ini sebenarnya tidak bekerja untuk input1 4
Giuseppe
0

Python 2 , 77 byte

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

Fungsi yang tidak disebutkan namanya mengambil panjang rambut h,, dan tinggi menara t,, dan mengembalikan string.

Cobalah online!

Membangun string dimulai dengan BA, diikuti oleh dua pertiga dari perbedaan putaran dari string yang oadiulang, diikuti oleh satu h, kemudian jumlah sisanya aodiulang, dan akhirnya h!!. Nilai kembali kemudian setiap karakter kedua dimulai dengan salah satu Batau Amelalui notasi slice [h>t::2].

Jonathan Allan
sumber
0

Perl, 107 byte

Mengambil panjang rambut pertama, panjang menara kedua.

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))}).'!'}
bytepusher
sumber
Anda dapat menyingkirkan `` `dan ingin kode Anda sebanyak 4 spasi agar terlihat lebih bagus ..
Roman Gräf