Rapunzel, Rapunzel, lass dein Haar runter!

20

Beschreibung

Ich denke, jeder kennt das Märchen von Rapunzel und dem Prinzen. Für diejenigen, die dies nicht tun: lesen Sie es hier. Rapunzel hatte sich jedoch gerade die Haare schneiden lassen, sodass es möglicherweise nicht lang genug war, um ihren Prinzen aufsteigen zu lassen! Sie kann sehr traurig werden ..

Herausforderung

Deine Aufgabe ist es, eine Funktion zu schreiben, die auswertet, was Rapunzel sagt, wenn der Prinz sie auffordert, ihre Haare fallen zu lassen: Wenn ihre Haare länger oder gleich dem Turm sind, wird sie plus einem zusätzlichen Meter (Sicherheitsrichtlinien) Sehr fröhlich und sagt Aaaah!, mit ader gleichen Anzahl von s wie length of her hair - height of the tower. Andernfalls ist ihr Haar nicht lang genug und sie fängt an zu weinen: Booho!wobei das os vor hzwei Dritteln height of the tower - length of her hairund das os nach dem h der Rest ist. Die Anzahl der oSekunden nach dem Bmuss gerundet werden. Wenn Sie also erhalten 2.6, gibt es 3 oSekunden, und die anderen müssen nach dem sein h.

I / O

Sie erhalten positive Ganzzahlen (einschließlich Null) als Argumente, als Liste oder als zwei einzelne Zahlen, und zwar in der Reihenfolge, in der Sie dies für am bequemsten halten. Sie müssen jedoch angeben, in welcher Reihenfolge Sie sie verwenden. Drucken Sie als Ausgabe aus, was Rapunzel sagen wird.

Testfälle

In den Testfällen ist die erste Zahl die Haarlänge.

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

Das ist , also gewinnt die kürzeste Antwort in Bytes!

racer290
quelle
5
Sie kann also nicht runter, wenn die Höhe des Turms ist 0? Übrigens, positive ganze Zahlen (einschließlich null) == _non-negative ganze Zahlen :)
Stewie Griffin
2
Ich wollte dies in Ihrem ersten Beitrag tun, aber ich möchte Ihnen etwas über die Sandbox erzählen , in der Sie Herausforderungen posten können, um Feedback zu erhalten, bevor Sie sie an main senden. Dies scheint eine interessante Herausforderung zu sein, aber die Leute können mitgerissen werden.
Caird Coinheringaahing
4
@StewieGriffin Yep, vorausgesetzt, ihre Haarlänge ist 0auch. Trotzdem muss sie aus dem Fenster steigen und auch hier gelten die Sicherheitsbestimmungen! Sie kann ihn auf keinen Fall heiraten, wenn sie sich den Hals gebrochen hat.
racer290

Antworten:

5

Jelly ,  43 41 40 38 34 33 32  31 Bytes

Es ist wahrscheinlich eine viel Gibt es einen kürzeren Weg , obwohl ! ? ... das war ziemlich viel Golf!

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

Ein vollständiges Programm zum Ausdrucken des Ergebnisses *.

Probieren Sie es online!

Wie?

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

* Als monadischen Link eine Liste von Zeichen und Zeichenlisten zB gibt ['B', [['o', 'o', 'h'], ['o']], '!'], als ein volles Programm der implizite Druck zerschlägt diese zBBooho!

Jonathan Allan
quelle
Ja, das gibt es. :-)
Erik der Outgolfer
Ja, ich habe mit der Idee angefangen AL€œs3, div by zero-Fehler zu verwenden und zu finden, und nachdem ich mich damit befasst hatte, dass ich mit dem viel längeren Code, den ich oben gefunden habe, immer noch den Sonderfall mit der gleichen Länge brauchte. Ich dachte, ich würde versuchen, einen anderen Weg heute zu implementieren, aber sieht so aus, als ob Sie es bereits getan haben.
Jonathan Allan
... wohlgemerkt, ich dachte 25-30 Bytes :)
Jonathan Allan
4

Python 3 , 87 Bytes

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

Probieren Sie es online!

Argumente für die Funktion in der Reihenfolge genommen length of hair, height of tower.

notjagan
quelle
4

