Rapunzel, Rapunzel, saçını bırak!


20

Açıklama

Sanırım herkes Rapunzel ve prensin masalını biliyor. Yapmayanlar için: burada okuyun. Bununla birlikte, Rapunzel saçlarını kestirmişti, bu yüzden prensinin tırmanmasına izin vermek için yeterince uzun olmayabilir! Çok üzülebilir ..

Meydan okuma

Göreviniz, prens saçlarını bırakmak için onu çağırdığında Rapunzel'in ne söyleyeceğini değerlendiren bir işlev yazmaktır: Saçları kuleden daha uzun veya ona eşit olduğunda uzun ve ekstra bir metre (güvenlik yönergeleri), veeeery mutlu ve diyor s Aaaah!sayısı ile aaynıdır length of her hair - height of the tower. Aksi takdirde, saçları yeterli uzunluğa sahip değildir ve o ağlamaya başlıyor: Booho!nerede oönce ler heşit üçte ikisi height of the tower - length of her hairve osaatten sonra s dinlenme olmak. oZorunluluktan sonraki s sayısı Byuvarlatılmalıdır, eğer alırsanız 2.63 os olacaktır , diğerleri ise h.

I / O

En uygun bulduğunuz sırayla, bağımsız değişkenler, liste veya iki tek sayı olarak pozitif tamsayılar verilir, ancak bunları hangi sırayla aldığınız belirtilmelidir. Çıktı olarak Rapunzel'in söylediklerini yazdırın.

Test senaryoları

Test vakalarında, ilk sayı saç uzunluğu olacaktır.

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

Bu , bu yüzden bayt en kısa cevap kazanır!


5
Kulenin yüksekliği ise inemez 0mi? BTW, pozitif tamsayılar (null dahil) == _non-negatif tamsayılar :)
Stewie Griffin

2
Bunu ilk yayınınızda yapmak istedim, ancak size ana alana göndermeden önce geri bildirim almak için zorlukları gönderebileceğiniz Sandbox'tan bahsetmek istiyorum . Bu oldukça ilginç bir meydan okuma gibi görünüyor, ancak insanlar taşınabiliyor.
caird coinheringaahing

4
@StewieGriffin Yep, saç uzunluğunun da olduğunu varsayarak 0. Yine de, pencereden çıkmalı ve güvenlik kısıtlamaları burada da geçerli! Kendisi kırık bir boynu varsa onunla evlenmenin bir yolu yoktur.
racer290

Yanıtlar:


5

Jöle ,  43 41 40 38 34 33 32  31 bayt

Muhtemelen çok şey var Daha kısa bir yol var mı ! ? ... bu biraz golf oldu!

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

Sonucu basan tam bir program *.

Çevrimiçi deneyin!

Nasıl?

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

* Monadik bir bağlantı olarak, karakterlerin ve karakter listelerinin bir listesini döndürür ['B', [['o', 'o', 'h'], ['o']], '!'], örneğin , tam bir program olarak, örtük yazdırma bunu örn.Booho!



Evet kullanma fikriyle başladım AL€œs3ve div'ı sıfır hata ile buldum ve daha sonra yukarıda bulunan çok daha uzun kodla eşit uzunluktaki özel duruma hala ihtiyacım olduğunu söyledikten sonra. Bugün farklı bir yol denediğimi sanıyordum, ama zaten yapmış gibi görünüyorsun.
Jonathan Allan

... 25-30 bayt olduğunu düşünüyordum :)
Jonathan Allan

4

Python 3 , 87 bayt

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

Çevrimiçi deneyin!

İşlevine Argümanlar sırayla alınır length of hair, height of tower.


4

05AB1E , 38 35 32 bayt

Girdi sırası: length of hair,height of tower

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

Çevrimiçi deneyin!

açıklama

‹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 "!"

3TIO'da gösterileni unuttun .
Outgolfer Erik

@EriktheOutgolfer: Bildirdiğiniz için teşekkürler. Ben koduna uygunluk açıklaması düzeltildi :)
Emigna

Oh ve açıklamanızla ilgili boşluk sorunlarınız var.
Outgolfer Erik

@EriktheOutgolfer: Görmüyorum. Eğer 2 çapraz çizgi halinde olduklarını kastediyorsanız, bu kullanılan yatay alanı azaltmak için if-else kasıtlı olarak ayrılır. Başka bir şey varsa kör olmalıyım.
Emigna

Oh, içindeki yabancı boşlukla
karıştım

4

Javascript, 105 97 bayt

7 bayt tasarrufuna yardım ettiği için Oki'ye teşekkürler!

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

Anonim bir currying fonksiyonunu tanımlar. Gibi kullanınf(length)(height)

Çevrimiçi deneyin!


Çalışmıyor gibi görünüyor f(1)(4). Değiştirme p(o+d)ile p(-o-d)çözeriz diye. Ayrıca o=-d*2/3+.5|07 bayt kaydetmek için kullanabilirsiniz .
Oki

@ Oki bu hatayı gösterdiğin ve bana daha kısa bir yuvarlama gösterdiğin için teşekkürler!
DanTheMan

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



0

Julia, 101 bayt

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

İşlevine Argümanlar sırayla alınır length of Hair, height of Tower.



0

Jöle , 84 76 bayt

Gerçekten çok uzun, ama bunu yayınlamak için çok fazla zaman harcadım. İki tamsayı argümanı alır:

  1. saç uzunluğu
  2. kulenin uzunluğu

Bu golf hakkında herhangi bir ipucu mutluluk duyacağız.

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

Çevrimiçi deneyin!


Peki, çok daha kısa bir Jelly cevabı var
Cœur

0

R, 117 bayt

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

Biraz uzun, eminim bu golf aşağı olabilir. Sırayla STDIN'den girdi alır Tower, Hair.


A aa; bu aslında girdi için işe yaramıyor1 4
Giuseppe


0

Python 2 , 77 bayt

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

Saç uzunluğu, hkule yüksekliği t, ve bir dize döndüren isimsiz bir işlev .

Çevrimiçi deneyin!

Bir dize BA, ardından oatekrarlanan dizenin yuvarlatılmış farkının üçte ikisini , ardından tek bir diziyi h, daha sonra aotekrarlanan kalan miktarı ve son olarak bir dize oluşturur h!!. Dönüş değeri, dilim gösterimi ile Bveya Adilim gösterimi ile başlayan her ikinci karakterdir [h>t::2].


0

Perl, 107 bayt

Önce saç uzunluğunu, kule uzunluğunu alır.

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))}).'!'}

`` `'Den kurtulabilir ve daha güzel görünmesi için kodunuzu 4 boşlukla
niyetleyebilirsiniz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.