Roszpunka, Roszpunka, puść włosy!

20

Opis

Chyba wszyscy znają bajkę o Roszpunkach i księciu. Dla tych, którzy nie: przeczytaj tutaj. Jednak Roszpunka właśnie obciąła włosy, więc może nie potrwać wystarczająco długo, by pozwolić jej księciu wspiąć się na górę! Może być bardzo smutna ..

Wyzwanie

Twoim zadaniem jest napisanie funkcji, która ocenia to, co powie Roszponka, gdy książę wzywa ją, by upuściła włosy: gdy jej włosy są dłuższe lub równe wieży są wysokie i dodatkowy metr (wytyczne bezpieczeństwa), staje się bardzo szczęśliwy i mówi Aaaah!, przy czym liczba as jest taka sama jak length of her hair - height of the tower. W przeciwnym razie jej włosy nie mają wystarczającej długości i zaczyna płakać: Booho!gdzie os przed hrównymi dwiema trzecimi height of the tower - length of her hair, a os po h oznacza resztę. Liczba os po Bmusi być zaokrąglona, ​​więc jeśli dostaniesz 2.6, będą 3 os, a pozostałe muszą być za h.

I / O

Otrzymujesz dodatnie liczby całkowite (w tym null) jako argumenty, listę lub dwie pojedyncze liczby, w kolejności, w której uznasz to za najwygodniejsze, ale musisz określić, w jakiej kolejności je przyjmujesz. Jako wynik wydrukuj, co powie Rapunzel.

Przypadki testowe

W przypadkach testowych pierwszą liczbą będzie długość włosów.

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

To jest , więc wygrywa najkrótsza odpowiedź w bajtach!

racer290
źródło
5
Więc nie może zejść, jeśli wysokość wieży wynosi 0? BTW, dodatnie liczby całkowite (w tym null) == nieujemne liczby całkowite :)
Stewie Griffin
2
Chciałem to zrobić w twoim pierwszym poście, ale chciałbym opowiedzieć o piaskownicy , w której możesz zamieszczać wyzwania, aby uzyskać opinie, zanim opublikujesz je na głównej. To wydaje się być dość interesującym wyzwaniem, ale ludzie mogą dać się ponieść emocjom.
Cairair coinheringaahing
4
@StewieGriffin Tak, zakładając, że jej włosy 0też są długie . Mimo to musi wyjść z okna, obowiązują tu również ograniczenia bezpieczeństwa! Nie ma mowy, żeby mogła go poślubić, jeśli ma złamaną szyję.
racer290 16.07.17

Odpowiedzi:

5

Galaretka ,  43 41 40 38 34 33 32  31 bajtów

Prawdopodobnie jest wiele Czy istnieje krótsza droga ! ? ... to było trochę golfa!

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

Pełny program drukujący wynik *.

Wypróbuj online!

W jaki sposób?

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

* Jako monadyczny link zwraca listę znaków i listy znaków, np. ['B', [['o', 'o', 'h'], ['o']], '!']Jako pełny program druk niejawny rozbija to np.Booho!

Jonathan Allan
źródło
Tak jest. :-)
Erik the Outgolfer
Tak, zacząłem od pomysłu używania AL€œs3i znajdowania div przez zero błędów, a potem, gdy rozwiązałem ten problem przy znacznie dłuższym kodzie powyżej, wciąż potrzebowałem specjalnego przypadku o równej długości. Myślałem, że spróbuję dziś wprowadzić inny sposób, ale wygląda na to, że już to zrobiłeś.
Jonathan Allan
... mam na myśli, że myślałem 25-30 bajtów :)
Jonathan Allan
4

Python 3 , 87 bajtów

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

Wypróbuj online!

Argumenty funkcji są w porządku length of hair, height of tower.

notjagan
źródło
4

05AB1E , 38 35 32 bajtów

Kolejność wprowadzania: length of hair,height of tower

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

