포켓볼 시뮬레이터


26

포켓몬 비디오 게임에서 플레이어는 야생 동물을 작은 공으로 만들고 싸우도록 훈련시키기 위해 세계로 보내집니다. 물론, 모두가 것을 알고 아무도 싸우고에 대한 포켓몬을 재생합니다. 이 시리즈의 실제 추첨은 포켓몬이 스스로 잡는 것입니다! 당신의 임무는 캡처 시도 중에 찌를 시뮬레이션하는 것입니다. 이 과제는 다음과 같은 세대 V 캡처 공식을 사용합니다.

a = (((((3 * HP_max-2 * HP_current) * rate * bonus_ball) / 3 * HP_max) * bonus_status

HP_max대상 포켓몬의 최대 HP와 같습니다. HP_current대상 포켓몬의 현재 HP와 같습니다. rate포켓몬의 적중률, bonus_ball던진 포켓볼 의 승수, bonus_status대상 포켓몬이 잠들거나 얼어 붙은 경우 2.5, 대상 포켓몬이 마비, 중독 또는 화상을 입은 경우 1.5, 그렇지 않으면 1입니다.

를 찾은 후 a최대 3 개의 "흔들림 확인"을 수행해야합니다. 쉐이크 점검 성공 확률은입니다 65536 / (255 / a)^(1/4). 이 검사 중 하나라도 실패하면 포켓몬이 공을 탈출합니다. 세 가지 검사가 모두 성공하면 포켓몬이 잡 힙니다!

참고 : 나누기가 수행 될 때마다 결과는 1/4096의 배수로 내림됩니다. 이것은 일반적으로 중요하지 않은 세부 사항이지만 프로그램에서 설명해야합니다.

문제는 쉐이크 확인을 실행하고 확인 상태를 표시하는 프로그램을 작성하는 것입니다. stdin에서 프로그램은 포켓몬의 최대 HP, 대상 포켓몬의 포획 속도 및 포켓볼 이름을 (적어도 아래의 세부 사항)받습니다. 최대 HP와 캐치 속도는 모두 정수임을 보장하는 반면, 포켓볼의 이름은 항상 문자열입니다. 이 입력은 임의의 순서로 제공 될 수 있으며, 구분 문자는 일관성이있는 한 편리합니다. 입력이 올바르다 고 가정하면 오류 처리가 필요하지 않습니다.

지원해야하는 찌꺼기의 이름과 캐치 승수는 다음과 같습니다.

  Poke | 1
 Great | 1.5
 Ultra | 2
Master | 255

대상이 잠 들어 있고 1 HP 인 것으로 가정 할 수 있습니다. 예상되는 출력 형식은 다음과 같습니다.

(First check failed)
(no output)

(Second check failed)
*shake*

(Third check failed)
*shake*
*shake*
*shake*

(All checks pass)
*shake*
*shake*
*shake*
Click!

(오타가 아니기 때문에 프로그램은 두 번의 흔들림 만 출력해서는 안됩니다.)

이것은 이므로 점수는 프로그램의 소스 코드 바이트 수입니다. 최저 점수가 이깁니다.

보너스!

나는 당신 포켓몬이 1 HP이고 잠 들었다고 가정 할 있다고 말했습니다 . 또는 사용자가 포켓몬의 현재 HP 및을 입력하도록 허용 할 수 있습니다 bonus_status. 포켓몬의 현재 HP는 항상 최대 HP 이하의 정수이며 bonus_status항상 2.5, 1.5 또는 1입니다. 입력하면 입력의 끝에이 값이 있어야하며 기본값은 1이고 2.5 제공되지 않은 경우. 이 중 하나를 구현하면 점수에서 15 점을 빼 거나 둘 다에서 25 를 뺄 수 있습니다 .

또한 중요한 캡처를 구현할 수 있습니다. 임계 캡처가 발생하면 하나의 흔들림 테스트 만 수행됩니다. 실패하면 프로그램이 자동으로 종료됩니다. 전달되면 다음을 출력합니다.

*shake*
Click!

플레이어가 더 많은 포켓몬을 수집함에 따라 비판적인 캡처가 더 일반적으로 이루어 지지만, 단순성을 위해 우리는 이미 "모두를 잡았다"고 가정 할 수 있습니다. 0과 2047 사이에서 임의로 생성 된 숫자에 a(제 1 계산 결과)에 2.5를 곱한 값 보다 작은 경우 , 이는 중요한 캡처입니다. 치명적인 캡처를 지원하면 점수에서 25 점 을 제거 할 수 있습니다 .

당신이 지원하도록 선택할 수있는 다른 많은 포켓볼이 있습니다. 그들의 이름과 catch multipliers는 다음과 같습니다.

Safari | 1.5
 Sport | 1.5
  Lure | 3
   Net | 3
  Dusk | 3.5
  Dive | 3.5
  Moon | 4
  Fast | 4
 Quick | 5
  Love | 8

당신이 지원을 추가하는 각 공에 대해, 당신은 당신의 점수에서 공을 빼고 (5 + 공 이름의 길이) 수 있습니다.

마지막으로, 차기의 경우,이 모든 보너스 (스탠드의 현재 HP 및 bonus_status, 치명타 및 10 개의 선택적인 공 모두)를 달성하면 총 150 점 의 추가 점수에서 7 점을 추가로 보상받을 수 있습니다.

입력 / 출력 예

우리가 모두 같은 페이지에 있는지 확인하십시오.

$ ./balls <<< "19,Ultra,255"
*shake*
*shake*
*shake*
Click!

행운과 행복한 골프!


나는 현재 당신 65536 / (255 / a)^(1/4)이 얻을 수 있는 확률이 얼마나 큰지 판단 할 수 없지만 내 내장은 그것이 1보다 크다고 말합니다. 당신은 0에서 65536 범위의 난수에 대해 검사합니까? 난수가 더 크거나 더 낮 으면 검사가 성공합니까?
생성자

경우 65536 / (255 / a)^(1/4)1보다 큰 경우, 검사가 자동으로 성공. 두 번째 질문의 의미가 무엇인지 잘 모르겠습니다.
undergroundmonorail

따라서 rnd < p검사가 rnd0과 1의 범위에서 성공적으로 수행되었음을 의미합니다 .
The Constructor

1
@IsmaelMiguel 내 의견을 참조하십시오 : 0에서 1 사이의 난수를 생성하고 비교합니다 65536 / (255 / a)^(1/4). 난수가 적 으면 흔들림 테스트 성공
TheConstructor

1
텍스트에있는 텍스트 유형의 pokeball, max hp 및 catch rate는 프로그램에 대한 입력으로 과거입니다. 선택적으로 당신은 현재 hp (기본 1) 또는 상태 보너스 (기본 2.5)를 요청할 수 있습니다
The Constructor

답변:


3

J 301-150 = 151

스포츠의 경우 모든 보너스가 구현되었지만 아마도 :)하지 않는 것이 좋습니다. 아래에서 간단히 설명했지만 누군가가 명시 적으로 요청하지 않는 한 자세히 설명하기에는 너무 깁니다. 모든 볼, 크리티컬 캡처 및 선택적 입력을 구현합니다.

tm =: =*./@:+.' '=] NB. Template match, match non-blanks in right with left
balls  =: 'MMLLPGSUNDFQ',.12{.'oauo' NB. space = wildcard.
NB. lookup function: name -> bonus_ball
lookup =: 4 255 3 8 1 1.5 1.5 2 3 3.5 4 5 #~ (tm"1&balls)@(2&{.) 

NB. convert given option
options =: ;".`lookup@.(_=_&".);._2 ,&',' i3 NB. parse options to numeric values
NB. add defaults if necessary
complete =: (, 1 2.5{.~(5-$)) options         
NB. formula
r=: <.&.(*&4096)                              NB. round to 1/4096
NB. a=: ((3*zeroth - 2*thirth)*first*second*fourth)/(3*zeroth)
a=:r(1-3%~2*%/3 0{complete)**/1 2 4{complete  NB. A prime, already divided by 255

NB. Critical captures
crit =: >2r5*[:?11^~2: NB. check for critical, k a
mess =: 2 7$'*shake*Click! '"_ NB. Message template
check =: >"0 [:?(4$2^16)"_     NB. Perform 4 checks
mes2 =: mess#~3(<.,<)]          NB. Construct message from number of passed checks
NB. If critical, just output the message array, else do the 4 tests, and execute mes2 on their running and (meaning count the number of uninterrupted trues)
echo mes2@(+/)@(*./\)@(check"0)@(65536%4%:[:r 255%])`mess@.crit a

여기 골프 버전

NB. Golfed verion
echo(m#~3(<.,<)])@(+/)@(*./\)@(>"0[:?(4$2^16)"_)@(65536%4%:[:r 255%])`(m=:2 7$'*shake*Click! '"_)@.(>2r5*[:?11^~2:)(r=:<.&.(*&4096))(1-3%~2*%/3 0{co)**/1 2 4{co=:(,1 2.5{.~(5-$));(".`(4 255 3 8 1 1.5 1.5 2 3 3.5 4 5 #~((=*./@:+.' '=])"1)&('MMLLPGSUNDFQ',.12{.'oauo')@(2&{.)))@.(_=_&".);._2,&','stdin''

6

PYTHON 249 바이트-보너스의 경우 75 = 174

나의 첫 번째 시도는 골프입니다.

import sys,random
y=sys.argv
d,b,f={10:1,1:1.5,15:2,7:1.5,13:255,-2:3.5,6:3,8:3,0:4,11:5},3*int(y[1]),"*shake*\n"
s=lambda:random.random()*(255*b)**.25<65536*((b-2)*int(y[3])*d[ord(y[2][0])-70]*2.5)**.25
if s():print f*3+"Click!" if s()and s()else f

선택한 공 포함 보너스 : Safari, Sport, Lure, Net, Dusk, Dive, Fast, Quick

8 * 5 + 6 + 5 + 4 + 3 + 4 + 4 + 4 + 5 = 75 보너스 포인트 제공

[edit] 나누기를 사용하지 않고 사용할 때마다 12 비트 소수로 반올림

[edit2] 포켓볼 사전 최적화


나는 당신이 1/4096 (질문 상태 Note: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.) 보다 높은 예측을 사용하고 있다고 생각합니다
The Constructor

당신은 아마 맞습니다. 나는 그 부분을 이해하지 못했고 다른 대답은 내가했던 것과 같은 방식으로하는 것처럼 보였습니다. r < 65536/(255/a)^(0.25) <=> r*255^(0.25)/a^(0.25) < 65536 <=> r*255^(0.25) < 65536*a^(0.25)모든 부서를 제외하려면 다음과 같이해야합니다 .
Þorsteinn

1/4096은 12 소수 비트를 의미합니다. 내 솔루션을 살펴보십시오. 더 직접적인 접근 방식은 floor(x*4096)*4096소수점 이하 자릿수로 반올림하는 것과 같습니다.
생성자

오 알겠습니다. 감사합니다. 이것은 아마도 당신이 그것을했던 것처럼 곱셈에도 적용되어야하지만, 그것이 걱정하지 않을 규칙에 명시되어 있지 않기 때문에. :)
Þorsteinn

예, 아마도 고정 소수점 산술을 사용합니다. 그러나 OP는 분할을 요청했다.
생성자

6

펄 1 (374-150 = 224 + MissingNo. bytes)

sub h{print "*shake*
";}($x,$h,$_,$c,$s)=split(/,/,<>);$G=$$%(/P/?256:/U/?151:201);$S=$G-($s==1?0:$s==1.5?12:25);
$F=255&int(int($h*255/(/G|S/?8:12))/(int($x/4)||1));sub c{for($i=0;$i<3;$i++){do h();}print "Click!
";exit;}
/M/||$S<0||$S<$c&&$F>$$*$$%255&&do c();$W=int(int($c*100/(/P/?255:/U/?150:200))*$F/255)+($s==1?0:$s==1.5?5:10);$W>9&&do h();$W>29&&do h();$W>69&&do h();

인수 목록 :

current hp, max hp, pokéball, catch rate, status, critical capture

예, 이것이 규칙을 완전히 위반한다는 것을 알고 있지만 신경 쓰지 않습니다. 당신이 눈치 채지 못했을 경우, 이것은 최초의 포켓몬 세대 캡처 알고리즘이며 모든 단점이 있습니다 (특정 조건에서 그레이트 볼은 울트라 볼보다 낫습니다). 이것은 포함되지 않은 기능을 포함하여 모든 기능을 구현합니다 (그리고 어쨌든 포인트를 포함하기로 결정했습니다). 중요한 포획은 무시되지만 (포획 률에 영향을주지 않기 위해 구현 됨) 최신 Poké Balls는 다른 Poké Ball의 데이터를로드합니다.

이 답변은 짧지 만 모든 규칙을 위반하므로 재미있는 답변이라고 생각하고 수락하지 마십시오. 처음에는 Perl 5에서 Gen5 알고리즘을 구현하려고했지만 왜 재미가 없는지 결정했습니다. 그리고 네, 실제로 Perl 1을 컴파일 했는데이 코드가 작동합니다. 최신 버전의 Perl에서 실행하면 더 이상 사용되지 않는다는 경고가 표시 될 수 do있지만 솔직히 말하면 Perl 1에서 함수를 실행하는 유일한 방법입니다. 이전 줄로 시작하는 줄을 이동하십시오 /M/-왜?-모르겠습니다).

또한 Perl 1에는 임의의 숫자가 없으므로 modulo of에 대해 나를 죽이지 않기를 바랍니다 $$. 내가 찾은 난수에 가장 가까운 것입니다.

편집 : 이전 do call()구문이 Perl 5.19.8에서 제거 된 것으로 보입니다. Perl 5.20이 Perl 1 스크립트와 호환되지 않는 것처럼 보이기 때문에 이전 버전의 Perl을 사용하여이 스크립트를 실행하십시오.


5

PHP (746 763 바이트-모든 보너스) :

<?if(!$i=fgets(STDIN))die('');parse_str($i,$i);$b=array('poke'=>1,'great'=>1.5,'ultra'=>2,'master'=>255,'safari'=>1.5,'sport'=>1.5,'lure'=>3,'net'=>3,'dusk'=>3.5,'dive'=>3.5,'moon'=>4,'fast'=>4,'quick'=>5,'love'=>8);$s=array('sleep'=>2.5,'frozen'=>2.5,'paralyzed'=>1.5,'poisoned'=>1.5,'burnt'=>1.5,''=>1);$i=array_merge(array('ball'=>'poke','hp'=>array('max'=>25,'current'=>1),'status'=>2.5,'rate'=>255),$i);$l='strtolower';$r='mt_rand';$x='*shake*'.PHP_EOL;$c='Click!'.PHP_EOL;$a=(((3*$i[hp][max])-(2*$i[hp][current]))*$i[rate]*$b[$l($i[ball])])/(3*$i[hp][max])*(is_numeric($i[status])?$i[status]:$s[$l($i[status])]);$a=((pow(65536/(255/$a),0.25)*4096)<<0)/4096;if($r(0,1)>$a)die();echo$x;if($a>1)die($c);if($r(0,1)>$a)die();echo$x,$x;if($r(0,1)>$a)die();echo$c;

이를 사용하려면 STDIN에서 입력을 'ball = poke & status = sleep'로 제공해야합니다.

HP는 'hp [max]'또는 'hp [current]'로 제공해야합니다.

이 코드는 여기에서 테스트 한대로 작동 합니다 .

이름이나 승수로 상태를 제공 할 수 있습니다. ( 질문에 필요하지 않음 ).

다음은 읽을 수있는 버전입니다.

if(!$info=fgets(STDIN))die('');
parse_str($info,$info);
$balls=array(//list of pokeballs
    'poke'=>1,
    'great'=>1.5,
    'ultra'=>2,
    'master'=>255,
    'safari'=>1.5,
    'sport'=>1.5,
    'lure'=>3,
    'net'=>3,
    'dusk'=>3.5,
    'dive'=>3.5,
    'moon'=>4,
    'fast'=>4,
    'quick'=>5,
    'love'=>8
);
$status=array(//list of status
    'sleep'=>2.5,
    'frozen'=>2.5,
    'paralyzed'=>1.5,
    'poisoned'=>1.5,
    'burnt'=>1.5,
    ''=>1 //in case there is no status
);
$info=array_merge(//this will set the default values
    array(
        'ball'=>'poke',
        'hp'=>array('max'=>25,'current'=>1),
        'status'=>2.5,
        'rate'=>255
    ),
    $info
);
$a=(((3*$info['hp']['max'])-(2*$info['hp']['current']))*$info['rate']*$balls[strtolower($info['ball'])])/(3*$info['hp']['max'])*(is_numeric($info['status'])?$info['status']:$status[strtolower($info['status'])]);
$a=((pow(65536/(255/$a),0.25)*4096)<<0)/4096;//same as $a=floor(pow(65536/(255/$a),0.25)*4096)/4096;

if(mt_rand(0,1)>$a) die();//test 1
echo '*shake*',PHP_EOL;
if($a>1)die('Click!'.PHP_EOL);//if $a>1, catch it (critical catch)

if(mt_rand(0,1)>$a) die();//test 2
echo'*shake*',PHP_EOL,'*shake*',PHP_EOL;

if(mt_rand(0,1)>$a) die();//test 3
echo 'Click!',PHP_EOL;//passed all tests

필요한 것보다 훨씬 높은 정밀도를 사용했기 때문에 이것을 편집해야했습니다.

수정 자는 TheConstructor 에 의해 제공되었습니다 .


나는 (질문 상태가 참고 : 1/4096보다 높은 precission를 사용하여 생각 Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor

그리고 당신 말이 맞아요 나는 부서에서 나온 값을 사용하고 있음을 알았습니다. 원하는 경우 PHP에서 더 작은 정밀도로 '둥글게'하는 방법에 대한 아이디어가 없기 때문에 도움을 줄 수 있습니다.
Ismael Miguel

floor(x*4096)/4096내가했던 것처럼 고정 소수점 나누기를 수행 하거나 구현할 수 있습니다 .
생성자

도와 주셔서 감사합니다. 나는 결코 그것을 생각하지 않을 것입니다. 내 대답을 수정했습니다.
Ismael Miguel

3

자바, 611

import java.util.*;class P{enum B{DI(35),DU(35),FA(40),GR(15),LO(80),LU(30),MA(2550),MO(40),NE(30),PO(10),QU(50),SA(15),SP(15),UL(20);long v;B(int i){v=((long)i<<12)/(long)10;}}public static void main(String[]y){Scanner s=new Scanner(System.in);B b=B.valueOf(s.next().toUpperCase().substring(0,2));long c=(long)(s.nextDouble()*4096);long m=s.nextLong()<<12;long h=(s.hasNextInt()?s.nextLong():1)<<12;long S=(long)((s.hasNextDouble()?s.nextDouble():2.5)*4096);long p=(65536L<<12)/(long)(Math.sqrt(Math.sqrt((255L<<24)/((((3L*m-2L*h)*c>>12)*b.v>>12<<12)/(3L*m)*S>>12)))*512);Random r=new Random();System.out.print(r.nextInt(65536)<p?"*shake*\n"+(r.nextInt(65536)<p?"*shake*\n*shake*\n"+(r.nextInt(65536)<p?"Click!\n":""):""):"");}}

점수:

  • 729 바이트
  • -93 모든 공
  • -25 선택적 current_hp 및 bonus_state

=> 611

이 프로그램은 12 개의 소수 비트로 고정 소수점 산술을 사용합니다 ( 1/4096가장 오른쪽 비트의 값임). Java는 일반적으로 고정 소수점을 사용하지 않으므로 예상 결과를 달성하기 위해 코드 내부에 약간의 변화가 있습니다. 골프 용으로 인라인 된 사용 된 산술 함수는 긴 버전을 참조하십시오.

대부분의 계산은 int값에 대해 수행 될 수 있지만 long원하는 정밀도를 유지하기 위해 배당을 다른 12 비트만큼 왼쪽으로 이동해야합니다 (그렇지 않으면 모든 분수 비트를 느슨하게하는 경우).

샘플 입력 ( ;대화식으로 실행하는 경우에만 필요합니다 ( 예 : STDIN이 EOF를 수신하지 않은 경우)) : Ball, catch_rate, max_hp

Poke 15 255 ;

샘플 출력 :

*shake*

샘플 입력 : Ball, catch_rate, max_hp, current_hp, bonus_state

Moon 42 255 50 1.5

샘플 출력 :

*shake*
*shake*
*shake*
Click!
import java.math.BigDecimal;
import java.util.Random;
import java.util.Scanner;

class Pokeball {
    static long shift(long i) {
        return i << 12;
    }
    enum B {
        DI(35),DU(35),FA(40),GR(15),LO(80),LU(30),MA(2550),MO(40),NE(30),PO(10),QU(50),SA(15),SP(15),UL(20);
        long v;
        B(int i) {
            v = semiFixedDivision(shift(i),10);
        }
    }

    public static void main(String[] args) {
        final Scanner s = new Scanner(System.in);
        B b = B.valueOf(s.next().toUpperCase().substring(0, 2));
        long catchRate = (long) (s.nextDouble() * 4096);
        long maxHp = shift(s.nextLong());
        long currentHp = shift(s.hasNextInt()?s.nextInt():1);
        long statusBonus = (long) ((s.hasNextDouble()?s.nextDouble():2.5) * 4096);
        long a = fixedMultiplication(fixedDivision(fixedMultiplication(fixedMultiplication(
                semiFixedMultiplication(3, maxHp) - semiFixedMultiplication(2, currentHp), catchRate), b.v),
                                                   semiFixedMultiplication(3, maxHp)), statusBonus);
        println("a=",a);
        long x = fixedFourthRoot(fixedDivision(shift(255), a));
        println("x=",x);
        println("x^4=",fixedMultiplication(fixedMultiplication(x,x), fixedMultiplication(x,x)));
        long p = semiFixedDivision(shift(65536), fixedFourthRoot(fixedDivision(shift(255), a)));
        Random r = new Random();
        System.out.print(r.nextInt(65536) < p ?
                         "*shake*\n" + (r.nextInt(65536) < p ?
                                        "*shake*\n*shake*\n" + (r.nextInt(65536) < p ?
                                                                "Click!\n" :
                                                                "") :
                                        "") :
                         "");
    }

    private static long unshift(long p) {
        return p >> 12;
    }

    private static void println(String s, long v) {
        System.out.print(s);
        println(v);
    }

    private static void println(long v) {
        System.out.printf("%s%n", BigDecimal.valueOf(v).divide(BigDecimal.valueOf(4096)));
    }

    /**
     * Calculates division of {@code a/b} with both number last 12 bits treated as being "right of the dot"
     */
    static long fixedDivision(long a, long b) {
        return (a<<12)/b;
    }

    /**
     * Calculates division of {@code a/b} with {@code a}'s last 12 bits treated as being "right of the dot"
     */
    static long semiFixedDivision(long a, long b) {
        return a/b;
    }
    static long fixedMultiplication(long a, long b) {
        return (a*b) >> 12;
    }
    static long semiFixedMultiplication(long a, long b) {
        return a*b;
    }
    static long fixedFourthRoot(long a) {
        return (long)(Math.sqrt(Math.sqrt(a)) * 512);
    }
}

1

커피 스크립트 - 317 313 310 307 306 294 270 250 242 바이트

342-25 (매개 변수) -75 (12 구) = 242

_=process.stdin
l=console.log
m=Math
s=m.sqrt
t=['*shake*','Click!']
n=65536
_.resume()
_.setEncoding 'utf8'
_.on 'data',(d)=>
 [A,B,C,E,F]=d.match /\w+/g;E||=1;F||=2.5;i=0;while i++<3
  if n*(s s (3*A-2*E)*B*{P:1,G:1.5,U:2,M:255,S:1.5,L:3,N:3,D:3.5,F:4,Q:5}[C.charAt 0]*F)<m.floor(m.random()*n)*s s 765*A
   break
  l t[0]
 if i>2
  l t[i-3]

입력이 필요 HP_max,Rate,Ball[,HP_current[,status]]합니다. 지원하지 Moon않거나 Love공.

이것은 내가 처음으로 골프를 타는 정규식이 아니므로 개선의 여지가있을 것입니다. 부분 공 이름 만 저장하기 위해 아이디어를 부끄럽게 복사했습니다. ;) 다른 두 공을 지탱하는 것은 그만한 가치가 없으며, 모든 보너스를 얻기위한 추가 +7 조차도 아닙니다 .

언 골프 버전

이 버전은 처음에 정의한 모든 짧은 별칭을 생략하지만 볼 조회를 별도로 정의합니다.

balls =
  P: 1
  G: 1.5
  U: 2
  M: 255
  S: 1.5
  L: 3
  N: 3
  D: 3.5
  F: 4
  Q: 5

messages = ['*shake*', 'Click!']

process.stdin.resume()
process.stdin.setEncoding 'utf8'
process.stdin.on 'data', (data) =>
  [HP_max, rate, ball, HP_current, status] = data.match /\w+/g
  HP_current ||= 1
  HP_status ||= 2.5
  i = 0
  while i++ < 3
    if 65536 * (Math.sqrt Math.sqrt (3*HP_max - 2*HP_current)*rate*status*balls[ball.charAt 0]) < Math.floor(Math.random()*65536) * Math.sqrt Math.sqrt 765*HP_max
      break
    console.log messages[0]
  if i > 2
    console.log messages[i-3]

확률 공식에 대한 메모 : a나눗셈이 없도록 전체 공식을 다시 작성하고 ( (...)^(1/4)제외됨) 제곱근을 두 번 사용하여 계산 합니다.


1
우세가 당신 편에있는 p-=p%1/4096것 같아요 (적어도 글을 써야 p-=p%(1/4096)한다고 생각했을 것입니다. 그러나 여전히 양쪽에 분수로 모듈러스가 구현되어 있는지 확신 할 수 없습니다.
TheConstructor

@TheConstructor Haha, 예, 실제로 확인해야했습니다 ... 나도 정말 이상하게 보였지만 %JS의 재미있는 것들에 사용할 수 있습니다. 질문을 다시 읽은 후에는이 답변이 반올림 요구 사항을 충족시키지 못한다고 생각합니다. 부서 마다 반올림을 적용해야한다고 생각합니다 . 계산을 약간 재구성해야 할 수도 있습니다. ^^
Martin Ender

예, 아마도 좋은 생각입니다
The Constructor

@TheConstructor 실제로, 나는 쓸 필요가있다 p%(1/4096). 게시하기 전에 이것을 확인했지만 테스트 결과가 잘못 기억되었습니다.
Martin Ender

Chrome에서 시도했습니다. ()없이 일했지만 항상 모든 브라우저에서 작동하지 않을 수도 있습니다 ...
The Constructor

0

업데이트 : (C #)

바이트 수 : 3,600

치명타 : -25

모든 poke-balls : -91


합계 = 3,484

[골프]

using System;using System.Text;using System.Security.Cryptography;using System.Linq;namespace Pokemon{public class MainClass{private string[] c(string[] i){if(i.Length <= 3){var v1 =i[0][0];var v2 =i[1][0];var v3 =i[2][0];if(v1>='0'&&v1<='9'&&v2>='a'&&v2<='z'&&v3>='0'&&v3<='9')return new string[]{i[0],i[2],i[1]};else if(v1>='0'&&v1<='9'&&v2>='0'&&v2<='9'&&v3>='a'&&v3<='z')return new string[]{i[0],i[1],i[2]};else if(v1>='a'&&v1<='z'&&v2>='0'&&v2<='9'&&v3>='0'&&v3<='9')return new string[]{i[1],i[2],i[0]};else return null;}else return null;}private static void Main(string[] args){while(true){Console.Clear();MainClass _c = new MainClass();Console.Write("Inputs'please:");var i = Console.ReadLine().ToLower();string[] r = _c.c((string[])(i.Split(new Char[]{' ','.',',','\n','\t','!','@','#','$','%','^','&','&','*','(',')','-','_','+','=','?','/','\\'},StringSplitOptions.RemoveEmptyEntries).Select(p=>p.Trim()).ToList()).ToArray());new w("Processing...\n");if(r== null)new w("Too many errors");else new m(r);}}}public class w{public w(string l){Console.WriteLine(l);}}public class m{public m(string[] v){switch (v[2].Substring(0,2)){case "po":c(v[0],v[1],"1");break;case "ul":c(v[0],v[1],"2");break;case "ma":c(v[0],v[1],"255");break;case "gr":case "sa":case "sp":c(v[0],v[1],"1.5");break;case "lu":case "ne":c(v[0],v[1],"3");break;case "du":case "di":c(v[0],v[1],"3.5");break;case "mo":case "fa":c(v[0],v[1],"4");break;case "qu":c(v[0],v[1],"5");break;case "lo":c(v[0],v[1],"8");break;default:new w("Not supported");break;}}private double y(double v){return Convert.ToDouble(((double)1/(double)4096)*(v/Convert.ToDouble(1/4096)-(v%Convert.ToDouble(1/4096))));}private bool i(double v,double r,double b){if(((double)new Random().Next(0,(int)r))>b*v)return true;else return false;}private double f(double r, double h, double b){return 2.5*y((((3.0*h)-2.0)*r*b)/(3.0*h));}private void c(params string[] v){var s =0.0;var x =0;if(int.Parse(v[1])>100&&int.Parse(v[1])<= 255){s =f(double.Parse(v[0]),double.Parse(v[1]),double.Parse(v[2]));x=0;}else if(int.Parse(v[0])>100&&int.Parse(v[0])<= 255){s =f(double.Parse(v[1]),double.Parse(v[0]),double.Parse(v[2]));x=1;}else{new w(String.Format("Which number is the Max HP? :{0} or {1}:",v[0],v[1]));var c_ = int.Parse(Console.ReadLine());s =f((double.Parse(v[0])+double.Parse(v[1]))-double.Parse(v[c_]),double.Parse(v[c_]),double.Parse(v[2]));x=2;}if(((double)new Random().Next(0, 2047))<s*2.5)new w("*shake*\nClick!");else{for(int c_= 0;c_<3;c_++){new w("*shake*");var r =Math.Pow(65536.0/y(255.0/s),0.25);if(i(r,double.Parse(v[x]),2.5)==true){new w("Click!");break;}else;}}Console.ReadKey();}}}

[정규병]

using System;
using System.Text;
using System.Security.Cryptography;
using System.Linq;

namespace Pokemon
{
    public class MainClass
    {
        private string[] c(string[] i)
        {
            if (i.Length <= 3)
            {
                var v1 =i[0][0];
                var v2 =i[1][0];
                var v3 =i[2][0];
                if(v1>='0'&&v1<='9'&&v2>='a'&&v2<='z'&&v3>='0'&&v3<='9')return new string[]{i[0],i[2],i[1]};
                else if(v1>='0'&&v1<='9'&&v2>='0'&&v2<='9'&&v3>='a'&&v3<='z')return new string[]{i[0],i[1],i[2]};
                else if(v1>='a'&&v1<='z'&&v2>='0'&&v2<='9'&&v3>='0'&&v3<='9')return new string[]{i[1],i[2],i[0]};
                else return null;
            }
            else return null;
        }

        private static void Main(string[] args)
        {
            while(true)
            {
                Console.Clear();
                MainClass _c = new MainClass();
                Console.Write("Inputs'please:");
                var i = Console.ReadLine().ToLower();
                string[] r = _c.c((string[])(i.Split(new Char[]{' ','.',',','\n','\t','!','@','#','$','%','^','&','&','*','(',')','-','_','+','=','?','/','\\'},StringSplitOptions.RemoveEmptyEntries).Select(p=>p.Trim()).ToList()).ToArray());
                new w("Processing...\n");
                if(r== null)new w("Too many errors");
                else new m(r);
            }
        }
    }

    public class w
    {
        public w(string l)
        {
            Console.WriteLine(l);
        }
    }

    public class m
    {
        public m(string[] v)
        {
            switch (v[2].Substring(0,2))
            {
                case "po":
                    c(v[0],v[1],"1");
                    break;
                case "ul":
                    c(v[0],v[1],"2");
                    break;
                case "ma":
                    c(v[0],v[1],"255");
                    break;
                case "gr":
                case "sa":
                case "sp":
                    c(v[0],v[1],"1.5");
                    break;
                case "lu":
                case "ne":
                    c(v[0],v[1],"3");
                    break;
                case "du":
                case "di":
                    c(v[0],v[1],"3.5");
                    break;
                case "mo":
                case "fa":
                    c(v[0],v[1],"4");
                    break;
                case "qu":
                    c(v[0],v[1],"5");
                    break;
                case "lo":
                    c(v[0],v[1],"8");
                    break;
                default:
                    new w("Not supported");
                    break;
            }
        }

        private double y(double v){return Convert.ToDouble(((double)1/(double)4096)*(v/Convert.ToDouble(1/4096)-(v%Convert.ToDouble(1/4096))));}

        private bool i(double v,double r,double b){if(((double)new Random().Next(0,(int)r))>b*v)return true;else return false;}

        private double f(double r, double h, double b){return 2.5*y((((3.0*h)-2.0)*r*b)/(3.0*h));}

        private void c(params string[] v)
        {
            var s =0.0;
            var x =0;
            if(int.Parse(v[1])>100&&int.Parse(v[1])<= 255){s =f(double.Parse(v[0]),double.Parse(v[1]),double.Parse(v[2]));x=0;}
            else if(int.Parse(v[0])>100&&int.Parse(v[0])<= 255){s =f(double.Parse(v[1]),double.Parse(v[0]),double.Parse(v[2]));x=1;}
            else
            {
                new w(String.Format("Which number is the Max HP? :{0} or {1}:",v[0],v[1]));
                var c_ = int.Parse(Console.ReadLine());
                s =f((double.Parse(v[0])+double.Parse(v[1]))-double.Parse(v[c_]),double.Parse(v[c_]),double.Parse(v[2]));
                x=2;
            }
            if (((double)new Random().Next(0, 2047))<s*2.5)new w("*shake*\nClick!");
            else
            {
                for(int c_= 0;c_<3;c_++)
                {
                    new w("*shake*");
                    var r =Math.Pow(65536.0/y(255.0/s),0.25);
                    if (i(r,double.Parse(v[x]),2.5)==true){new w("Click!");break;}else;
                }
            }
            Console.ReadKey();
        }    
      }
  }

이것은 코드 골프입니다. 답을 줄여야합니다 (예 : 공백 제거). 여전히 현재 답변을 읽을 수있는 버전으로 제공 할 수 있습니다.
Ismael Miguel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.