ท้าทาย:
คุณจะได้รับสตริงที่มีตัวเลขเท่านั้น งานของคุณคือการส่งออกจำนวนขั้นต่ำที่ต้องเชื่อมต่อกันในรูปแบบสตริง ถ้าเรื่องนี้เป็นไปไม่ได้, 0
เอาท์พุท
กรณีทดสอบ:
อินพุต -> เอาต์พุต:
252 -> 3
235 -> 2
92 -> 0
31149 -> 2
ท้าทาย:
คุณจะได้รับสตริงที่มีตัวเลขเท่านั้น งานของคุณคือการส่งออกจำนวนขั้นต่ำที่ต้องเชื่อมต่อกันในรูปแบบสตริง ถ้าเรื่องนี้เป็นไปไม่ได้, 0
เอาท์พุท
กรณีทดสอบ:
อินพุต -> เอาต์พุต:
252 -> 3
235 -> 2
92 -> 0
31149 -> 2
คำตอบ:
f=(s,v)=>(p=n=>--n-1?s%n&&p(n):1)(s)||[...s].map((_,i)=>!(n=i&&(a=f(s.slice(0,i)))&&(b=f(s.slice(i)))&&a+b)|n>v?0:v=n)|v
บันทึกเป็นไบต์ด้วย @Neil!
ใช้สตริงเดียวเป็นอินพุต เนื่องจากวิธีการตรวจสอบที่สำคัญ (ส่วนการพิจารณาคดี recursive) 13840
จำนวนมากที่สุดที่สามารถตรวจสอบได้อย่างปลอดภัยคือ หมายเลขบางส่วนด้านบนนี้จะล้มเหลวเนื่องจากเกินขนาดสแต็กการโทรสูงสุด อย่างไรก็ตามมันจะเสร็จทันทีในทุกกรณีที่สามารถจัดการได้
f=(s,v)=>
(p=n=>--n-1?s%n&&p(n):1)(s) // if s is prime, return 1
||[...s].map((_,i)=> // else for each index in s, split s into 2
!(n=i&& // v = return value (initialised to undefined)
(a=f(s.slice(0,i)))&&
(b=f(s.slice(i)))&&
a+b
)|n>v?0:v=n // if i, a, b and n are all > 0 and !(n > v), v = n
)|v // cast v to an integer and return it
// Test
var testCases = [ "252", "235", "92", "3149", "24747" ];
document.write("<pre>" + testCases.map(c => c + ": " + f(c)).join("\n"));
i?(a=...)&&(b=...)&&a+b:0
เป็นi&&(a=...)&&(b=...)&&a+b
?
0in:"GUtZq@Z^V10ZA=a?x@.
ใช้เวลาสองสามวินาทีในการทดสอบบางกรณี
0 % Push 0
in: % Take input. Generate array [1,2,...,N] where N is input length
" % For each. In each iteration the number of used primes is increased
GU % Push input. Convert to number
tZq % Duplicate. Array of primes smaller than the input
@ % Push number of primes to bes tested in this iteration
Z^ % Cartesian power
V % Convert to 2D array. Each row is a combination of primes
10ZA % Convert each row to base 10, disregarding spaces
=a % Do any of the results equal the input number?
? % If so
x % Remove the 0 that's at the bottom of the stack
. % Break for each loop
% Implicitly end if
% Implicitly end for each
% Implicitly display
c()
{
test $1||echo a
for i in `seq ${#1}`
do factor ${1::$i}|grep -q ': \w*$'&&printf b%s\\n `c ${1:$i}`
done
}
c $1|sort|sed '/a/!d;s/..//;q'|wc -c
เรานับรวมกันโดยไม่ส่งสัญญาณออกหนึ่งบรรทัดb
สำหรับแต่ละไพรม์และการยกเลิกa
ที่จุดสิ้นสุดของบรรทัด (เพื่อให้printf
มีโทเค็นที่จะทำงานด้วย)
การทดสอบแบบดั้งเดิมนั้นจะfactor $n | grep -q ': \w*$'
กำหนดว่าตัวเลขนั้นมีปัจจัยสำคัญเพียงตัวเดียวหรือไม่
เราแบ่งพาร์ติชันแบบเรียกซ้ำ; หากครึ่งซ้ายเป็นจำนวนเฉพาะเราจะกรองผลลัพธ์ของครึ่งขวาโดยเพิ่มหนึ่งรายการในแต่ละค่า กลับมาa
สำหรับการป้อนข้อมูลความยาวเป็นศูนย์ยุติเรียกซ้ำ
สุดท้ายเราจะนำผลลัพธ์ทั้งหมดและจัดเรียงเพื่อค้นหาที่สั้นที่สุด (ไม่สนใจสิ่งใดก็ตามที่ไม่จำเป็นต้องa
ระบุถึงความสำเร็จ) เราจะต้องลบสองตัว (สำหรับแทรกa
และขึ้นบรรทัดใหม่) จากนั้นนับตัวอักษรเพื่อให้ผลลัพธ์
$ for i in 252 235 92 31149 111; do echo "$i:"$'\t'"$(./77623.sh $i)"; done
252: 3
235: 2
92: 0
31149: 2
111: 0
ฉันเพิ่ม111
ไปยังการทดสอบเพื่อแสดงว่า1
ถือว่าไม่ถูกต้อง
c
0
แม้ว่าจะไม่ค่อยกระตือรือร้นกับ stderr มากมาย คุณยินดีที่จะใช้คำตอบของฉัน (รุ่น) เป็นพื้นฐานสำหรับคุณเองถ้าคุณต้องการ
Min[Length/@Select[Join@@@Permutations/@IntegerPartitions@Length[a=#],And@@PrimeQ@*FromDigits/@a~Internal`PartitionRagged~#&]]/.∞->0&
อย่างที่คุณเห็น Mathematica ไม่ได้ถูกสร้างขึ้นสำหรับงานนี้ ใช้รายการของตัวเลข
And@@
แทนได้AllTrue
หรือไม่? ควรบันทึก 4-5 ไบต์
Flatten[#,1]
=Join@@@#