Generieren Sie eine Baseball Pitch String

11

Tor

Schreiben Sie ein Programm oder eine Funktion, die eine positive ganze Zahl verwendet nund zufällig eine zulässige Reihe von Tonhöhen (im Folgenden als Tonhöhenzeichenfolge bezeichnet) mit einer Länge generiert n.

Eingang

Eine positive ganze Zahl ungleich Null n<= 100

Ausgabe

Geben Sie eine zufällige Zeichenfolge oder eine Liste von Zeichen zurück, die eine mögliche gültige Tonhöhenzeichenfolge darstellen n. Die verwendeten Zeichen sind:

  • B - Ball. Wenn Sie 4 davon ansammeln, wird der Teig gelaufen und das Schlagen beendet.
  • S - Streik. Wenn Sie 3 davon ansammeln, ist der Teig leer und das Schlagen beendet.
  • F - Foul. Erhöht auch die Strike-Anzahl, kann aber den Teig nicht herausholen. Das heißt, Sie können nicht ein Foul als letzte Tonhöhe in einer gültigen Zeichenfolge haben. Alle Fouls nach zwei Schlägen / Fouls erhöhen die Schlagzahl nicht (der Schlagmann hat zu diesem Zeitpunkt bereits 2 Schläge und ein dritter würde ihn rausholen).
  • H - Treffer. Der Schlagmann hat einen Ball ins Spiel geschlagen und ist mit dem Schlagen fertig.

(Dies ist etwas vereinfacht, aber mach dir darüber keine Sorgen)

Gültige Tonhöhen sind solche, die mit einem Strike-Out, einem Walk oder einem Hit enden.

Dh eine ungültige Tonhöhenfolge hat entweder

  • zusätzliche Tonhöhen nach dem 4. Ball, 3. Schlag oder Treffer
  • Beendet vor dem Erzeugen eines 4. Balls, 3. Schlags oder Treffers.

Regeln

  • Ihr Programm muss in der Lage sein, alle möglichen Ergebnisse für eine bestimmte Eingabe zu erzielen.
  • Ihr Programm muss nicht einheitlich zufällig sein, sondern muss der vorherigen Regel folgen.
  • Das ist .

Beispiele

Input => Possible Outputs
1 => [H] #Can only end with a hit
2 => [S,H], [B,H], [F,H] #Can only end with a hit
3 => [S,S,S], [F,F,S], [B,B,H], ... #Can now strike-out, otherwise must end with a hit
4 => [B,B,B,B], [S,B,S,S], [B,F,S,S], [B,B,B,H], ... #Can now be walked, struck-out, or get a hit
6 => [S,B,S,B,B,H], [F,F,F,F,F,S], ... #Can now have a full-count (3 balls, 2 strikes) before finishing 

Input => Invalid Outputs
1 => [S], [B]    #Not enough for a strike-out/walk
2 => [S,S]       #Not enough for a strike-out/walk
2 => [H,H]       #Batter has already scored a hit
3 => [S,S,F]     #Fouls will not cause a strike-out
4 => [S,S,S,H]   #Batter has already struck out
5 => [B,B,B,B,B] #Batter has already walked
Veskah
quelle
1
Also müssen wir in der Lage sein, irgendwo von 1 bis unendlich F zu produzieren?
Quintec
Die Zeichenfolge ist höchstens 100 Zeichen lang. Fouls sind das, was so lange Pitching-Saiten erlaubt, zB 99 Fs und a Sist ein Strike-Out
Veskah
Oh, verstanden, habe das verpasst
Quintec
@ Quintec Umformuliert, um es für alle Fälle etwas expliziter zu machen
Veskah

Antworten:

4

Python 2 , 128 Bytes

from random import*
def g(n):
 x=i=S=0;r=''
 while(S>2)+x<3>=i-S:x=randint(0,3);r+='BFSH'[x];S+=x>0;i+=1
 return(i==n)*r or g(n)

Probieren Sie es online aus!

Generieren Sie die Pitch-Saite nach dem Zufallsprinzip, bis der Teig fertig ist, geben Sie sie aus, wenn sich herausstellt, dass sie die richtige Länge hat, und versuchen Sie es andernfalls erneut von Grund auf.


