Pokeball Simulator


26

ในวิดีโอเกมโปเกมอนผู้เล่นจะถูกส่งออกไปยังโลกเพื่อบังคับให้สัตว์ป่าเป็นลูกบอลขนาดเล็กและฝึกฝนให้ต่อสู้ แน่นอนว่าทุกคนรู้ว่าไม่มีใครเล่น Pokemon ในการต่อสู้ ชุดวาดที่แท้จริงคือโปเกมอนที่จับตัวมันเอง! งานของคุณคือการจำลอง pokeball ในระหว่างการพยายามจับ ความท้าทายนี้จะใช้สูตรการจับ 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คือตัวคูณของ pokeball ที่ถูกโยนและbonus_statusเป็น 2.5 หากโปเกมอนเป้าหมายนอนหลับหรือแช่แข็ง 1.5 ถ้าโปเกมอนเป้าหมายนั้นเป็นอัมพาตพิษหรือเผาและ 1 เป็นอย่างอื่น

หลังจากการค้นหาaคุณจะต้องทำการ "ตรวจสอบการสั่น" สูงสุดสามรายการ 65536 / (255 / a)^(1/4)น่าจะเป็นของการตรวจสอบการสั่นไหวที่ประสบความสำเร็จคือ หากการตรวจสอบใด ๆ เหล่านี้ล้มเหลวโปเกมอนจะหนีบอล หากการตรวจสอบทั้งสามรายการสำเร็จจะเป็นการจับโปเกมอน!

หมายเหตุ: เมื่อใดก็ตามที่มีการแบ่งผลการแข่งขันจะถูกปัดเศษเป็นทวีคูณของ 1/4096 โดยทั่วไปนี่เป็นรายละเอียดที่ไม่สำคัญ แต่ต้องคำนึงถึงในโปรแกรมของคุณ

ความท้าทายของคุณคือการเขียนโปรแกรมที่ดำเนินการตรวจสอบการสั่นและพิมพ์เพื่อ stdout สถานะของการตรวจสอบ ใน stdin โปรแกรมของคุณจะได้รับ (อย่างน้อย, รายละเอียดด้านล่าง) HP สูงสุดของโปเกมอน, อัตราการจับของโปเกมอนเป้าหมายและชื่อของ pokeball HP สูงสุดและอัตราการดักจับรับประกันได้ว่าจะเป็นจำนวนเต็มในขณะที่ชื่อของ pokeball จะเป็นสตริงเสมอ การป้อนข้อมูลนี้อาจมีลำดับใด ๆ และมีตัวคั่นที่สะดวกสำหรับคุณตราบใดที่มันสอดคล้องกัน สมมติว่าอินพุตถูกต้องไม่จำเป็นต้องจัดการข้อผิดพลาด

ชื่อของ pokeballs ที่คุณต้องการให้การสนับสนุนและตัวคูณ catch ของพวกเขาอยู่ที่นี่:

  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 และหลับ bonus_statusหรือคุณอาจจะอนุญาตให้ผู้ใช้สามารถป้อนข้อมูลโปเกมอนของเอชพีในปัจจุบันและ HP ปัจจุบันของโปเกมอนจะเป็นจำนวนเต็มเท่ากับหรือน้อยกว่า HP สูงสุดbonus_statusเสมอและจะเป็น 2.5, 1.5 หรือ 1 หากคุณทำคุณจะต้องมีค่าเหล่านี้เมื่อสิ้นสุดการป้อนข้อมูลของคุณและเริ่มต้นที่ 1 และ 2.5 หากไม่ได้ให้มา คุณสามารถลบ15คะแนนจากคะแนนของคุณสำหรับการดำเนินการอย่างใดอย่างหนึ่งเหล่านี้หรือ25สำหรับทั้งสอง

นอกจากนี้คุณอาจใช้การจับที่สำคัญ หากการดักจับแบบวิกฤติเกิดขึ้นจะทำการทดสอบการสั่นเพียงครั้งเดียว หากล้มเหลวโปรแกรมจะออกจากโปรแกรมอย่างเงียบ ๆ ถ้าผ่านมันส่งออก:

*shake*
Click!

