야구 피치 문자열 생성


11

양의 정수를 취하고 nlength의 유효한 일련의 피치 (이하 피치 문자열)를 임의로 생성 하는 프로그램이나 함수를 작성하십시오 n.

입력

0이 아닌 양의 정수 n<= 100

산출

length의 유효한 피치 문자열을 나타내는 임의의 문자열 또는 문자 목록을 반환합니다 n. 사용되는 문자는 다음과 같습니다.

  • B- 공. 이 중 4 개를 모으면 타자가 걷고 타자가 끝납니다.
  • S- 스트라이크. 이 중 3 개를 축적하면 타자가 나오고 타자가 완료됩니다.
  • F- 파울 또한 스트라이크 수를 늘리지 만 타자를 꺼낼 수는 없습니다. 즉, 유효한 문자열에서 마지막 음정이 될 수 없습니다. 두 번의 스트라이크 / 파울을 지난 파울은 스트라이크 수를 증가시키지 않습니다 (타자는 이미 그 시점에서 2 번의 스트라이크를 가졌으며 3 번은 그를 때릴 것입니다).
  • H- 맞다. 타자가 공을 쳐서 타자가 끝났습니다.

(이것은 약간 단순화되었지만 걱정하지 마십시오)

유효한 피치 스트링은 스트라이크 아웃, 워크 또는 히트로 끝나는 스트링입니다.

즉, 유효하지 않은 피치 문자열은

  • 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까지 어디에서나 생산할 수 있어야합니까?
Quintec

문자열은 최대 100 자입니다. 파울은 99 개 예, 같은 긴 피칭 문자열을 허용 무엇 F들하고는 S스트라이크 아웃입니다
Veskah

오, 알았어요
Quintec

@Quintec 만일을 대비하여 좀 더 명백하게 표현했습니다
Veskah

답변:


4

파이썬 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)

온라인으로 사용해보십시오!


Kevin의 포트는 이것이 더 높은 숫자로 분류되는 것을 깨달았습니다. 의 끝에 n=8체인을 생성 할 수 있습니다F
Veskah

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#

@xnor 의 Python 2 답변 포트 이므로이 답변마음드시면 그를 투표 하십시오!
버그 수정으로 인해 +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}

온라인으로 사용해보십시오!

결과가 가능한 피치 시퀀스인지 확인하기 위해 샘플링 데이터 세트에 조건부 포함을 사용하여 문자열을 생성합니다.

아마도 xnor의 python answer 처럼 거부 샘플링을 수행하는 것이 더 짧습니다.

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

자바 스크립트 (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 바이트를 절약했습니다 .
  3. @veskah 덕분에 잘못된 장소에서 파업을 일으켰던 버그를 수정했습니다 (+1 바이트).

1
쓰기와 출력을 기반으로 스트라이크 카운트를 정확하게 증가시키는 파울을 고려하지 않는 것 같습니다
Veskah

1
@veskah 잘 발견, 지금 수정해야합니다, 감사합니다
사라 J


1

, 57 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

≔⁰η≔⁰ζ

공 0 개와 스트라이크 0 개로 시작하십시오.

F⊖N«

마지막을 제외한 모든 배송을 반복합니다.

≔‽⁺²‹ζ³ι

공이 3 개 미만인 경우 0에서 2 사이의 난수를 생성하고, 그렇지 않으면 0과 1 사이에서 coinflip을 발생시킵니다.

¿›ι¹≦⊕ζ≦⊕η

2의 임의의 값은 공입니다. 그렇지 않으면 타격 횟수가 증가합니다.

§SFB∨ι›η²»

0에서 2까지의 값은 스트라이크, 파울 및 볼로 매핑되지만, 세 번의 스트라이크가 있으면 파울이 대신 인쇄됩니다. (위의 4 개의 공은 제외됩니다.)

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

스트라이크 나 볼이 타자를 낼 것인지를 결정하고 적절하게 타자 나 히트를 선택하십시오.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.