Mô phỏng Pokeball


26

Trong các trò chơi video Pokemon, người chơi được gửi ra thế giới để buộc các động vật hoang dã thành những quả bóng nhỏ và huấn luyện chúng chiến đấu. Tất nhiên, mọi người đều biết rằng không ai chơi Pokemon cho trận chiến. Điểm thu hút thực sự của bộ truyện là pokemon bắt chính nó! Công việc của bạn là mô phỏng pokeball trong nỗ lực bắt giữ. Thử thách này sẽ sử dụng công thức chụp V thế hệ, như sau:

a = ((((3 * HP_max - 2 * HP_cản) * tỷ lệ * Bonus_ball) / 3 * HP_max) * Bonus_status

HP_maxbằng với lượng HP tối đa của pokemon mục tiêu. HP_currentbằng với HP hiện tại của pokemon mục tiêu. ratelà tỷ lệ bắt của pokemon, bonus_balllà hệ số nhân của pokeball và bonus_statuslà 2,5 nếu pokemon mục tiêu đang ngủ hoặc bị đóng băng, 1,5 nếu pokemon mục tiêu bị tê liệt, bị nhiễm độc hoặc bị đốt cháy và 1 cách khác.

Sau khi tìm thấy a, bạn phải thực hiện tối đa ba "kiểm tra lắc". Xác suất của một kiểm tra lắc thành công là 65536 / (255 / a)^(1/4). Nếu bất kỳ một trong những kiểm tra này thất bại, pokemon thoát khỏi quả bóng của nó. Nếu cả ba lần kiểm tra đều thành công, pokemon sẽ bị bắt!

Lưu ý: Bất cứ khi nào bất kỳ phân chia nào được thực hiện, kết quả được làm tròn xuống bội số của 1/4096. Đây thường là một chi tiết không đáng kể, nhưng nó phải được tính trong chương trình của bạn.

Thử thách của bạn là viết một chương trình thực hiện kiểm tra lắc và in để đánh bật trạng thái của séc. Trên stdin, chương trình của bạn sẽ nhận được (ít nhất, chi tiết bên dưới) lượng HP tối đa của pokemon, tốc độ bắt của pokemon mục tiêu và tên của pokeball. HP tối đa và tốc độ bắt đều được đảm bảo là số nguyên, trong khi tên của pokeball luôn là một chuỗi. Đầu vào này có thể đến theo bất kỳ thứ tự nào và với bất kỳ (các) ký tự phân định nào đều thuận tiện cho bạn, miễn là nó phù hợp. Giả sử rằng đầu vào là chính xác, không cần xử lý lỗi.

Tên của các pokeball mà bạn được yêu cầu hỗ trợ và số nhân bắt của chúng được liệt kê ở đây:

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

Bạn có thể cho rằng mục tiêu đang ngủ và ở mức 1 HP. Định dạng dự kiến ​​cho đầu ra là:

(First check failed)
(no output)

(Second check failed)
*shake*

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

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

(Đó không phải là một lỗi đánh máy, chương trình của bạn sẽ không bao giờ xuất ra chỉ hai lần lắc.)

Đây là , vì vậy điểm của bạn là số byte của mã nguồn chương trình của bạn. Điểm số thấp nhất chiến thắng.

Tiền thưởng!

Tôi đã nói rằng bạn có thể cho rằng pokemon đang ở mức 1 HP và đang ngủ. Ngoài ra, bạn có thể cho phép người dùng nhập HP hiện tại của pokemon và bonus_status. HP hiện tại của pokemon sẽ luôn là một số nguyên bằng hoặc nhỏ hơn HP tối đa của nó và bonus_statussẽ luôn là 2,5, 1,5 hoặc 1. Nếu bạn làm như vậy, bạn phải có các giá trị này ở cuối đầu vào của mình và mặc định là 1 và 2.5 nếu chúng không được cung cấp. Bạn có thể trừ 15 điểm từ điểm số của mình để thực hiện một trong số này hoặc 25 điểm cho cả hai.

Ngoài ra, bạn có thể thực hiện các cảnh quay quan trọng. Nếu một sự bắt giữ quan trọng xảy ra, chỉ có một thử nghiệm lắc được thực hiện. Nếu thất bại, chương trình thoát ra âm thầm. Nếu được thông qua, nó xuất ra:

*shake*
Click!

Việc bắt giữ quan trọng trở nên phổ biến hơn khi người chơi thu thập nhiều pokemon hơn, nhưng để đơn giản, chúng ta có thể cho rằng họ đã "bắt được tất cả". Nếu một số được tạo ngẫu nhiên trong khoảng từ 0 đến 2047 nhỏ hơn a(kết quả của phép tính đầu tiên) nhân với 2,5, thì đó là một sự bắt giữ quan trọng. Hỗ trợ cho các ảnh chụp quan trọng cho phép bạn xóa 25 điểm khỏi điểm số của mình.

Có một số pokeball khác bạn có thể chọn để hỗ trợ. Tên và số nhân bắt của chúng được liệt kê ở đây:

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

Đối với mỗi quả bóng bạn thêm hỗ trợ, bạn có thể trừ (5 + chiều dài tên của quả bóng) khỏi điểm số của bạn.

Cuối cùng, đối với các cú đá, đạt được tất cả các phần thưởng này (HP hiện tại và Bonus_status từ stdin, bắt giữ quan trọng và tất cả 10 quả bóng tùy chọn) sẽ mang lại cho bạn phần thưởng thêm 7 điểm từ điểm số của bạn, với tổng số tiền thưởng là 150 .

Ví dụ đầu vào / đầu ra

Chỉ để đảm bảo tất cả chúng ta trên cùng một trang.

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

Chúc may mắn và chơi golf vui vẻ!


Hiện tại tôi không thể đánh giá xác suất bạn đưa ra 65536 / (255 / a)^(1/4)có thể lớn đến mức nào nhưng can đảm của tôi nói rằng nó lớn hơn 1. Bạn có kiểm tra số ngẫu nhiên trong khoảng từ 0 đến 65536 không? Kiểm tra thành công nếu số ngẫu nhiên lớn hơn hoặc nếu nó thấp hơn?
TheConstructor

Nếu 65536 / (255 / a)^(1/4)lớn hơn 1, kiểm tra tự động thành công. Tôi không chắc ý của bạn về câu hỏi thứ hai.
undergroundmonorail

Vì vậy, rnd < pcó nghĩa là kiểm tra thành công với rndphạm vi 0 và 1.
TheConstructor

1
@IsmaelMiguel xem nhận xét của tôi: bạn tạo một số ngẫu nhiên trong phạm vi từ 0 đến 1 và so sánh với số 65536 / (255 / a)^(1/4)đó, nếu số ngẫu nhiên ít hơn thì thử nghiệm lắc đã thành công
TheConstructor

1
Như trạng thái trong văn bản loại pokeball văn bản, hp tối đa và tốc độ bắt được quá khứ làm đầu vào cho chương trình của bạn. Tùy chọn, bạn có thể yêu cầu hp hiện tại (mặc định 1) hoặc phần thưởng trạng thái (mặc định 2.5)
TheConstructor

Câu trả lời:


3

J 301-150 = 151

Đối với thể thao, tất cả các phần thưởng được triển khai, mặc dù tôi có lẽ tốt hơn là không nên :). Tôi đã giải thích ngắn gọn những điều dưới đây, nhưng điều này quá dài để giải thích chi tiết, trừ khi có ai đó yêu cầu rõ ràng. Nó thực hiện tất cả các quả bóng, chụp quan trọng và đầu vào tùy chọn.

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