การจับที่สำคัญกลายเป็นเรื่องธรรมดามากขึ้นเมื่อผู้เล่นรวบรวมโปเกมอนมากขึ้น แต่เพื่อความเรียบง่ายเราจึงสามารถสรุปได้ว่าพวกเขา "จับได้เลย" หากจำนวนที่สร้างแบบสุ่มระหว่าง 0 ถึง 2047 น้อยกว่าa(ผลลัพธ์ของการคำนวณครั้งแรก) คูณด้วย 2.5 นั่นคือการจับที่สำคัญ การสนับสนุนการบันทึกที่สำคัญช่วยให้คุณสามารถลบ25คะแนนออกจากคะแนนของคุณ

มี pokeball อื่น ๆ อีกมากมายที่คุณอาจเลือกให้การสนับสนุน ชื่อและตัวคูณจับของพวกเขาอยู่ที่นี่:

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 ปัจจุบันและโบนัส _status จาก stdin การจับที่สำคัญและลูกบอลเสริมทั้งหมด 10 ลูก) จะทำให้คุณได้รับโบนัสเพิ่มเติม7คะแนนจากคะแนนรวมเป็น150โบนัสทั้งหมด

ตัวอย่างอินพุต / เอาท์พุต

เพียงเพื่อให้แน่ใจว่าเราทุกคนอยู่ในหน้าเดียวกัน

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

ขอให้โชคดีและเล่นกอล์ฟอย่างมีความสุข!


ตอนนี้ฉันไม่สามารถตัดสินได้ว่าความน่าจะเป็นที่คุณให้ได้เท่าไหร่65536 / (255 / a)^(1/4)แต่ความกล้าของฉันบอกว่ามันมากกว่า 1 คุณตรวจสอบตัวเลขสุ่มในช่วง 0 ถึง 65536 หรือไม่? การตรวจสอบสำเร็จหรือไม่ถ้าหมายเลขสุ่มมีขนาดใหญ่กว่าหรือต่ำกว่า?
TheConstructor

หาก65536 / (255 / a)^(1/4)มากกว่า 1 การตรวจสอบจะสำเร็จโดยอัตโนมัติ ฉันไม่แน่ใจว่าคุณหมายถึงอะไรโดยคำถามที่สอง
undergroundmonorail

ดังนั้นrnd < pหมายถึงการตรวจสอบจะประสบความสำเร็จrndในช่วง 0 และ 1
TheConstructor

1
@IsmaelMiguel ดูความคิดเห็นของฉัน: คุณสร้างตัวเลขสุ่มในช่วง 0 ถึง 1 และเปรียบเทียบกับ65536 / (255 / a)^(1/4)ถ้าจำนวนสุ่มน้อยกว่าการทดสอบการสั่นสำเร็จ
TheConstructor

1
ตามที่ระบุไว้ในข้อความชนิดของข้อความต้นฉบับของ pokeball max hp และอัตราการจับภาพจะผ่านพ้นไปเป็นข้อมูลเข้าสู่โปรแกรมของคุณ คุณสามารถเลือกที่จะขอ hp ปัจจุบัน (ค่าเริ่มต้น 1) หรือสถานะโบนัส (ค่าเริ่มต้น 2.5)
TheConstructor

คำตอบ:


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

ที่นี่รุ่น golfed

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, กีฬา, Lure, Net, Dusk, Dive, Fast, Quick

ให้ฉัน 8 * 5 + 6 + 5 + 4 + 3 + 4 + 4 + 4 + 5 = 75 คะแนนโบนัส

[แก้ไข] ปัดเศษเป็นเศษส่วน 12 บิตทุกครั้งที่มีการใช้งานโดยไม่ใช้งาน

[edit2] เพิ่มประสิทธิภาพพจนานุกรม pokeball


ฉันคิดว่าคุณใช้ precission สูงกว่า 1/4096 (รัฐถามNote: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor

คุณอาจจะถูกต้องฉันไม่เข้าใจส่วนนั้นและคำตอบอื่น ๆ ดูเหมือนจะทำแบบเดียวกับที่ฉันทำ ฉันเดาว่าฉันต้องทำสิ่งนี้ 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เหมือนกับที่คุณปัดเศษเช่นตำแหน่งทศนิยม
TheConstructor

โอ้โหเข้าใจแล้วขอบคุณ สิ่งนี้น่าจะนำไปใช้กับการคูณเช่นคุณดูเหมือนจะทำ แต่เนื่องจากไม่ได้ระบุไว้ในกฎฉันจะไม่กังวลเกี่ยวกับสิ่งนั้น :)
Þorsteinn

