Birleştirici Asallar


26

Meydan okuma:

Yalnızca rakam içeren bir dize verilir. Göreviniz, dizgiyi oluşturmak için birleştirilmesi gereken minimum asal sayıların çıktısını almaktır. Bu mümkün değilse, çıktı 0.

Test Durumları:

Giriş -> Çıkış:

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


Önde gelen sıfır olabilir mi?
Zgarb,

Evet, önde gelen sıfırlar olabilir.
poi830,

Rakamların bir listesini alabilir miyiz?
LegionMammal978

1
Önde gelen sıfır varsa ne olur?
Dennis,

Yanıtlar:


6

JavaScript (ES6), 123 121 120 bayt

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 sayesinde bir bayt kaydedildi!

açıklama

Giriş olarak tek bir dize alır. Ana kontrol yöntemi (özyinelemeli deneme bölümü) nedeniyle, güvenli bir şekilde kontrol edilebilecek en yüksek sayıdır 13840. Bunun üzerindeki bazı numaralar, maksimum arama yığını boyutunun aşılmasından dolayı başarısız olur. Bununla birlikte, ele alabileceği her durum için anında bitirir.

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"));


Bana mı öyle yoksa değiştirebilir i?(a=...)&&(b=...)&&a+b:0için i&&(a=...)&&(b=...)&&a+b?
Neil

5

MATL , 26 24 bayt

0in:"GUtZq@Z^V10ZA=a?x@.

Bazı test durumları için birkaç saniye sürer.

Çevrimiçi deneyin!

açıklama

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



2

Bash + coreutils, 169 158 149 bayt

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

bHer bir asıl için bir satırlık bir satır çıktısı ve satırın asonunda sonlanan (böylece printfüzerinde çalışacak bir belirteç olan) birleşik olarak sayıyoruz .

Asallık testi, factor $n | grep -q ': \w*$'sayının tam olarak bir tane asal çarpanın olup olmadığını belirler.

Girdileri yinelemeli olarak bölümlere ayırırız; sol yarının asal olması durumunda, sağ yarının sonuçlarını her bir değere bir tane ekleyerek filtreleriz. aSıfır uzunluklu bir giriş için geri dönme özyinelemeyi sonlandırır.

Son olarak, tüm sonuçları alırız ve en kısa olanı bulmak için sıralarız ( abaşarıyı gösterecek hiçbir şeyi göz ardı ederek ); ikisini asilmemiz gerekir (eklenen ve yeni satır için), ardından sonucu vermek için karakterleri sayın.

Testler

$ 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

111Testlerin, 1asal olmayan bir şekilde doğru olarak kabul edildiğini göstermek için ekledim .


Ben önerecektim bu . Değişikliklerimin çoğu muhtemelen şimdi kullanılmıyor, ancak diğerleri hala çalışmalı.
Dennis,

@Dennis - Finali coluşturmayı severim 0. Olsa da, bol stderr çok hevesli değil. İsterseniz cevabımın (versiyonlarını) kendiniz için bir temel olarak kullanabilirsiniz.
Toby Speight

2

Mathematica, 142 135 bayt

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

Gördüğünüz gibi, Mathematica bu görev için inşa edilmedi. Rakamların bir listesini alır.


Eğer kullanabilir miyim And@@yerine AllTrue? 4-5 bayt kurtarmalı.
Hesap MakinesiFeline

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

Um ... 133'te yanlış ya da yanlış cevap veriyorlar ... tüm test durumlarını kullandın değil mi?
CalculatorFeline

@CatsAreFluffy Golf oynadı ve temizlendi.
LegionMammal978
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.