Створіть струнку бейсбольної пітч


11

Мета

Напишіть програму або функцію, яка приймає натуральне ціле число nі випадковим чином генерує законний ряд пітчів (звідси називається рядком Pitch) довжини n.

Вхідні дані

Ненульове натуральне число n<= 100

Вихідні дані

Поверніть випадковий рядок або список символів, які представляють можливу дійсну строку висоти висоти n. Використовувані символи будуть:

  • Б - куля. Якщо ви накопичите 4 з них, тісто пройдіться і закінчіть ватин.
  • S - Страйк. Якщо ви накопичите 3 з них, тісто вийде і закінчите ватин.
  • F - Фол. Також збільшиться кількість страйків, але не може вивести тісто. Тобто, ви не можете, щоб Foul був останнім кроком у дійсному рядку. Будь-які фоли, що пройшли через два удари / фоли, не збільшать кількість страйків (тісто вже має 2 удари в той момент, і 3-й би його вивів).
  • Н - Хіт. Тісто влучило в кульку і закінчилося ватин.

(Це трохи спрощено, але не турбуйтеся про це)

Дійсні струнні тони - це ті, що закінчуються зачепленням, прогулянкою чи ударом.

Тобто, недійсна рядок висоти висоти

  • додаткові майданчики після 4-го м'яча, 3-го удару або удару
  • припиняється перед створенням 4-го м'яча, 3-го удару або удару.

Правила

  • Ваша програма повинна мати можливість виробляти всі можливі результати для даного введення.
  • Ваша програма не повинна бути рівномірно випадковою, але все ж повинна дотримуватися попереднього правила.
  • Це .

Приклади

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

1
Отже, ми повинні мати можливість виробляти десь від 1 до нескінченних F?
Квінтек

Рядок матиме не більше 100 символів. Фоли - це те, що дозволяє настільки довгі струнні струни, наприклад, 99 Fs і a S- це
зачеплення

Ой, зрозумів, пропустив це
Квінтек,

@Quintec Перейменував це трохи виразніше, про всяк випадок
Веска

Відповіді:


4

Python 2 , 128 байт

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)

Спробуйте в Інтернеті!

Випадково генеруйте рядок висоти, поки не буде зроблено тісто, виведіть його, якщо виявиться потрібної довжини, інакше спробуйте знову з нуля.


Пітон 2 , 136 байт

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)

Спробуйте в Інтернеті!


Порт Кевіна цього змусив мене зрозуміти, що це руйнується для більшої кількості. n=8може генерувати ланцюжок Fs в кінці
Веска

2
@Veskah Хороший улов. Я не врахував кількість страйків (підрахунок фолів), можливо, до 6, і зміни, S/3щоб (S>2)виправити це.
xnor

4

05AB1E ,  44  50 44 байт

Перекреслено &nbsp;44&nbsp;вже не 44 :)

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

Порт відповіді Python 2 від @xnor , тому обов'язково підтримайте його, якщо вам подобається ця відповідь!
+6 байт за рахунок виправлення помилок, а після цього -6 байт знову завдяки @xnor, перенісши його спосіб більш ефективного виправлення порівняно з моєю тимчасовою роботою, як я очікував. ;)

Спробуйте в Інтернеті або перевірте ще кілька випадкових результатів .

Пояснення:

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

1
@Veskah Наразі я зробив прямий виправлення. У мене таке відчуття, що xnor здатний виконати коротший виправлення, тому я, ймовірно, передам його виправлення, щоб потім зберегти кілька байт. :)
Kevin Cruijssen

1
Ви можете виправити це, як я, змінивши X/3на X>2.
xnor

@xnor Спасибі, знову на 44 байти. Я знав, що ти знайдеш щось коротше. ; p
Kevin Cruijssen

3

R , 148 байт

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}

Спробуйте в Інтернеті!

Генерує рядок, використовуючи умовне включення до наборів даних вибірки, щоб гарантувати, що результат є можливою послідовністю кроку.

Можливо, вибір вибірки відхилення (як це відповідає відповідь python xnor ) є коротшим.

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.

Випадкова посилання "F і S", яка постійно грала в моїй голові кожного разу, коли я набирав одну з цих букв ...



2

Pyth, 53 байти

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

Спробуйте його онлайн тут .

Це здається занадто довго, я думаю, може знадобитися інший підхід.

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

2

JavaScript (ES6),  107 106  99 байт

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

Спробуйте в Інтернеті!

Прокоментував

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

2

Чорнило , 120 119 116 117 байт

=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}}->->

Спробуйте в Інтернеті!

Напевно, все-таки гольф.

Неперероблений (м'яко переформатований)

=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}}->->

Правки

  1. Збережено байт, закінчивши ->->замість ->END.
  2. Збережено три байти шляхом декрементування nраніше.
  3. Виправлена ​​помилка, яка спричинила закреслення в неправильних місцях, завдяки @veskah за те, що помітив її (+1 байт)

1
Виходячи зі списання та результатів, схоже на те, що він не враховує фолів, які правильно
збільшують

1
@veskah Добре помічений, зараз слід виправити, спасибі
Сара Дж


1

Вугілля деревне , 57 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

≔⁰η≔⁰ζ

Почніть з 0 куль і 0 ударів.

F⊖N«

Переведіть петлю на всі поставки, крім останньої.

≔‽⁺²‹ζ³ι

Якщо у вас було менше трьох кульок, то генеруйте випадкове число від 0 до 2, інакше просто переверніть між 0 і 1.

¿›ι¹≦⊕ζ≦⊕η

Випадкове значення 2 - це куля, інакше це збільшує кількість ударів.

§SFB∨ι›η²»

Значення від 0 до 2 відображають для удару, фолу та кулі, за винятком того, що якщо буде три удари, то замість цього надрукується фол. (Чотири кулі виключені вище.)

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

Визначте, чи вдарив би удар чи м'яч, і виберіть із них ті чи удари, як це доречно.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.