05AB1E , 38 35 32 Bytes

Eingabereihenfolge: length of hair,height of tower

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

Probieren Sie es online!

Erläuterung

‹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
quelle
Sie haben anscheinend einen vergessen 3, der auf TIO angezeigt wird.
Erik der Outgolfer
@EriktheOutgolfer: Danke für die Benachrichtigung. Ich habe die Erklärung
korrigiert
Oh, und Sie haben Platzprobleme mit Ihrer Erklärung.
Erik der Outgolfer
@EriktheOutgolfer: Ich sehe es nicht. Wenn Sie die Tatsache meinen, dass sie sich in 2 diagonalen Linien befinden, ist dies eine absichtliche Trennung von if-else, um den verwendeten horizontalen Raum zu verringern. Wenn es noch etwas gibt, muss ich blind sein.
Emigna
Oh, ich war verwirrt mit dem
überflüssigen
4

Javascript, 105 97 Bytes

Danke an Oki für die Hilfe beim Speichern von 7 Bytes!

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

Definiert eine anonyme Curry-Funktion. Verwenden Sie wief(length)(height)

Probieren Sie es online!

DanTheMan
quelle
Scheint nicht zu funktionieren f(1)(4). Das Ersetzen p(o+d)durch p(-o-d)könnte dieses Problem beheben. Sie können auch o=-d*2/3+.5|07 Bytes speichern.
Oki
@Oki danke, dass du auf diesen Fehler hingewiesen und mir die kürzere Rundung gezeigt hast!
DanTheMan
p=(t,s='o')=>s.repeat(t)
Dienstag,
2

PHP> = 7.1, 111 Bytes

[,$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
quelle
Argument Reihenfolge 1. Haar 2. Turm?
racer290
@ racer290 Ja $ h Haare $ t Turm
Jörg Hülsermann
2

Jelly , 32 Bytes

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

Probieren Sie es online!

-1 Danke an Jonathan Allan .

Funktioniert nur als Vollprogramm.

Argumente sind angebracht: Haare, Turm

Erik der Outgolfer
quelle
Speichern Sie ein Byte durch den Austausch ær0mit+.
Jonathan Allan
@ JonathanAllan Ooh es funktioniert in der Tat. (verdammt zwei Byte eingebaut)
Erik der Outgolfer
0

Julia, 101 Bytes

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

Argumente für die Funktion in der Reihenfolge genommen length of Hair, height of Tower.

Tanj
quelle
Tippfehler: Höhe von Hower
racer290
0

Jelly , 84 76 Bytes

Es ist wirklich ziemlich lang, aber ich habe zu viel Zeit damit verbracht, es nicht zu posten. Nimmt zwei ganzzahlige Argumente an:

  1. Länge der Haare
  2. Länge des Turms

Alle Tipps zum Golfen dies wäre dankbar.

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

Probieren Sie es online!

Élektra
quelle
Nun, es gibt bereits eine viel kürzere Antwort von Jelly
Cœur
0

R, 117 Bytes

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

Ein bisschen lang, ziemlich sicher, dass man Golf spielen kann. Übernimmt die Eingabe von STDIN in der Reihenfolge Tower, Hair.

JAD
quelle
uh-oh; Dies funktioniert nicht wirklich für die Eingabe1 4
Giuseppe
0

Python 2 , 77 Bytes

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

Eine unbenannte Funktion, die Haarlänge, hTurmhöhe tund eine Zeichenfolge zurückgibt.

Probieren Sie es online!

Erstellt eine Zeichenfolge, die mit beginnt BA, gefolgt von zwei Dritteln der Differenz, gerundet von der oawiederholten Zeichenfolge , gefolgt von einer einzelnen h, dann der verbleibenden Anzahl von aowiederholten und schließlich h!!. Der Rückgabewert ist dann jedes zweite Zeichen, beginnend entweder mit der Boder Aüber die Slice-Notation [h>t::2].

Jonathan Allan
quelle
0

Perl, 107 Bytes

Nimmt zuerst die Haarlänge, dann die Turmlänge.

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))}).'!'}
Byteschieber
quelle
Sie können das `` `loswerden und Ihren Code um 4 Leerzeichen erweitern, damit er besser aussieht.
Roman Gräf