पोकेबल सिम्युलेटर


26

पोकेमॉन वीडियो गेम में, खिलाड़ी को जंगली जानवरों को छोटी गेंदों में मजबूर करने और उन्हें लड़ने के लिए प्रशिक्षित करने के लिए दुनिया में भेजा जाता है। बेशक, हर कोई जानता है कि जूझने के लिए कोई भी पोकेमॉन नहीं खेलता है। असली ड्रॉ सीरीज़ है जो पोकेमॉन को ही पकड़ रही है! आपका काम कैप्चर प्रयास के दौरान पोकेबल को अनुकरण करना है। यह चुनौती पीढ़ी V कैप्चर फॉर्मूला का उपयोग करेगी, जो इस प्रकार है:

a = (((3 * HP_max - 2 * HP_current) * रेट * बोनस_बॉल) / 3 * HP_max) * Bonus_status

HP_maxलक्ष्य पोकेमॉन के अधिकतम एचपी के बराबर है। HP_currentलक्ष्य पोकेमॉन के वर्तमान एचपी के बराबर है। पोकेमॉन का rateकैच रेट bonus_ballहै, फेंके गए पोकेबेल का गुणक है, और bonus_status2.5 है यदि लक्ष्य पोकेमोन सो रहा है या जमे हुए है, तो 1.5 अगर लक्ष्य पोकेमॉन लकवाग्रस्त, जहर, या जला हुआ है, और 1 अन्यथा।

खोजने के बाद a, आपको तीन "शेक चेक" करने हैं। शेक चेक के सफल होने की संभावना है 65536 / (255 / a)^(1/4)। यदि इनमें से कोई भी चेक विफल हो जाता है, तो पोकेमॉन अपनी गेंद से बच जाता है। यदि तीनों जाँच सफल होती हैं, तो पकौड़ा पकड़ा जाता है!

नोट: जब भी कोई विभाजन किया जाता है, तो परिणाम को 1/4096 के गुणक में बदल दिया जाता है। यह आम तौर पर एक महत्वहीन विवरण है, लेकिन इसे आपके कार्यक्रम में शामिल किया जाना चाहिए।

आपकी चुनौती एक प्रोग्राम लिखने की है जो शेक चेक को निष्पादित करता है और चेक की स्थिति को रोकने के लिए प्रिंट करता है। स्टडिन पर, आपके कार्यक्रम को (कम से कम, नीचे का विवरण) पोकेमॉन की अधिकतम एचपी, लक्ष्य पोकेमोन की कैच दर, और पोकेबल का नाम प्राप्त होगा। अधिकतम एचपी और कैच रेट दोनों पूर्णांक होने की गारंटी है, जबकि पोकेबल का नाम हमेशा एक स्ट्रिंग होता है। यह इनपुट किसी भी क्रम में आ सकता है और किसी भी परिसीमन चरित्र के साथ आपके लिए सुविधाजनक है, जब तक यह सुसंगत हो। मान लें कि इनपुट सही है, कोई त्रुटि से निपटने की आवश्यकता नहीं है।

आपके द्वारा समर्थित पोकेबल्स के नाम और उनके कैच मल्टीप्लायरों को यहाँ सूचीबद्ध किया गया है:

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

आप मान सकते हैं कि लक्ष्य सो रहा है और 1 एचपी पर है। आउटपुट के लिए अपेक्षित प्रारूप यह है:

(First check failed)
(no output)

(Second check failed)
*shake*

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

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

(यह एक टाइपो नहीं है, आपके प्रोग्राम को कभी भी दो शेक का आउटपुट नहीं देना चाहिए।)

यह , इसलिए आपका स्कोर आपके प्रोग्राम का सोर्स कोड बाइट काउंट है। सबसे कम स्कोर जीतता है।

बोनस!

मैंने कहा कि आप मान सकते हैं कि पोकेमॉन 1 एचपी और सो रहा है। वैकल्पिक रूप से, आप उपयोगकर्ता को पोकेमॉन के वर्तमान एचपी और इनपुट करने की अनुमति दे सकते हैं bonus_status। पोकेमॉन का वर्तमान एचपी हमेशा अपने अधिकतम एचपी के बराबर या उससे कम पूर्णांक bonus_statusहोगा , और हमेशा 2.5, 1.5 या 1. होगा। यदि आप ऐसा करते हैं, तो आपके इनपुट के अंत में आपके पास ये मान होना चाहिए, और 1 के लिए डिफ़ॉल्ट होगा। 2.5 अगर वे आपूर्ति नहीं कर रहे हैं। आप इनमें से किसी एक को लागू करने के लिए अपने अंक से 15 अंक या दोनों के लिए 25 घटा सकते हैं ।

