การต่อเชื่อมช่วงเวลา


26

ท้าทาย:

คุณจะได้รับสตริงที่มีตัวเลขเท่านั้น งานของคุณคือการส่งออกจำนวนขั้นต่ำที่ต้องเชื่อมต่อกันในรูปแบบสตริง ถ้าเรื่องนี้เป็นไปไม่ได้, 0เอาท์พุท

กรณีทดสอบ:

อินพุต -> เอาต์พุต:

252 -> 3
235 -> 2
92 -> 0
31149 -> 2


มีเลขศูนย์นำหน้าได้ไหม
Zgarb

ใช่สามารถมีศูนย์นำหน้าได้
poi830

เราสามารถบันทึกรายการตัวเลขได้หรือไม่?
LegionMammal978

1
จะเกิดอะไรขึ้นถ้ามีเลขศูนย์นำหน้า
เดนนิส

คำตอบ:


6

JavaScript (ES6), 123 121 120 ไบต์

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

5

MATL , 26 24 ไบต์

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


4

Pyth - 19 17 16 ไบต์

lhf.AmP_sdTa./zY

Test Suite


ในรูปแบบที่ใหม่กว่าอันนี้นับเป็น 0 และ 1 เป็นจำนวนเฉพาะ อย่างไรก็ตามก่อนที่จะแก้ไขมันไม่ได้
poi830

1
@ poi830 แก้ไขแล้ว
Maltysen

2

Bash + coreutils, 169 158 149 bytes

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ถือว่าไม่ถูกต้อง


ผมจะแนะนำนี้ ตอนนี้การปรับเปลี่ยนส่วนใหญ่ของฉันอาจล้าสมัยแล้ว
เดนนิส

@Dennis - ฉันชอบที่จะสร้างในขั้นตอนสุดท้ายc 0แม้ว่าจะไม่ค่อยกระตือรือร้นกับ stderr มากมาย คุณยินดีที่จะใช้คำตอบของฉัน (รุ่น) เป็นพื้นฐานสำหรับคุณเองถ้าคุณต้องการ
Toby Speight

2

Mathematica, 142 135 ไบต์

Min[Length/@Select[Join@@@Permutations/@IntegerPartitions@Length[a=#],And@@PrimeQ@*FromDigits/@a~Internal`PartitionRagged~#&]]/.∞->0&

อย่างที่คุณเห็น Mathematica ไม่ได้ถูกสร้างขึ้นสำหรับงานนี้ ใช้รายการของตัวเลข


คุณสามารถใช้And@@แทนได้AllTrueหรือไม่? ควรบันทึก 4-5 ไบต์
CalculatorFeline

Flatten[#,1]=Join@@@#
CalculatorFeline

อืม ... ให้ข้อผิดพลาดและคำตอบที่ผิดใน 133 ... คุณใช้กรณีทดสอบทั้งหมดใช่มั้ย
CalculatorFeline

@CatsAreFluffy Golfed และชี้แจง
LegionMammal978
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.