Wypróbuj online!

Wyjaśnienie

‹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
źródło
Wygląda na to, że zapomniałeś o tym, 3co pokazano w TIO.
Erik the Outgolfer,
@EriktheOutgolfer: Dziękujemy za powiadomienie. Naprawiłem wyjaśnienie, aby było zgodne z kodem :)
Emigna,
Aha, masz wyjaśnienia z powodu odstępów.
Erik the Outgolfer,
@EriktheOutgolfer: Nie widzę tego. Jeśli masz na myśli fakt, że są one w 2 ukośnych liniach, jest to celowe oddzielenie if-else w celu zmniejszenia używanej przestrzeni poziomej. Jeśli jest coś jeszcze, muszę być ślepy.
Emigna
Och,
pomyliłem się
4

JavaScript, 105 97 bajtów

Dzięki Oki za pomoc w oszczędzaniu 7 bajtów!

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

Definiuje anonimową funkcję curry. Użyj jakf(length)(height)

Wypróbuj online!

DanTheMan
źródło
Wygląda na to, że nie działa f(1)(4). Zastąpienie p(o+d)przez p(-o-d)może to naprawić. Możesz także użyć o=-d*2/3+.5|0do zapisania 7 bajtów.
Oki,
@ OK dziękuję za wskazanie tego błędu i pokazanie krótszego zaokrąglenia!
DanTheMan
p=(t,s='o')=>s.repeat(t)
tsh
2

PHP> = 7.1, 111 bajtów

[,$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
źródło
Kolejność argumentów 1. włosy 2. wieża?
racer290 16.07.17
@ racer290 Tak $ h włosy $ t wieża
Jörg Hülsermann
2

Galaretka , 32 bajty

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

Wypróbuj online!

-1 dzięki Jonathan Allan .

Działa tylko jako pełny program.

Argumenty są w kolejności: włosy, wieża

Erik the Outgolfer
źródło
Zapisać bajt zastępując ær0z+.
Jonathan Allan
@JonathanAllan Ooh to rzeczywiście działa. (cholera, wbudowany dwubajtowy)
Erik Outgolfer
0

Julia, 101 bajtów

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

Argumenty funkcji są w porządku length of Hair, height of Tower.

Tanj
źródło
Literówka: heigth of Hower
racer290 16.07.17
0

Galaretka , 84 76 bajtów

To naprawdę dość długie, ale poświęciłem temu zbyt wiele czasu, aby tego nie opublikować. Przyjmuje dwa argumenty całkowite:

  1. długość włosów
  2. długość wieży

Wszelkie wskazówki dotyczące gry w golfa będą mile widziane.

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

Wypróbuj online!

Élektra
źródło
Cóż, odpowiedź Jelly jest już znacznie krótsza
Cœur
0

R, 117 bajtów

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

Trochę długi, całkiem pewny, że można go zagrać w golfa. Pobiera dane wejściowe ze STDIN w kolejności Tower, Hair.

JAD
źródło
O o; tak naprawdę to nie działa na dane wejściowe1 4
Giuseppe,
0

Python 2 , 77 bajtów

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

Nienazwana funkcja pobierająca długość włosów hi wysokość wieży toraz zwracająca ciąg.

Wypróbuj online!

Tworzy ciąg rozpoczynający się od BA, następnie dwie trzecie różnicy zaokrąglonego ciągu oapowtórzone, następnie jeden h, następnie pozostała ilość aopowtórzeń i na koniec h!!. Zwracana wartość to wtedy co drugi znak rozpoczynający się albo od Blub Apoprzez notację wycinka [h>t::2].

Jonathan Allan
źródło
0

Perl, 107 bajtów

Najpierw bierze długość włosów, a drugą wieżę.

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
źródło
Możesz pozbyć się `` '' i zamienić swój kod o 4 spacje, aby wyglądał ładniej ...
Roman Gräf