模板:JSFormation

来自LoveLive Wiki
ポテト讨论 | 贡献2024年1月22日 (一) 19:08的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

let TEST_20240116={nohigherthan_success:0,nohigherthan_total:0,while_confirmed_size_l8:0,while_confirmed_size_l8_break:0,while_confirmed_size_l8_confirmed_set_unchanged:0,lesseq_card_count:0,time_selfcenter_filter:0,time_fast_minmax:0,time_fast_minmax_sort:0,time_partialorder_p1_1:0,time_partialorder_p1_2:0,time_partialorder_p1_2_h67:0,time_autoselect_others_total:0,depth_7_count:0,depth_8_count:0,};const background_settings={perfect_rate:96,skill_probability_up_flat:0,};function perfect_cache_clear(){sif2_live_data._chart_info.forEach(({skill_coverage_perfect})=>{skill_coverage_perfect.clear()})}function member_target_group_test(g,card){if(g===tgtype.all)return true;const{masterCharacterId:m,type:attr}=card;switch(g){case tgtype.none:case tgtype.arise:case tgtype.ss:case tgtype.sas:case tgtype.snp:case tgtype.yn:case tgtype.dummy_500:case tgtype.dummy_501:case tgtype.dummy_502:case tgtype.dummy_503:case tgtype.dummy_600:case tgtype.dummy_9999:return false;case tgtype.muse:case tgtype.muse_solo:case tgtype.muse_other:return Math.floor(m/1000)===1;case tgtype.aqours:case tgtype.aqours_solo:case tgtype.aqours_other:return Math.floor(m/1000)===2;case tgtype.niji:case tgtype.niji_solo:case tgtype.niji_other:return Math.floor(m/1000)===3;case tgtype.liella:case tgtype.liella_solo:case tgtype.liella_other:return Math.floor(m/1000)===4;case tgtype.pts:return m===1001||m===1003||m===1008;case tgtype.llw:return m===1004||m===1005||m===1007;case tgtype.bibi:return m===1002||m===1006||m===1009;case tgtype.cyr:return m===2001||m===2005||m===2009;case tgtype.aaa:return m===2003||m===2004||m===2007;case tgtype.gk:return m===2002||m===2006||m===2008;case tgtype.dd:return m===3004||m===3005;case tgtype.azn:return m===3001||m===3003||m===3007;case tgtype.q4:return m===3002||m===3006||m===3008||m===3009;case tgtype.r3b:return m===3010||m===3011||m===3012;case tgtype.catchu:return m===4001||m===4004||m===4007;case tgtype.kld:return m===4002||m===4005||m===4010;case tgtype.sync:return m===4003||m===4006||m===4008||m===4009||m===4011;case tgtype.smile_1919810:return attr===1;case tgtype.pure_1919810:return attr===2;case tgtype.cool_1919810:return attr===3;default:throw new Error(`unrecognized target ${g}.\nfor member ${m}type(attribute)${attr}.`)}}function skill_score_fetch(difficulty_id,skill,cards_by_pos,perfect_rate){if(skill.type===sktype.judge||skill.type===sktype.heal)return 0;const{tr,tm,pb,ev}=skill;const pb_ratios=[];for(let i=0;i<10;i+=1)pb_ratios.push(1-Math.pow(1-(pb+background_settings.skill_probability_up_flat)/10000,i));const stacks_by_pos=sif2_live_data.chart_skill_coverage_get(difficulty_id,skill);const at_100_pr=ev*stacks_by_pos.reduce((prev,stacks,pos)=>{if(!member_target_group_test(skill.target,cards_by_pos&&cards_by_pos[pos]||undefined))return prev;if(stacks.length>=10)throw new Error(`one skill stacks more than 10`);return prev+stacks.reduce((p,c,s)=>{return p+c*pb_ratios[s]},0)},0);if(skill.type===sktype.score_bad){return at_100_pr}else if(skill.type===sktype.score_perfect){if(!perfect_rate)throw new Error();return at_100_pr*perfect_rate/100}}function skill_judge_fetch(difficulty_id,skill){if(skill.type!==sktype.judge)return 0;const{tr,tm,pb,ev}=skill;if(ev<1)throw new Error();const pb_ratios=[];for(let i=0;i<10;i+=1)pb_ratios.push(1-Math.pow(1-pb/10000,i));const stacks_by_pos=sif2_live_data.chart_skill_coverage_get(difficulty_id,skill);return stacks_by_pos.reduce((prev,stacks,pos)=>{if(stacks.length>=10)throw new Error(`one skill stacks more than 10`);return prev+stacks.reduce((p,c,s)=>{return p+c*pb_ratios[s]},0)},0)/sif2_live_data.chart_info_get(difficulty_id).note_list.length}class guest_default{static get_list(live_attr){const target_map=[,this.smile,this.pure,this.cool][live_attr];if(target_map.size>0)return target_map;const guest_center_set=new Set();sif2_card_data.forEach((v,id1)=>guest_center_set.add(id1));sif2_card_data.forEach((v,id1)=>{if(!guest_center_set.has(id1))return;for(const id2 of guest_center_set){if(id1===id2)continue;if(guest_nohigherthan(id1,id2,live_attr)){guest_center_set.delete(id1);break}}});guest_center_set.forEach((v)=>target_map.set(v,sif2_card_data.get(v).center_skill));return target_map}}guest_default.smile=new Map();guest_default.pure=new Map();guest_default.cool=new Map();function guest_nohigherthan(id1,id2,live_attr){const cs1=sif2_card_data.get(id1).center_skill,cs2=sif2_card_data.get(id2).center_skill;const center_skill_diff=new Map([[tgtype.all,0]]);if(cs2.type_1===live_attr)center_skill_diff.set(cs2.target_1,(center_skill_diff.has(cs2.target_1)&&center_skill_diff.get(cs2.target_1)||0)+cs2.value_1);if(cs2.type_2===live_attr)center_skill_diff.set(cs2.target_2,(center_skill_diff.has(cs2.target_2)&&center_skill_diff.get(cs2.target_2)||0)+cs2.value_2);if(cs1.type_1===live_attr){center_skill_diff.set(cs1.target_1,(center_skill_diff.has(cs1.target_1)&&center_skill_diff.get(cs1.target_1)||0)-cs1.value_1)}if(cs1.type_2===live_attr){center_skill_diff.set(cs1.target_2,(center_skill_diff.has(cs1.target_2)&&center_skill_diff.get(cs1.target_2)||0)-cs1.value_2)}let diff_min=center_skill_diff.get(tgtype.all);center_skill_diff.delete(tgtype.all);center_skill_diff.forEach((v,k)=>{if(v<0)diff_min+=v});return diff_min>=0}function autoselect_center(difficulty_id,selected_cards,center_skill_guest_ids,forced_card_set,forced_center){const{attribute:live_attr,masterGroupId:live_group}=sif2_live_data.live_info.get(Math.floor(difficulty_id/10));if(selected_cards.size<9)throw new Error(`less than 9 cards selected`);const card_set=new Map();const powers=[];selected_cards.forEach(({id,level,skill_level})=>{const card=sif2_card_data.get(id);const power=Math.floor((live_attr===1&&card.smile||live_attr===2&&card.pure||live_attr===3&&card.cool||Number.NaN)*card_level_ratio(card.rarity,level)/10000);const skill=card.skill_by_level.get(skill_level);const center_skill=card.center_skill;const attr_group_boost=(card.type===live_attr?1.1:1)*(member_target_group_test(live_group,card)?1.1:1)-1;if(skill.target!==tgtype.all)throw new Error(`card ${id}skill target ${skill.target}is not ALL,not supported`);const skill_score=skill_score_fetch(difficulty_id,skill,null,background_settings.perfect_rate);const judge_rate=skill_judge_fetch(difficulty_id,skill);if(card_set.has(id))throw new Error(`duplicate card ${id}`);card_set.set(id,{power,power_c:null,attr_group_boost,skill_score,judge_rate,center_skill});powers.push(power)});const power_max8=powers.sort((a,b)=>b-a).slice(0,8).reduce((prev,v)=>v+prev,0);const power_min8=powers.sort((a,b)=>a-b).slice(0,8).reduce((prev,v)=>v+prev,0);if(forced_center&&!card_set.has(forced_center))throw new Error(`forced center ${forced_center}does not exist in card_set`);const center_set=forced_center?new Map([[forced_center,card_set.get(forced_center)]]):new Map(card_set);const weights_by_pos=sif2_live_data.chart_info_get(difficulty_id).weights_total;const total_weight=weights_by_pos.reduce((prev,w)=>prev+w,0);const weight_other_max=Math.max(...weights_by_pos.filter((v,i)=>i>0&&i!==5));const weight_other_min=Math.min(...weights_by_pos.filter((v,i)=>i>0&&i!==5));const judge_ratio=0.88+0.12*(background_settings.perfect_rate/100);let guest_set;if(!center_skill_guest_ids||center_skill_guest_ids.length===1&&center_skill_guest_ids[0]===0){guest_set=new Map();guest_set.set(0,{type_1:0,target_1:0,value_1:0,type_2:0,target_2:0,value_2:0})}else if(center_skill_guest_ids.length===0){guest_set=guest_default.get_list(live_attr)}else{guest_set=new Map();center_skill_guest_ids.forEach((id)=>{guest_set.set(id,sif2_card_data.get(id).center_skill)})}const guest_center_set=new Map(guest_set);if(center_skill_guest_ids)guest_set.forEach((v,id1)=>{if(!guest_center_set.has(id1))return;for(const[id2,]of guest_center_set){if(id1===id2)continue;if(guest_nohigherthan(id1,id2,live_attr)){guest_center_set.delete(id1);break}}});const[guest_min,guest_max]=(()=>{let min=0,max=-999999;guest_center_set.forEach((center_skill,id)=>{if(center_skill.type_1!==live_attr){if(max<0)max=0;if(center_skill.type_2===live_attr)throw new Error(`C位技能的两个作用属性不同`);return}if(center_skill.target_1===tgtype.all&&center_skill.value_1>min)min=center_skill.value_1;if((center_skill.value_1+center_skill.value_2)>max)max=(center_skill.value_1+center_skill.value_2)});return[min,max]})();function nohigherthan(id1,id2){const c1=center_set.get(id1),c2=center_set.get(id2);const attr_group_boost_diff=c2.attr_group_boost-c1.attr_group_boost;let relative_1=0;if(c1.attr_group_boost<c2.attr_group_boost){if(weights_by_pos[5]<weight_other_max){relative_1=attr_group_boost_diff*(weights_by_pos[5]-weight_other_max)/(total_weight+c1.attr_group_boost*weights_by_pos[5]+c2.attr_group_boost*weight_other_max)}else if(weights_by_pos[5]>weight_other_max){const total_plus=(total_weight-weights_by_pos[5]-weight_other_max)*(1.1*1.1-1);relative_1=attr_group_boost_diff*(weights_by_pos[5]-weight_other_max)/(total_weight+total_plus+c1.attr_group_boost*weights_by_pos[5]+c2.attr_group_boost*weight_other_max)}}else if(c1.attr_group_boost>c2.attr_group_boost){if(weights_by_pos[5]<weight_other_min){const total_plus=(total_weight-weights_by_pos[5]-weight_other_min)*(1.1*1.1-1);relative_1=attr_group_boost_diff*(weights_by_pos[5]-weight_other_min)/(total_weight+total_plus+c1.attr_group_boost*weights_by_pos[5]+c2.attr_group_boost*weight_other_min)}else if(weights_by_pos[5]>weight_other_min){relative_1=attr_group_boost_diff*(weights_by_pos[5]-weight_other_min)/(total_weight+c1.attr_group_boost*weights_by_pos[5]+c2.attr_group_boost*weight_other_min)}}const center_skill_diff=new Map([[tgtype.all,0]]);let c1_min=0,c1_max=0;if(c2.center_skill.type_1===live_attr)center_skill_diff.set(c2.center_skill.target_1,(center_skill_diff.has(c2.center_skill.target_1)&&center_skill_diff.get(c2.center_skill.target_1)||0)+c2.center_skill.value_1);if(c2.center_skill.type_2===live_attr)center_skill_diff.set(c2.center_skill.target_2,(center_skill_diff.has(c2.center_skill.target_2)&&center_skill_diff.get(c2.center_skill.target_2)||0)+c2.center_skill.value_2);if(c1.center_skill.type_1===live_attr){center_skill_diff.set(c1.center_skill.target_1,(center_skill_diff.has(c1.center_skill.target_1)&&center_skill_diff.get(c1.center_skill.target_1)||0)-c1.center_skill.value_1);c1_max=c1_min=c1.center_skill.value_1}if(c1.center_skill.type_2===live_attr){center_skill_diff.set(c1.center_skill.target_2,(center_skill_diff.has(c1.center_skill.target_2)&&center_skill_diff.get(c1.center_skill.target_2)||0)-c1.center_skill.value_2);c1_max+=c1.center_skill.value_2}let c2dc1_min=center_skill_diff.get(tgtype.all);center_skill_diff.delete(tgtype.all);center_skill_diff.forEach((v,k)=>{if(v<0)c2dc1_min+=v});let relative_2=0;if(c2dc1_min<0){if(relative_1<=0)return false;relative_2=c2dc1_min/(10000+c1_min+guest_min)}else if(c2dc1_min>0){relative_2=c2dc1_min/(10000+c1_max+guest_max)}if((1+relative_1)*(1+relative_2)<1)return false;const p_diff=c2.power-c1.power;const w_diff=attr_group_boost_diff*weights_by_pos[5];const c_diff=c2dc1_min;let boost=+Infinity;for(const op of[power_min8,power_max8]){for(const ow of[total_weight,total_weight+(total_weight-weights_by_pos[5])*(1.1*1.1-1)]){for(const oc of[10000+guest_min,10000+guest_max]){boost=Math.min(boost,p_diff*ow*oc+op*w_diff*oc+op*ow*c_diff+p_diff*w_diff*oc+p_diff*ow*c_diff+op*w_diff*c_diff+p_diff*w_diff*c_diff)}}}const absolute=boost/80/10000*judge_ratio+c2.skill_score-c1.skill_score;if(absolute>=0){TEST_20240116.nohigherthan_success+=1;return true}else return false}card_set.forEach((v,id1)=>{if(!center_set.has(id1))return;for(const[id2,]of center_set){if(id1===id2)continue;TEST_20240116.nohigherthan_total+=1;if(nohigherthan(id1,id2)){center_set.delete(id1);break}}});if(forced_card_set)forced_card_set.forEach((id)=>{if(card_set.has(id))return;else throw new Error(`forced card ${id}does not exist in card_set`)});let max_score=-1,max_card_ids=null,max_gid=null;for(const[gid,guest_center_skill]of guest_center_set){for(const[cid]of center_set){const{card_id_by_pos,score}=autoselect_others(difficulty_id,card_set,cid,guest_center_skill,forced_card_set);if(score<0)throw new Error(`difficulty ${difficulty_id}get a negative score ${score}with formation ${JSON.stringify(card_id_by_pos)}`);if(score>max_score){max_card_ids=card_id_by_pos;max_gid=gid;max_score=score}}}const card_by_pos=max_card_ids.map((id_s)=>{for(const[,{id,level,skill_level}]of selected_cards){if(id_s===id)return{id,level,skill_level}}return null});const r=score_final(difficulty_id,card_by_pos,guest_center_set.get(max_gid));return{difficulty_id,card_by_pos,guest_id:max_gid,score:r.score,tap:r.tap,skill:r.skill,base_tap_score:r.base_tap_score,detail_by_pos:r.detail_by_pos}}function autoselect_others(difficulty_id,card_set,center_id,center_skill_guest,forced_card_set){const{attribute:live_attr,masterGroupId:live_group}=sif2_live_data.live_info.get(Math.floor(difficulty_id/10));const center_skill_self=card_set.get(center_id).center_skill;const intermediate_set=new Map();card_set.forEach(({power,attr_group_boost,skill_score,judge_rate},id)=>{const card=sif2_card_data.get(id);let power_c=power;if(center_skill_self.type_1===live_attr&&member_target_group_test(center_skill_self.target_1,card))power_c+=Math.ceil(power*center_skill_self.value_1/10000);if(center_skill_self.type_2===live_attr&&member_target_group_test(center_skill_self.target_2,card))power_c+=Math.ceil(power*center_skill_self.value_2/10000);if(center_skill_guest.type_1===live_attr&&member_target_group_test(center_skill_guest.target_1,card))power_c+=Math.ceil(power*center_skill_guest.value_1/10000);if(center_skill_guest.type_2===live_attr&&member_target_group_test(center_skill_guest.target_2,card))power_c+=Math.ceil(power*center_skill_guest.value_2/10000);intermediate_set.set(id,{power:null,power_c,attr_group_boost,skill_score,judge_rate,center_skill:null})});const center_set=intermediate_set.get(center_id);const confirmed_set=new Map();intermediate_set.delete(center_id);const forced_confirm_set=new Set(forced_card_set);forced_confirm_set.delete(center_id);if(forced_confirm_set){for(const id of forced_confirm_set){confirmed_set.set(id,intermediate_set.get(id));if(confirmed_set.size>8)throw new Error(`9 or more forced non-center components`);intermediate_set.delete(id)}}const weights_by_pos=sif2_live_data.chart_info_get(difficulty_id).weights_total;const weights_others_order=weights_by_pos.filter((v,i)=>i>0&&i!==5).sort((a,b)=>b-a);const total_weight=weights_by_pos.reduce((prev,w)=>prev+w,0);const judge_ratio=0.88+0.12*(background_settings.perfect_rate/100);const result=partial_order(center_set,intermediate_set,confirmed_set,total_weight,weights_by_pos,weights_others_order,judge_ratio);const id_ag_pair=[];result.confirmed_set.forEach(({attr_group_boost},id)=>{id_ag_pair.push({id,attr_group_boost})});id_ag_pair.sort((a,b)=>b.attr_group_boost-a.attr_group_boost);const selected_card_ids=[];selected_card_ids[5]=center_id;id_ag_pair.forEach(({id},i)=>{const weight=weights_others_order[i];let pos=0;do{pos=weights_by_pos.indexOf(weight,pos+1);if(pos<1||pos>9)throw new Error();}while(selected_card_ids[pos]);selected_card_ids[pos]=id});return{card_id_by_pos:selected_card_ids,score:result.score}}function sort_top_nth(array,rank,func,left=0,right=array.length-1){if(left>=right)return;const border=array[left];let i=left,j=right;while(i<j){while(i<j&&func(array[j],border)>=0)j-=1;if(i<j){array[i]=array[j];i+=1}while(i<j&&func(array[i],border)<0)i+=1;if(i<j){array[j]=array[i];j-=1}}array[i]=border;if(i+1===rank)return;if(i+1>rank)sort_top_nth(array,rank,func,left,i-1);else sort_top_nth(array,rank,func,i+1,right)}function partial_order(center_set,intermediate_set,confirmed_set,total_weight,weights_by_pos,weights_others_order,judge_ratio,depth=0){switch(depth){case 0:{if(intermediate_set.size<37)break;let max_totalpowerc=center_set.power_c,min_totalpowerc=center_set.power_c;confirmed_set.forEach(({power_c,attr_group_boost})=>{max_totalpowerc+=power_c;min_totalpowerc+=power_c});const intermediate_power_cs=[];intermediate_set.forEach(({power_c,attr_group_boost})=>{intermediate_power_cs.push(power_c)});sort_top_nth(intermediate_power_cs,7-confirmed_set.size,(a,b)=>b-a);for(let i=0;i<7-confirmed_set.size;i+=1){max_totalpowerc+=intermediate_power_cs[i]}sort_top_nth(intermediate_power_cs,7-confirmed_set.size,(a,b)=>a-b);for(let i=0;i<7-confirmed_set.size;i+=1){min_totalpowerc+=intermediate_power_cs[i]}const list=[];intermediate_set.forEach(({power_c,attr_group_boost,skill_score,judge_rate},id)=>{const min=(min_totalpowerc+power_c)*weights_others_order[7]*attr_group_boost+power_c*(total_weight*1.00)+skill_score*80/judge_ratio;const max_expression_1=((power_c)*(attr_group_boost-(1.1*1.1-1))+max_totalpowerc*attr_group_boost);const max=(max_expression_1>0?(weights_others_order[0]*max_expression_1+power_c*total_weight*1.1*1.1):(weights_others_order[7]*max_expression_1+power_c*total_weight*1.1*1.1))+skill_score*80/judge_ratio;list.push({id,min,max})});sort_top_nth(list,7-confirmed_set.size,(a,b)=>b.min-a.min);const eliminated_max=list[7-confirmed_set.size].min;list.forEach(({id,max})=>{if(max<eliminated_max)intermediate_set.delete(id)});break}case 7:{TEST_20240116.depth_7_count+=1;break}case 8:{TEST_20240116.depth_8_count+=1;break}case 9:{console.error(intermediate_set,confirmed_set);throw new Error(`depth 9 is not possible`);}}let leq0_ids_g=null;const trace_changes={intermediate_set_size_before:intermediate_set.size,};const TEST_original_intermediate_set=new Map(intermediate_set);while(confirmed_set.size<8){TEST_20240116.while_confirmed_size_l8+=1;const intermediate_power_cs=[];const intermediate_agmap=new Map([[0,0],[1.1-1,0],[1.1*1.1-1,0]]);intermediate_set.forEach(({power_c,attr_group_boost})=>{intermediate_power_cs.push(power_c);intermediate_agmap.set(attr_group_boost,intermediate_agmap.has(attr_group_boost)?(intermediate_agmap.get(attr_group_boost)+1):1)});let max_totalpowerc=center_set.power_c,min_totalpowerc=center_set.power_c;const confirmed_agmap=new Map([[0,0],[1.1-1,0],[1.1*1.1-1,0]]);confirmed_set.forEach(({power_c,attr_group_boost})=>{max_totalpowerc+=power_c;min_totalpowerc+=power_c;confirmed_agmap.set(attr_group_boost,confirmed_agmap.has(attr_group_boost)?(confirmed_agmap.get(attr_group_boost)+1):1)});sort_top_nth(intermediate_power_cs,7-confirmed_set.size,(a,b)=>b-a);for(let i=0;i<7-confirmed_set.size;i+=1){max_totalpowerc+=intermediate_power_cs[i]}sort_top_nth(intermediate_power_cs,7-confirmed_set.size,(a,b)=>a-b);for(let i=0;i<7-confirmed_set.size;i+=1){min_totalpowerc+=intermediate_power_cs[i]}const max_sumproduct_by_boost=new Map();const min_sumproduct_by_boost=new Map();const boosts=[0,1.1-1,1.1*1.1-1];const confirmed_boosts=boosts.map(v=>confirmed_agmap.get(v));const intermediate_boosts=boosts.map(v=>intermediate_agmap.get(v));for(let i=0;i<boosts.length;i+=1){if(intermediate_boosts[i]<=0)continue;confirmed_boosts[i]+=1;intermediate_boosts[i]-=1;let selected_boosts=[...confirmed_boosts];let remaining_count=7-confirmed_set.size;for(let j=boosts.length-1;j>=0;j-=1){if(remaining_count<=intermediate_boosts[j]){selected_boosts[j]+=remaining_count;break}else{selected_boosts[j]+=intermediate_boosts[j];remaining_count-=intermediate_boosts[j]}}max_sumproduct_by_boost.set(boosts[i],{sumproduct:selected_boosts.reduceRight(({start,value},c,j)=>{for(let k=start;k<start+c;k+=1)value+=weights_others_order[k]*boosts[j];start+=c;return{start,value}},{start:0,value:0}).value,lastrank:selected_boosts.reduceRight((p,c,j)=>p+(j>=i?c:0),-1),});selected_boosts=[...confirmed_boosts];remaining_count=7-confirmed_set.size;for(let j=0;j<boosts.length;j+=1){if(remaining_count<=intermediate_boosts[j]){selected_boosts[j]+=remaining_count;break}else{selected_boosts[j]+=intermediate_boosts[j];remaining_count-=intermediate_boosts[j]}}min_sumproduct_by_boost.set(boosts[i],{sumproduct:selected_boosts.reduceRight(({start,value},c,j)=>{for(let k=start;k<start+c;k+=1)value+=weights_others_order[k]*boosts[j];start+=c;return{start,value}},{start:0,value:0}).value,lastrank:selected_boosts.reduceRight((p,c,j)=>p+(j>=i?c:0),-1),});confirmed_boosts[i]-=1;intermediate_boosts[i]+=1}const expression_1_min=total_weight+1*((min_sumproduct_by_boost.has(1.1*1.1-1)&&(min_sumproduct_by_boost.get(1.1*1.1-1).sumproduct-weights_others_order[0]*(1.1*1.1-1)))||(min_sumproduct_by_boost.has(1.1-1)&&(min_sumproduct_by_boost.get(1.1-1).sumproduct-weights_others_order[0]*(1.1-1)))||(min_sumproduct_by_boost.has(0)&&(min_sumproduct_by_boost.get(0).sumproduct)));const expression_1_max=total_weight+1*((max_sumproduct_by_boost.has(0)&&(max_sumproduct_by_boost.get(0).sumproduct))||(max_sumproduct_by_boost.has(1.1-1)&&(max_sumproduct_by_boost.get(1.1-1).sumproduct-weights_others_order[7]*(1.1-1)))||(max_sumproduct_by_boost.has(1.1*1.1-1)&&(max_sumproduct_by_boost.get(1.1*1.1-1).sumproduct-weights_others_order[7]*(1.1*1.1-1))));function lesseq_card(card_1,card_2){TEST_20240116.lesseq_card_count+=1;const diff_power_c=card_2.power_c-card_1.power_c,diff_attr_group_boost=card_2.attr_group_boost-card_1.attr_group_boost,diff_skill_score=card_2.skill_score-card_1.skill_score;if(diff_power_c>=0&&diff_attr_group_boost>=0&&diff_skill_score>=0){if(diff_power_c===0&&diff_attr_group_boost===0&&diff_skill_score===0){if(card_1.judge_rate<=card_2.judge_rate)return false;else if(card_1.judge_rate===card_2.judge_rate){if(card_1.id<card_2.id)return false}}return true}if(diff_attr_group_boost>=0){let diff_total=diff_skill_score*80/judge_ratio;if(diff_power_c>=0){diff_total+=diff_power_c*(total_weight+min_sumproduct_by_boost.get(card_1.attr_group_boost).sumproduct)}else{diff_total+=diff_power_c*(total_weight+max_sumproduct_by_boost.get(card_1.attr_group_boost).sumproduct)}if(diff_total>=0)return true}if(diff_attr_group_boost!==0){let diff_total=diff_skill_score*80/judge_ratio;if(diff_power_c>=0)diff_total+=diff_power_c*(expression_1_min);else diff_total+=diff_power_c*(expression_1_max);let expression_2=card_2.power_c*card_2.attr_group_boost-card_1.power_c*card_1.attr_group_boost;if(diff_attr_group_boost>=0)expression_2+=min_totalpowerc*diff_attr_group_boost;else expression_2+=max_totalpowerc*diff_attr_group_boost;if(expression_2>=0){if(diff_total>=0)return true;diff_total+=expression_2*weights_others_order[7]}else diff_total+=expression_2*weights_others_order[0];if(diff_total>=0)return true}return false}const card_list=[],leq_count=[],heq_count=[];intermediate_set.forEach(({power_c,attr_group_boost,skill_score,judge_rate},id)=>{card_list.push({id,power_c,attr_group_boost,skill_score,judge_rate});leq_count.push(0);heq_count.push(0)});sort_top_nth(card_list,27,(card_1,card_2)=>card_2.power_c-card_1.power_c);let leq_count_border=8-confirmed_set.size,heq_count_border=intermediate_set.size+confirmed_set.size-8;const is_only_leq_count=intermediate_set.size>100;for(let i=0;i<card_list.length;i+=1){leq_count[i]=0;for(let j=0;j<card_list.length;j+=1){if(i===j)continue;const card_1=card_list[i],card_2=card_list[j];const is_lesseq=lesseq_card(card_1,card_2);if(is_lesseq){leq_count[i]+=1;heq_count[j]+=1;if(is_only_leq_count){if(leq_count[j]>=leq_count_border-1){leq_count[i]=leq_count_border;break}}}}}const leq0_ids=[];leq0_ids_g=leq0_ids;for(let i=0;i<card_list.length;i+=1){if(leq_count[i]>=leq_count_border){intermediate_set.delete(card_list[i].id)}else if(heq_count[i]>=heq_count_border){confirmed_set.set(card_list[i].id,intermediate_set.get(card_list[i].id));intermediate_set.delete(card_list[i].id)}else if(leq_count[i]===0){leq0_ids.push(card_list[i].id)}}if(intermediate_set.size+confirmed_set.size<8){throw new Error();}if(intermediate_set.size===trace_changes.intermediate_set_size_before){break}trace_changes.intermediate_set_size_before=intermediate_set.size}if(confirmed_set.size<8)TEST_20240116.while_confirmed_size_l8_break+=1;if(confirmed_set.size===8){let great_ratio=1-background_settings.perfect_rate/100;const id_ag_pair=[];let total_power=center_set.power_c,score=0;confirmed_set.forEach(({power_c,attr_group_boost},id)=>{id_ag_pair.push({id,attr_group_boost});total_power+=power_c});id_ag_pair.sort((a,b)=>b.attr_group_boost-a.attr_group_boost);const weight_ag=total_weight+weights_others_order.reduce((prev,w,i)=>{return prev+w*id_ag_pair[i].attr_group_boost},center_set.attr_group_boost*weights_by_pos[5]);confirmed_set.forEach(({skill_score,judge_rate})=>{great_ratio*=(1-judge_rate);score+=skill_score});score+=center_set.skill_score;score+=total_power/80*weight_ag*(1-0.12*great_ratio);return{confirmed_set,score}}else{if(intermediate_set.size>37){console.log("too large intermediate size",8-confirmed_set.size,intermediate_set);throw new Error(`intermediate size ${intermediate_set.size}>37`)}let score=0,set=null;const intermediate_set_new=new Map(intermediate_set);for(const id of leq0_ids_g){if(confirmed_set.size+intermediate_set_new.size<=8)break;const confirmed_set_new=new Map(confirmed_set);confirmed_set_new.set(id,intermediate_set_new.get(id));intermediate_set_new.delete(id);const result=partial_order(center_set,new Map(intermediate_set_new),confirmed_set_new,total_weight,weights_by_pos,weights_others_order,judge_ratio,depth+1);if(result.score>score){score=result.score;set=result.confirmed_set}}if(confirmed_set.size+intermediate_set_new.size===8){const confirmed_set_new=new Map(confirmed_set);for(const id of intermediate_set_new.keys()){confirmed_set_new.set(id,intermediate_set_new.get(id));intermediate_set_new.delete(id)}const result=partial_order(center_set,new Map(intermediate_set_new),confirmed_set_new,total_weight,weights_by_pos,weights_others_order,judge_ratio,depth+1);if(result.score>score){score=result.score;set=result.confirmed_set}}if(!set){console.error(`分支节点:迭代深度${depth}已确定${confirmed_set.size}张卡已完成下一步尝试剩余${intermediate_set.size}中的${leq0_ids_g.length}张卡`);throw new Error();}return{confirmed_set:set,score}}}function score_final(difficulty_id,card_by_pos,center_skill_guest={type_1:0,target_1:0,value_1:0,type_2:0,target_2:0,value_2:0}){const{attribute:live_attr,masterGroupId:live_group}=sif2_live_data.live_info.get(Math.floor(difficulty_id/10));const chart=sif2_live_data.chart_info_get(difficulty_id);const cards_by_pos=card_by_pos.map(({id,level,skill_level})=>{const card=sif2_card_data.get(id);const power=Math.floor((live_attr===1&&card.smile||live_attr===2&&card.pure||live_attr===3&&card.cool||Number.NaN)*card_level_ratio(card.rarity,level)/10000);const skill=card.skill_by_level.get(skill_level);return{card,power,skill}});const center_skill_self=sif2_card_data.get(card_by_pos[5].id).center_skill;const detail_by_pos=[];for(let pos=1;pos<=9;pos+=1)detail_by_pos[pos]={power_c:0,tap_score:0,skill_score:0};let total_power=0;cards_by_pos.forEach(({power})=>{total_power+=power});function process_center_skill_effect(type,target,value){if(type===live_attr)cards_by_pos.forEach(({card,power},pos)=>{if(member_target_group_test(target,card)){detail_by_pos[pos].power_c=power+Math.ceil(power*value/10000);total_power+=Math.ceil(power*value/10000)}})}process_center_skill_effect(center_skill_self.type_1,center_skill_self.target_1,center_skill_self.value_1);process_center_skill_effect(center_skill_self.type_2,center_skill_self.target_2,center_skill_self.value_2);process_center_skill_effect(center_skill_guest.type_1,center_skill_guest.target_1,center_skill_guest.value_1);process_center_skill_effect(center_skill_guest.type_2,center_skill_guest.target_2,center_skill_guest.value_2);const base_tap_score=Math.ceil(total_power/80);let great_rate=100-background_settings.perfect_rate;cards_by_pos.forEach(({skill})=>{great_rate*=(1-skill_judge_fetch(difficulty_id,skill))});let total_tapscore=0;chart.weights_detail.forEach((map,pos)=>{const tapscore_attr_group=base_tap_score*(cards_by_pos[pos].card.type===live_attr?1.1:1)*(member_target_group_test(live_group,cards_by_pos[pos].card)?1.1:1);map.forEach((count,ratio)=>{detail_by_pos[pos].tap_score+=(Math.ceil(tapscore_attr_group*ratio*1.00)*(100-great_rate)+Math.ceil(tapscore_attr_group*ratio*0.88)*great_rate)/100*count});total_tapscore+=detail_by_pos[pos].tap_score});let total_skillscore=0;cards_by_pos.forEach(({skill},pos)=>{detail_by_pos[pos].skill_score=skill_score_fetch(difficulty_id,skill,cards_by_pos.map(v=>v.card),100-great_rate);total_skillscore+=detail_by_pos[pos].skill_score});return{base_tap_score,detail_by_pos,score:total_tapscore+total_skillscore,tap:total_tapscore,skill:total_skillscore,}}function card_level_ratio(rarity,level){if(rarity===3)return level>80?(5000+50*level):(6600+30*level);else if(rarity===2)return level>60?(6000+50*level):(7200+30*level);else if(rarity===1)return level>40?(7000+50*level):(7800+30*level);else throw new Error();}

autoselect_center(difficulty_id, selected_card_set, center_ids?, forced_card_set, forced_center?)