Đây là phiên bản chơi gôn

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 byte - 75 cho tiền thưởng = 174

Lần thử đầu tiên của tôi

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

Phần thưởng cho các quả bóng được chọn: Safari, Thể thao, Thu hút, Net, Dusk, Lặn, Nhanh, Nhanh

Cho tôi 8 * 5 + 6 + 5 + 4 + 3 + 4 + 4 + 4 + 5 = 75 điểm thưởng

[sửa] Làm tròn xuống 12 bit phân số mỗi lần phân chia được sử dụng bằng cách không sử dụng nó

[edit2] tối ưu hóa từ điển pokeball


Tôi nghĩ rằng bạn đang sử dụng một giới hạn cao hơn 1/4096 (trạng thái câu hỏi Note: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor

Bạn có thể đúng, tôi đã không hiểu phần đó và các câu trả lời khác dường như làm điều đó giống như tôi đã làm. Tôi đoán tôi cần phải làm một cái gì đó như thế này: r < 65536/(255/a)^(0.25) <=> r*255^(0.25)/a^(0.25) < 65536 <=> r*255^(0.25) < 65536*a^(0.25)để loại trừ tất cả các bộ phận?
Þorsteinn

1/4096 có nghĩa là 12 bit phân đoạn. Hãy nhìn vào giải pháp của tôi; một cách tiếp cận trực tiếp hơn sẽ floor(x*4096)*4096giống như bạn làm tròn xuống, ví dụ như vị trí thập phân.
TheConstructor

Ồ tôi hiểu rồi, cảm ơn bạn. Điều này có thể cũng sẽ áp dụng cho phép nhân như bạn dường như đã làm nó, nhưng vì điều đó không được nêu trong các quy tắc tôi nên sẽ không lo lắng về điều đó. :)
Þorsteinn