इसके अतिरिक्त, आप महत्वपूर्ण कैप्चर लागू कर सकते हैं। यदि एक महत्वपूर्ण कब्जा होता है, तो केवल एक हिला परीक्षण किया जाता है। यदि विफल रहा, तो कार्यक्रम चुपचाप बाहर निकल जाता है। यदि पारित हो गया, तो यह आउटपुट:

*shake*
Click!

क्रिटिकल कैप्चर अधिक सामान्य हो जाते हैं क्योंकि खिलाड़ी अधिक पोकेमॉन एकत्र करता है, लेकिन सादगी के लिए हम यह मान सकते हैं कि वे पहले से ही "सभी को" पकड़ चुके हैं। यदि 0 और 2047 के बीच एक बेतरतीब ढंग से उत्पन्न संख्या a(पहली गणना का परिणाम) 2.5 से कम है, तो यह एक महत्वपूर्ण कब्जा है। महत्वपूर्ण कैप्चर के लिए समर्थन आपको अपने स्कोर से 25 अंक निकालने की अनुमति देता है ।

कई अन्य पोकेबल्स हैं जिनका आप समर्थन करना चुन सकते हैं। उनके नाम और पकड़ गुणक यहां सूचीबद्ध हैं:

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) घटा सकते हैं ।

अंत में, किक के लिए, इन सभी बोनस (वर्तमान एचपी और बोनस_स्टैटस को स्टैडिन, महत्वपूर्ण कैप्चर और सभी 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 से अधिक है, तो जांच स्वचालित रूप से सफल होती है। मुझे यकीन नहीं है कि दूसरे प्रश्न से आपका क्या मतलब है।
भूमिगत underground

तो rnd < pइसका मतलब है कि चेक rnd0 और 1. की सीमा के साथ सफल है
TheConstructor

1
@IsmaelMiguel मेरी टिप्पणियाँ देखें: आप 0 से 1 की सीमा में एक यादृच्छिक संख्या उत्पन्न करते हैं और इसके खिलाफ तुलना करते हैं 65536 / (255 / a)^(1/4), तो यदि यादृच्छिक संख्या कम है तो शेक टेस्ट सफल हुआ
TheConstructor

1
पाठ में राज्य के रूप में pokeball का पाठ प्रकार, अधिकतम hp और कैच दर आपके प्रोग्राम के इनपुट के रूप में पिछले हैं। वैकल्पिक रूप से आप वर्तमान hp (डिफ़ॉल्ट 1) या स्थिति बोनस (डिफ़ॉल्ट 2.5) के लिए पूछ सकते हैं
TheConstructor

जवाबों:


3

जे 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

चयनित गेंदों को शामिल करने के लिए बोनस: सफारी, स्पोर्ट, ल्यूर, नेट, डस्क, डाइव, फास्ट, क्विक

मुझे 8 * 5 + 6 + 5 + 4 + 3 + 4 + 4 + 4 + 4 + 5 = 75 बोनस अंक दिए

[संपादित करें] हर बार विभाजन का उपयोग न करके १२ भिन्नात्मक बिट्स में किया जाता है

[संपादित करें 2] पोकेबल शब्दकोश का अनुकूलन करें


मुझे लगता है कि आप 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)सभी विभाजनों को बाहर करने के लिए?
.ऑर्स्टिन

1/4096 का मतलब है 12 भिन्नात्मक बिट्स। मेरे समाधान पर एक नज़र है; floor(x*4096)*4096जैसे ही आप दशमलव स्थानों पर जाएंगे, एक अधिक प्रत्यक्ष दृष्टिकोण होगा ।
TheConstructor

ओह्ह मैं देखता हूं, धन्यवाद। यह संभावना बहुगुणित पर भी लागू होनी चाहिए, जैसे कि आपने ऐसा किया है, लेकिन चूंकि नियमों में यह नहीं बताया गया है कि मैं इस बारे में चिंतित नहीं हूं। :)
--orsteinn

हां, शायद वे निश्चित-बिंदु अंकगणित का उपयोग करते हैं। लेकिन ओपी ने केवल गोल विभाजन करने के लिए कहा।
TheConstructor

6

पर्ल 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

हां, मुझे पता है कि यह पूरी तरह से नियम तोड़ता है, लेकिन मुझे परवाह नहीं है। यदि आपने ध्यान नहीं दिया है, तो यह पहला पोकेमॉन जेनरेशन कैप्चर एल्गोरिथम है, जिसके सभी क्वर्क्स (कुछ खास परिस्थितियों में अल्ट्रा बॉल्स अल्ट्रा बॉल्स से बेहतर हैं)। यह उन सभी विशेषताओं को लागू करता है, जिनमें शामिल नहीं हैं (और मैंने वैसे भी उनके लिए अंक शामिल करने का निर्णय लिया है)। गंभीर कब्जा को नजरअंदाज कर दिया जाता है (लेकिन उन्हें लागू किया जाता है - बस यह कि वे कब्जा दर को प्रभावित नहीं करते हैं), नए पोके बॉल्स अन्य पोके बॉल्स के डेटा को लोड करते हैं।