ใช่พวกเขาอาจใช้เลขคณิตแบบคงที่ แต่ OP ขอเพียงการแบ่งรอบ
TheConstructor

6

Perl 1 (374 - 150 = 224 + ไม่มีจำนวนไบต์)

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émonรุ่นแรกโดยมีองค์ประกอบทั้งหมด (Great Balls ดีกว่า Ultra Balls ในบางสภาวะ) สิ่งนี้ใช้คุณสมบัติทั้งหมดรวมถึงคุณสมบัติที่ไม่รวมอยู่ด้วย (และฉันตัดสินใจที่จะรวมคะแนนสำหรับพวกเขาด้วย การจับที่สำคัญจะถูกเพิกเฉย (แต่จะถูกนำไปใช้ แต่จะไม่ส่งผลต่ออัตราการจับ) Poké Balls รุ่นใหม่จะโหลดข้อมูลของPoké Balls อื่น

โปรดทราบว่าในขณะที่คำตอบนี้สั้น แต่มันก็ทำผิดกฎทั้งหมดดังนั้นให้คิดว่ามันเป็นคำตอบที่สนุกอย่ายอมรับเลย ตอนแรกฉันจะใช้อัลกอริทึม Gen5 ใน Perl 5 แต่ฉันตัดสินใจ - ทำไมไม่สนุก และใช่ฉันรวบรวม Perl 1 จริงๆแล้วรหัสนี้ใช้ได้ หากคุณรันด้วย Perl รุ่นใหม่คุณอาจได้รับคำเตือนเกี่ยวกับการเลิกใช้doแต่ขอบอกตรงๆว่ามันเป็นวิธีเดียวที่จะใช้งานฟังก์ชั่นใน Perl 1 ได้ Perl 1 ยังมีนิสัยใจคอด้วยตัวของมันเอง (ตัวอย่างเช่นฉันไม่สามารถ ย้ายบรรทัดที่ขึ้นต้นด้วย/M/บรรทัดก่อนหน้า - ทำไม - ฉันไม่รู้)

นอกจากนี้ยังไม่มีตัวเลขสุ่มใน Perl 1 $$ดังนั้นหวังว่าคุณจะไม่ฆ่าฉันสำหรับโมดูโลของ มันเป็นสิ่งที่ใกล้เคียงกับตัวเลขสุ่มที่ฉันจะได้พบ

แก้ไข: ดูเหมือนว่าdo call()ไวยากรณ์เก่าถูกลบใน Perl 5.19.8 ตรวจสอบให้แน่ใจว่าคุณใช้ Perl รุ่นเก่าเพื่อเรียกใช้สคริปต์นี้เนื่องจากดูเหมือนว่า Perl 5.20 จะไม่สามารถทำงานร่วมกับสคริปต์ Perl 1 ได้


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;

ในการใช้สิ่งนี้คุณต้องระบุอินพุตเป็น 'ball = poke & status = sleep' บน STDIN

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


ฉันคิดว่าคุณกำลังใช้ Precission สูงกว่า 1/4096 (รัฐคำถามหมายเหตุ: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor

และคุณพูดถูก ฉันสังเกตเห็นว่าฉันกำลังใช้สิ่งที่มีค่ามาจากการหาร ถ้าคุณต้องการคุณสามารถให้ความช่วยเหลือฉันเพราะฉันไม่มีความคิดว่าจะ 'รอบ' เพื่อความแม่นยำน้อยใน PHP
Ismael Miguel

คุณสามารถทำfloor(x*4096)/4096หรือใช้การแบ่งจุดคงที่เหมือนที่ฉันทำ
TheConstructor

ขอขอบคุณสำหรับความช่วยเหลือของคุณ. ฉันจะไม่คิดอย่างนั้น ฉันได้แก้ไขคำตอบแล้ว
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":""):""):"");}}

คะแนน:

  • 729 ไบต์
  • -93 ลูกบอลทั้งหมด
  • -25 ตัวเลือก current_hp และ bonus_state

=> 611

โปรแกรมใช้ fixed-point-arithmetics พร้อมเศษส่วน 12 บิต ( 1/4096คือค่าบิตขวาสุด) เนื่องจาก Java ไม่ได้ใช้จุดคงที่จึงมีการเปลี่ยนแปลงบางอย่างภายในโค้ดเพื่อให้ได้ผลลัพธ์ตามที่คาดหวัง ดูรุ่นยาวสำหรับฟังก์ชั่นเลขคณิตที่ใช้แล้วซึ่งได้รับการ inline เพื่อวัตถุประสงค์ในการเล่นกอล์ฟ

ในขณะที่การคำนวณส่วนใหญ่สามารถทำได้กับintค่าต่างๆหน่วยงานจะทำงานได้ดีขึ้นlongเมื่อคุณต้องการเปลี่ยนเงินปันผลอีก 12 บิตไปทางซ้ายเพื่อรักษาความแม่นยำที่ต้องการ (มิฉะนั้นคุณจะเศษส่วนบิตทั้งหมด)

อินพุตตัวอย่าง ( ;จำเป็นเฉพาะเมื่อเรียกใช้แบบโต้ตอบเช่น STDIN ไม่ได้รับ EOF): ลูกบอล, catch_rate, max_hp

Poke 15 255 ;

ตัวอย่างผลลัพธ์:

*shake*

อินพุตตัวอย่าง: ลูกบอล, 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

CoffeeScript - 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ลูกบอล

นี่เป็นสิ่งแรกที่ฉันเคยเล่นกอล์ฟนั่นไม่ใช่ regex ดังนั้นอาจมีห้องสำหรับการปรับปรุง ฉันคัดลอกความคิดอย่างไร้ยางอายเพื่อเก็บชื่อบอลบางส่วนเท่านั้น ;) การสนับสนุนอีกสองลูกนั้นไม่คุ้มค่าแม้แต่กับ+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
ดูเหมือนว่าความเฉลียวฉลาดจะอยู่เคียงข้างคุณ Oo p-=p%1/4096ดูเหมือนจะได้ผลจริงๆ (คงจะเดาได้ว่าอย่างน้อยคุณก็ต้องเขียน แต่p-=p%(1/4096)ก็ยังไม่แน่ใจว่าโมดูลัสจะถูกนำไปใช้กับเศษส่วนทั้งสองข้างได้ดี!
TheConstructor

@TheConstructor ฮ่าฮ่าจริง ๆ แล้วฉันต้องตรวจสอบว่า ... มันดูแปลกสำหรับฉันเช่นกัน แต่%สามารถใช้สำหรับสิ่งที่ตลกใน JS หลังจากอ่านคำถามอีกครั้งฉันคิดว่าคำตอบนี้ยังไม่เป็นไปตามข้อกำหนดการปัดเศษ ฉันคิดว่าควรปัดเศษหลังจากแต่ละแผนก ฉันอาจต้องปรับโครงสร้างการคำนวณเล็กน้อย ^^
Martin Ender

ใช่อาจเป็นความคิดที่ดี
TheConstructor

@TheConstructor p%(1/4096)อันที่จริงผมจะต้องเขียน ฉันตรวจสอบเรื่องนี้ก่อนโพสต์ แต่ก็จำผลลัพธ์การทดสอบของฉันผิดได้
Martin Ender

พยายามใน Chrome; ทำงานได้โดยไม่ต้อง () แต่อาจจะไม่เสมอไปหรือไม่ในเบราว์เซอร์ทั้งหมด ...
TheConstructor

0

อัปเดต: (C #)

จำนวนไบต์: 3,600

Critcal: -25

ลูกบอลกระตุ้นทั้งหมด: -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();
        }    
      }
  }

นี่คือรหัสกอล์ฟ คุณควรลดคำตอบของคุณ (เช่น: การลอก whitespaces) คุณยังสามารถให้คำตอบปัจจุบันเป็นเวอร์ชันที่อ่านได้
Ismael Miguel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.