Python 2 , 136 Bytes

from random import*
def g(n):
 B=H=F=S=0;r=''
 while(F+S<3or'S'>x)>B/4+H:x=choice('BHFS');r+=x;exec x+"+=1"
 return(len(r)==n)*r or g(n)

Probieren Sie es online aus!

xnor
quelle
Kevins Hafen davon ließ mich erkennen, dass dies für höhere Zahlen zusammenbricht. n=8kann eine Kette von Fs am Ende
erzeugen
2
@ Veskah Schöner Fang. Ich hatte nicht berücksichtigt, dass die Anzahl der Treffer (Fouls zählen) möglicherweise auf 6 stieg und geändert wurde, um sie S/3zu (S>2)beheben.
xnor
4

05AB1E ,  44  50 44 Bytes

Durchgestrichen &nbsp;44&nbsp;ist nicht mehr 44 :)

[õ0U.µ["BFSH"3ÝΩ©è«®ĀX+U¼X2›®+3@¾X-3›~#}I¾Q#

Port of @xnors Python 2-Antwort , also stimmen Sie ihm ebenfalls zu, wenn Ihnen diese Antwort gefällt!
+6 Bytes aufgrund einer Fehlerbehebung und danach -6 Bytes wieder dank @xnor, indem er seinen Weg effizienter portiert als meine vorübergehende Umgehung , wie ich erwartet hatte. ;)

Probieren Sie es online aus oder überprüfen Sie weitere zufällige Ausgaben .

Erläuterung:

[                # Start an infinite loop:
 õ               #  (Re)set the result-string to an empty string ""
 0U              #  (Re)set variable `X` to 0
               #  Reset the counter_variable to 0
   [             #  Start an inner infinite loop:
    "BFSH"       #   Push string "BFSH"
          3ÝΩ    #   Push a random integer in the range [0,3]
             ©   #   Store this random integer in variable `r` (without popping)
              è  #   Index it into the string "BFSH"
               « #   Append it to the result-string
    ®Ā           #   If `r` is NOT 0:
      X+U        #    Increase `X` by 1
    ¼            #   Increase the counter_variable by 1
    X2›®+        #   Calculate `X`>2 (1 if truthy; 0 if falsey) + `r`
         3@      #   Check if this is larger than or equal to 3
    ¾X-          #   Calculate counter_variable - `X`
       3        #   Check if this is larger than 3
    ~            #   If either of the two checks above is truhy:
     #           #    Stop the inner infinite loop
   }             #  After the inner infinite loop:
    I¾Q          #  If the input and counter_variable are equal:
       #         #   Stop the outer infinite loop
                 # (and output the result-string at the top of the stack implicitly)
Kevin Cruijssen
quelle
1
@Veskah Ich habe vorerst eine einfache Lösung gefunden. Ich habe das Gefühl, dass xnor eine kürzere Korrektur durchführen kann, daher werde ich seine Korrektur wahrscheinlich portieren, um später einige Bytes zu sparen. :)
Kevin Cruijssen
1
Sie können das Problem beheben wie ich durch eine Änderung X/3zu X>2.
xnor
@xnor Danke, wieder zurück zu 44 Bytes. Ich wusste, dass Sie etwas kürzeres finden würden. ; p
Kevin Cruijssen
3

R , 148 Bytes

function(n){`~`=paste0
`*`=sample
o=""
while(nchar(o)<n-1){a=c("B"[T<4],"F","S"[F<2])*1
F=F+(a>"E")
T=T+(a<"F")
o=o~a}
o~c("B"[T>3],"H","S"[F>1])*1}

Probieren Sie es online aus!

Generiert die Zeichenfolge unter Verwendung der bedingten Aufnahme in die Stichprobendatensätze, um sicherzustellen, dass das Ergebnis eine mögliche Tonhöhenfolge ist.

Möglicherweise ist das Ablehnen-Sampling (wie in der Python-Antwort von xnor ) kürzer.

function(n){`~`=paste0		# alias
`*`=sample			# alias
o=""				# empty string for output
while(nchar(o)<n-1){		# do n-1 times:
a=c("B"[T<4],"F","S"[F<2])*1	# sample 1 from the string "BFS", conditionally including B or S if the ball/strike count is 3/2	
F=F+(a>"E")			# increment F (strike count) if sampled character is F or S
T=T+(a<"F")			# increment T (ball count) if sampled character is B
o=o~a}				# append a to output

o~c("B"[T>3],"H","S"[F>1])*1}	# append the sampled "BHS", conditionally including B or S if the ball/strike count is 3/2.

Zufällige "F und S" -Referenz , die jedes Mal in meinem Kopf spielte, wenn ich einen dieser Buchstaben tippte ...

Giuseppe
quelle
2

Pyth, 53 Bytes

u+GO?H+W<K/G\B3+W<Jl@"SF"G2\F\S\B+WqK3+WgJ2\H\S\B_UQ[

Probieren Sie es hier online aus .

Das fühlt sich viel zu lang an, ich denke, ein anderer Ansatz könnte erforderlich sein.

u+GO?H+W<K/G\B3+W<Jl@"SF"G2\F\S\B+WqK3+WgJ2\H\S\B_UQ[   Implicit: Q=eval(input())
                                                 _UQ    Reversed range from Q-1 to 0
u                                                   [   Reduce the above, with initial value G=[], next value as H:
                    @"SF"G                                Keep elements of G which are in "SF"
                   l                                      Length of the above
                  J                                       Store in J - this is the number of strikes and fouls so far
          /G\B                                            Count number of "B"s in G
         K                                                Store in K - this is the number of balls so far
    ?H                                                    If H is not 0 (i.e. not final pitch):
                           \F                               Start with "F" (foul is always available in non-final pitch)
                W<J       2                                 If J<2...
               +             \S                             ... append "S"
       W<K    3                                             If K<3...
      +                        \B                           ... append "B"
                                                          Else:
                                           \H               Start with "H" (hit is always available in final pitch)
                                       WgJ2                 If J >= 2...
                                      +      \S             ... append "S"
                                  WqK3                      If K == 3...
                                 +             \B           ... append "B"
   O                                                      Choose one element at random from the available options
 +G                                                       Append the above to G
                                                        Implicit print the result of the reduce operation
Sok
quelle
2

JavaScript (ES6),  107 106  99 Byte

f=(n,k=p=s=0,o='')=>p&&p>2|k-s>3|s>2&p<2?k-n?f(n):o:f(n,k+1,o+'FSBH'[p=Math.random()*4|0,s+=p<2,p])

Probieren Sie es online aus!

Kommentiert

f = (                       // f = recursive function taking:
  n,                        //   n = requested length
  k =                       //   k = pitch counter, initialized to 0
  p =                       //   p = last pitch
  s = 0,                    //   s = sum of strikes and fouls
  o = ''                    //   o = output string
) =>                        //
  p &&                      // if the last pitch was not a foul
  p > 2 |                   // AND the last pitch was a hit
  k - s > 3 |               //     OR we have 4 balls (or 3 balls + 1 hit)
  s > 2 & p < 2 ?           //     OR more than 2 strikes or fouls, ending with a strike:
    k - n ?                 //   if k is not equal to n:
      f(n)                  //     valid series but bad timing: try again from scratch
    :                       //   else:
      o                     //     success: return o
  :                         // else:
    f(                      //   do a recursive call:
      n,                    //     n is unchanged
      k + 1,                //     increment k
      o + 'FSBH'            //     append the pitch letter to o
        [ p = Math.random() //     pick a new random pitch
              * 4 | 0,      //     in [0..3]
          s += p < 2,       //     increment s if the pitch is a foul or a strike
          p ]               //     actual index in 'FSBH'
    )                       //   end of recursive call
Arnauld
quelle
2

Tinte , 120 119 116 117 Bytes

=f(n)
->g(n,3,2)
=g(n,b,s)
~n--
{n:{~{b:b->g(n,b-1,s)}|{s:s->g(n,b,s-1)}|}f->g(n,b,s-(s>0))|{~{b:h|b}|{s:h|s}|h}}->->

Probieren Sie es online aus!

Wahrscheinlich noch golfbar.

Ungolfed (leicht neu formatiert)

=f(length) // Define a stitch f, with one parameter which specifies the length of the created string. This is the intended entry point.
->g(length,3,2) // Instantly divert to g, defined below, with some extra parameters

=g(length,balls_left,strikes_left) // Define a stitch g, with three parameters.
~ length--                         // Decrement remaining length
{
    - length: // If this is not to be the last character in the string
              // randomly do one of the following:
              // 1. If balls_left is nonzero, print a b and recurse
              // 2. If strikes_left is nonzero, print an s and recurse
              // 3. Do nothing
              // If we did not divert earlier, print an f and recurse.
        {~{balls_left:b->g(length,balls_left-1,strikes_left)}|{strikes_left:s->g(length,balls_left,strikes_left-1)}|}f->g(length,balls_left,strikes_left-(strikes_left>0)) 
    - else: // Randomly do one of the following
            // 1. If a ball would result in a walk, print a b, otherwise an h.
            // 2. If a strike would result in a strikeout, print an s, otherwise an h.
            // 3. Just print an h.
            // And finally, halt.
        {~{balls_left:h|b}|{strikes_left:h|s}|h}}->->

Bearbeitungen

  1. Sparte ein Byte durch Beenden mit ->->statt ->END.
  2. Durch nfrüheres Dekrementieren wurden drei Bytes gespeichert .
  3. Es wurde ein Fehler behoben, der dank @veskah zum Erkennen von Strikeouts an falschen Stellen verursachte (+1 Byte).
Sara J.
quelle
1
Basierend auf den
Aufzeichnungen
1
@veskah Gut entdeckt, sollte jetzt behoben werden, danke
Sara J
1

Holzkohle , 57 Bytes

≔⁰η≔⁰ζF⊖N«≔‽⁺²‹ζ³ι¿›ι¹≦⊕ζ≦⊕η§SFB∨ι›η²»⊞υHF›η¹⊞υSF›ζ²⊞υB‽υ

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Erläuterung:

≔⁰η≔⁰ζ

Beginnen Sie mit 0 Bällen und 0 Schlägen.

F⊖N«

Durchlaufen Sie alle Lieferungen mit Ausnahme der letzten.

≔‽⁺²‹ζ³ι

Wenn es weniger als drei Bälle waren, generieren Sie eine Zufallszahl von 0 bis 2, andernfalls nur einen Münzwurf zwischen 0 und 1.

¿›ι¹≦⊕ζ≦⊕η

Ein zufälliger Wert von 2 ist ein Ball, andernfalls erhöht er die Schlagzahl.

§SFB∨ι›η²»

Die Werte 0 bis 2 sind auf Schlag, Foul und Ball abgebildet, außer dass bei drei Schlägen stattdessen Foul gedruckt wird. (Vier Bälle sind oben ausgeschlossen.)

⊞υHF›η¹⊞υSF›ζ²⊞υB‽υ

Bestimmen Sie, ob ein Schlag oder ein Ball den Schlagmann herausholen würde, und wählen Sie aus diesen oder einem Treffer aus.

Neil
quelle
1

Perl 5 , 122 Bytes

map{$B=$S=$H=0;while($B<4&&$S<3&&!$H&&/./g){${$&}++;$S+=$&eq F&&$S<2}y///c>pos||push@a,$_}glob"{B,F,H,S}"x<>;say$a[rand@a]

Probieren Sie es online aus!

Xcali
quelle
1
@ Veskah Ich habe diesen Teil verpasst. Repariert.
Xcali
1

C (GCC) 164 145 142 Bytes

-3 Bytes Deckenkatze

#define A(a)!i&&!r--?puts(#a),++a,--n:0;
b,s,f,h,i,r;p(n){srand(time(0));for(i=n;i--;){for(n=1;n;){r=rand()&3;b>2^!A(b)s+f>1^!A(s)!A(f)A(h)}}}

Probieren Sie es online aus

rtpax
quelle
Schlagen Sie &nstatttime(0)
Deckenkatze