कृपया ध्यान दें कि जब यह उत्तर छोटा होता है, तो यह सभी नियमों को तोड़ देता है, इसलिए इसे केवल एक मजेदार उत्तर मानें, इसे स्वीकार न करें। मैं शुरू में पर्ल 5 में Gen5 एल्गोरिथ्म को लागू करने जा रहा था, लेकिन मैंने फैसला किया - क्यों कुछ मज़ा नहीं है। और हां, मैंने वास्तव में पर्ल 1 को संकलित किया, और यह कोड काम करता है। यदि आप इसे पर्ल के नए संस्करण में चलाते हैं, तो आपको इसके उपयोग में कमी के बारे में चेतावनी मिल सकती है do, लेकिन चलो ईमानदार रहें - यह पर्ल 1 में फ़ंक्शन चलाने का एकमात्र तरीका है। पर्ल 1 में भी अपने आप कुछ क्वर्क हैं (उदाहरण के लिए, मैं नहीं कर सकता /M/पिछली लाइन से शुरू होने वाली लाइन को स्थानांतरित करें - क्यों? - मुझे नहीं पता)।

इसके अलावा, पर्ल 1 में कोई यादृच्छिक संख्या नहीं है, इसलिए आशा है कि आप मुझे मॉडुलो के लिए नहीं मारेंगे $$। यह यादृच्छिक संख्या की सबसे करीबी चीज है जो मुझे मिल सकती है।

संपादित करें: ऐसा प्रतीत होता है कि पुराने do call()वाक्यविन्यास को पर्ल 5.19.8 में हटा दिया गया था। सुनिश्चित करें कि आप इस स्क्रिप्ट को चलाने के लिए पर्ल के पुराने संस्करण का उपयोग करते हैं, क्योंकि ऐसा लगता है कि पर्ल 5.20 पर्ल 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;

इसका उपयोग करने के लिए, आपको 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

और आप सही हैं। मैंने देखा कि मैं डिवीजन से जो भी मूल्य आता है उसका उपयोग कर रहा हूं। यदि आप चाहें, तो आप मुझे कुछ मदद दे सकते हैं, क्योंकि मुझे इस बात का कोई अंदाजा नहीं है कि पीएचपी में छोटी परिशुद्धता के लिए कैसे 'गोल' किया जा सकता है।
इस्माइल मिगुएल

आप floor(x*4096)/4096निश्चित बिंदु विभाजन को लागू कर सकते हैं या लागू कर सकते हैं जैसे मैंने किया।
द कंस्ट्रक्टर

आपके सहयोग के लिए धन्यवाद। मैं ऐसा कभी नहीं सोचूंगा। मैंने अपना जवाब तय कर दिया है।
इस्माइल मिगुएल

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 वैकल्पिक करेंट_हैप और बोनस_स्टेट

=> 611

कार्यक्रम 12 अंश-बिट्स के साथ निश्चित-बिंदु-अंकगणित का उपयोग करता है ( 1/4096सही बिट का मूल्य सबसे अधिक है)। जैसा कि जावा आमतौर पर निश्चित-बिंदु का उपयोग नहीं करता है, अपेक्षित परिणाम प्राप्त करने के लिए कोड के अंदर काफी कुछ बदलाव हैं। उपयोग किए गए अंकगणितीय कार्यों के लिए लंबे संस्करण देखें, जो कि गोल्फिंग प्रयोजनों के लिए इनलेट किए गए हैं।

जबकि अधिकांश गणना 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

कॉफीस्क्रिप्ट - 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 वास्तव में, मुझे लिखने की ज़रूरत है p%(1/4096)। मैंने इसे पोस्ट करने से पहले भी चेक किया था, लेकिन किसी तरह मेरे टेस्ट के परिणाम को याद किया।
मार्टिन एंडर

क्रोम में कोशिश की; बिना () के काम किया है, लेकिन शायद सभी ब्राउज़रों पर हमेशा या नहीं ...
TheConstructor

0

अपडेट: (C #)

बाइट गिनती: 3,600

क्रिटिकल: -25

सभी पोक-बॉल: -91


कुल = 3,484

[Golfed]

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

यह कोड गोल्फिंग है। आपको अपना उत्तर कम करना चाहिए (जैसे: व्हॉट्सएप को अलग करना)। आप अभी भी वर्तमान उत्तर को पठनीय संस्करण के रूप में प्रदान कर सकते हैं।
इस्माइल मिगुएल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.