Vâng, có lẽ họ sử dụng mỹ phẩm điểm cố định. Nhưng OP chỉ yêu cầu chia vòng.
TheConstructor

6

Perl 1 (374 - 150 = 224 + Thiếu byte.)

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

Danh sách đối số:

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

Vâng, tôi biết điều này hoàn toàn phá vỡ các quy tắc, nhưng tôi không quan tâm. Trong trường hợp bạn không nhận thấy, đây là thuật toán bắt thế hệ Pokémon đầu tiên, với tất cả các đặc điểm của nó (Great Balls tốt hơn Ultra Balls, trong một số điều kiện nhất định). Điều này thực hiện tất cả các tính năng, bao gồm cả các tính năng không được bao gồm (và tôi đã quyết định bao gồm các điểm cho chúng bằng mọi cách). Việc bắt giữ quan trọng bị bỏ qua (nhưng chúng được thực hiện - chỉ là chúng không ảnh hưởng đến tốc độ bắt), dữ liệu tải Poké Balls mới hơn của các Poké Balls khác.

Xin lưu ý rằng trong khi câu trả lời này ngắn, nó phá vỡ tất cả các quy tắc, vì vậy hãy xem nó chỉ là một câu trả lời thú vị, đừng chấp nhận nó. Ban đầu tôi định thực hiện thuật toán Gen5 trong Perl 5, nhưng tôi đã quyết định - tại sao không có chút niềm vui nào. Và vâng, tôi thực sự đã biên dịch Perl 1, và mã này hoạt động. Nếu bạn chạy nó trong phiên bản mới hơn của Perl, bạn có thể nhận được cảnh báo về việc sử dụng không được chấp nhận do, nhưng hãy trung thực - đó là cách duy nhất để chạy các chức năng trong Perl 1. Perl 1 cũng có một số điều kỳ quặc (ví dụ: tôi không thể di chuyển dòng bắt đầu bằng /M/dòng trước - tại sao? - Tôi không biết).

Ngoài ra, không có số ngẫu nhiên trong Perl 1, vì vậy hy vọng bạn sẽ không giết tôi vì modulo $$. Đó là thứ gần nhất với số ngẫu nhiên mà tôi có thể tìm thấy.

Chỉnh sửa: Dường như do call()cú pháp cũ đã bị xóa trong Perl 5.19.8. Đảm bảo bạn sử dụng phiên bản cũ hơn của Perl để chạy tập lệnh này, vì có vẻ như Perl 5.20 sẽ không tương thích với tập lệnh Perl 1.


5

PHP (746 763 byte - tất cả tiền thưởng):

<?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;

Để sử dụng điều này, bạn phải cung cấp đầu vào là 'ball = poke & status = ngủ' trên STDIN.

HP phải được cung cấp dưới dạng 'hp [max]' hoặc 'hp [current]'.

Mã này hoạt động, như được thử nghiệm ở đây .

Bạn có thể cung cấp trạng thái theo tên hoặc số nhân. ( không bắt buộc trong câu hỏi ).

Đây là một phiên bản dễ đọc:

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

Tôi đã phải chỉnh sửa điều này bởi vì tôi đang sử dụng độ chính xác cao hơn nhiều so với yêu cầu.

Bản sửa lỗi được cung cấp bởi TheConstructor .


Tôi nghĩ rằng bạn đang sử dụng một giới hạn cao hơn 1/4096 (trạng thái câu hỏi Lưu ý Whenever any division is performed, the result is rounded down to a multiple of 1/4096.:)
TheConstructor

Và bạn nói đúng không. Tôi nhận thấy rằng tôi đang sử dụng bất cứ giá trị nào đến từ bộ phận. Nếu bạn muốn, bạn có thể cung cấp cho tôi một số trợ giúp 'vì tôi không có ý tưởng chết tiệt nào về cách' làm tròn 'với độ chính xác nhỏ hơn trong PHP.
Ismael Miguel

Bạn có thể làm floor(x*4096)/4096hoặc thực hiện phân chia điểm cố định như tôi đã làm.
TheConstructor

Cảm ơn sự giúp đỡ của bạn. Tôi sẽ không bao giờ nghĩ về điều đó. Tôi đã sửa câu trả lời của tôi.
Ismael Miguel

3

Java, 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":""):""):"");}}

Ghi bàn:

  • 729 byte
  • -93 tất cả các quả bóng
  • -25 tùy chọn current_hp và Bonus_state

=> 611

Chương trình sử dụng các điểm số cố định với 12 bit phân số ( 1/4096là giá trị của hầu hết các bit bên phải). Vì Java thường không sử dụng điểm cố định nên có khá nhiều thay đổi bên trong mã để đạt được kết quả mong đợi. Xem phiên bản dài cho các hàm số học đã sử dụng, đã được nội tuyến cho mục đích chơi gôn.

Mặc dù hầu hết các tính toán có thể được thực hiện trên intcác giá trị, các phép chia hoạt động tốt hơn với longs vì bạn cần dịch chuyển cổ tức thêm 12 bit sang trái để giữ độ chính xác mong muốn (nếu không, bạn sẽ mất tất cả các bit phân số).

Đầu vào mẫu ( ;chỉ được yêu cầu nếu chạy tương tác, tức là STDIN chưa nhận được EOF): Ball, Catch_rate, max_hp

Poke 15 255 ;

Đầu ra mẫu:

*shake*

Đầu vào mẫu: Bóng, Catch_rate, max_hp, current_hp, Bonus_state

Moon 42 255 50 1.5

Đầu ra mẫu:

*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

CoffeeScript - 317 313 310 307 306 294 270 250 242 byte

342 - 25 (tham số) - 75 (12 quả bóng) = 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]

Mong đợi đầu vào HP_max,Rate,Ball[,HP_current[,status]]. Không hỗ trợ Moonhoặc Lovebóng.

Đây là điều đầu tiên tôi từng chơi golf không phải là một regex, vì vậy có lẽ có chỗ để cải thiện. Tôi đã xấu hổ sao chép ý tưởng để chỉ lưu trữ một phần tên bóng. ;) Hỗ trợ hai quả bóng khác chỉ đơn giản là không có giá trị, thậm chí không có thêm 7 giây để nhận tất cả tiền thưởng.

Phiên bản ung dung

Phiên bản này bỏ qua tất cả các bí danh ngắn mà tôi xác định lúc đầu, nhưng không xác định riêng việc tra cứu bóng.

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]

Một lưu ý về công thức xác suất: Tôi đã sắp xếp lại công thức đầy đủ (viết ra a) để không có sự phân chia và tôi đang tính toán (...)^(1/4)bằng cách lấy căn bậc hai hai lần.


1
Có vẻ như sự ưu tiên đang đứng về phía bạn Oo p-=p%1/4096thực sự có vẻ hiệu quả. (Có thể đoán bạn ít nhất sẽ cần phải viết p-=p%(1/4096)và sau đó tôi vẫn không chắc chắn mô-đun được triển khai cho các phân số ở cả hai phía. Nice!
TheConstructor

@TheConstructor Haha, vâng tôi thực sự phải kiểm tra xem ... nó cũng thực sự kỳ lạ đối với tôi, nhưng %có thể được sử dụng cho một số điều thú vị trong JS. Sau khi đọc lại câu hỏi, tôi nghĩ rằng câu trả lời này không hoàn toàn đáp ứng yêu cầu làm tròn. Tôi nghĩ làm tròn nên được áp dụng sau mỗi bộ phận. Tôi có thể phải cơ cấu lại tính toán của mình một chút. ^^
Martin Ender

Có lẽ vẫn còn ý tưởng tốt
TheConstructor

@TheConstructor Thật ra, tôi cần phải viết p%(1/4096). Tôi thậm chí đã kiểm tra điều này trước khi đăng, nhưng bằng cách nào đó đã nhớ kết quả kiểm tra của tôi sai.
Martin Ender

Đã thử trong Chrome; hoạt động mà không có () nhưng có thể không phải luôn luôn hoặc không có trên tất cả các trình duyệt ...
TheConstructor

0

Cập nhật: (C #)

Số byte: 3.600

Phê bình: -25

Tất cả poke-ball: -91


Tổng cộng = 3,484

[đánh gôn]

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();}}}

[đều đặn]

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();
        }    
      }
  }

Đây là mã golf. Bạn nên giảm câu trả lời của mình (ví dụ: tước khoảng trắng). Bạn vẫn có thể cung cấp câu trả lời hiện tại dưới dạng phiên bản có thể đọc được.
Ismael Miguel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.