Ekleme ile asal faktörlerin sayısını en aza indirin


12

İki pozitif tamsayı verilen bir ve B , pozisyon geri p bu en aza indirir elde edilen tamsayının asal faktörleri (sayım çokluklar) sayısı, B bir takılı olarak A ile p .

Örneğin, A = 1234 ve B = 32 verildiğinde , bunlar olası eklemelerdir ( p , 0 dizinli) ve asal faktörleri hakkında karşılık gelen bilgilerdir:

p | Sonuç | Asal faktörler | Ω (N) / Sayı

0 | 321234 | [2, 3, 37, 1447] | 4
1 | 132234 | [2, 3, 22039] | 3
2 | 123234 | [2, 3, 19, 23, 47] | 5
3 | 123324 | [2, 2, 3, 43, 239] | 5
4 | 123432 | [2, 2, 2, 3, 37, 139] | 6

P'nin 1 olduğu zaman sonucun minimum sayıda asal çarpanı olduğunu görebilirsiniz. 3, bu durumda, 1 çıktısı almalısınız .

gözlük

  • Sonucu en aza indiren birden fazla p konumu varsa , bunların tümünü veya herhangi birini çıkarmayı seçebilirsiniz.

  • P için 0-indeksleme veya 1-indeksleme seçebilirsiniz , ancak bu seçim tutarlı olmalıdır.

  • A ve B tamsayılar, karakter dizileri veya rakam listeleri olarak alınabilir.

  • Herhangi rekabet edebilir programlama dili ve giriş almak ve herhangi içinden çıktı sağlayabilir standart yöntemle O notu alırken, bu boşluklar varsayılan olarak yasaktır. Bu kod golf, yani (bayt cinsinden puan) en kısa teslim kazanır!

Test senaryoları

A, B -> p (0 dizinli) / p (1 dizinli)

1234, 32 -> 1/2
3456, 3 -> 4/5
378, 1824 -> 0/1
1824, 378 -> 4/5
67, 267 -> Aşağıdakilerden herhangi biri veya hepsi: [1, 2] / [2, 3]
435, 1 -> Aşağıdakilerden herhangi biri veya hepsi: [1, 2, 3] / [2, 3, 4]
378100, 1878980901 -> Şunlardan herhangi biri veya tümü: [5, 6] / [6, 7]

Kolaylık sağlamak için, her bir giriş çiftini temsil eden tupleslerin bir listesi:

[(1234, 32), (3456, 3), (378, 1824), (1824, 378), (67, 267), (435, 1), (378100, 1878980901)]

1
Bu 05AB1E doğru önyargılı hissediyorum ...
caird coinheringaahing

1
Ekleme dizini yerine asal faktörleri en aza indiren sonuç sayısını çıkarabilir miyiz? örneğin, ilk test durumunuz 132234yerine 1.
dylnan

2
@dylnan Bu sefer hayır diyeceğim.
Bay Xcoder

Yanıtlar:


8

Kabuk , 16 bayt

§◄öLpr§·++⁰↑↓oΘŀ

Dizeler olarak girdi bekliyor, çevrimiçi deneyin!

açıklama

§◄(öLpr§·++⁰↑↓)(Θŀ)  -- input A implicit, B as ⁰ (example "1234" and "32")
§ (           )(  )  -- apply A to the two functions and ..
  (ö          )      --   | "suppose we have an argument N" (eg. 2)
  (    §      )      --   | fork A and ..
  (         ↑ )      --     | take N: "12"
  (          ↓)      --     | drop N: "34"
  (     ·++⁰  )      --   | .. join the result by B: "123234"
  (   r       )      --   | read: 123234
  (  p        )      --   | prime factors: [2,3,19,23,47]
  ( L         )      --   | length: 5
  (öLpr§·++⁰↑↓)      --   : function taking N and returning number of factors
                            in the constructed number
               ( ŀ)  --   | range [1..length A]
               (Θ )  --   | prepend 0
               (Θŀ)  --   : [0,1,2,3,4]
 ◄                   -- .. using the generated function find the min over range

7

MATL , 25 bayt

sh"2GX@q:&)1GwhhUYfn]v&X<

Girişler ters sırada dizelerdir. Çıktı 1 tabanlıdır. Bir kravat varsa, en düşük konum çıkar.

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

s         % Implicitly input B as a string. Sum (of code points). Gives a number
h         % Implicitly input A as a string. Concatenate. Gives a string of length
          % N+1, where N is the length of A
"         % For each (that is, do N+1 times)
  2G      %   Push second input
  X@      %   Push 1-based iteration index
  q       %   Subtract 1
  :       %   Range from 1 to that. Gives [] in the first iteration, [1] in
          %   the second, ..., [1 2 ... N] in the last
  &)      %   Two-output indexing. Gives a substring with the selected elements,
          %   and then a substring with the remaining elements
  1G      %   Push first input
  whh     %   Swap and concatenate twice. This builds the string with B inserted
          %   in A at position given by the iteration index minus 1
  U       %   Convert to string
  Yf      %   Prime factors
  n       %   Number of elements
]         % End
v         % Concatenate stack vertically
&X<       % 1-based index of minimum. Implicitly display

6

Pyth, 20 13 11 bayt

.mlPsXbQzhl

Çevrimiçi deneyin

açıklama

.mlPsXbQzhl
.m    b         Find the minimum value...
         hl     ... over the indices [0, ..., len(first input)]...
  lP            ... of the number of prime factors...
    sX Qz       ... of the second input inserted into the first.


3

Japt , 22 21 bayt

Bu, yazarken çok uzun sürdü, ancak diğer çözümlerin bazılarına bakıldığında, aslında biraz rekabetçi görünüyor. Yine de, muhtemelen iyileştirme için biraz yer var - cNq)Özellikle beni rahatsız ediyor. İzlenecek açıklama.

İlk girdiyi dize, ikincisini tamsayı veya dize olarak alır. Sonuç 0 dizinlidir ve birden çok çözüm varsa ilk dizini döndürür.

ÊÆiYVÃcNq)®°k Ê
b@e¨X

Dene


açıklama

      :Implicit input of string U and integer V.
Ê     :Get the length of U.
Æ     :Generate an array of the range [0,length) and map over each element returning ...
iYV   :  U with V inserted at index Y.
à    :End mapping
c     :Append ...
Nq    :  The array of inputs joined to a string.
®     :Map over the array.
°     :Postfix increment - casts the current element to an integer.
k     :Get the prime divisors.
Ê     :Get the length.
\n    :The newline allows the array above to be assigned to variable U.
b     :Get the first index in U that returns true ...
@     :  when passed through a function that ...
e     :    checks that every element in U...
¨     :    is greater than or equal to...
X     :    the current element.
      : Implicit output of resulting integer.

2

PowerShell , 228 bayt

param($a,$b)function f($a){for($i=2;$a-gt1){if(!($a%$i)){$i;$a/=$i}else{$i++}}}
$p=@{};,"$b$a"+(0..($x=$a.length-2)|%{-join($a[0..$_++]+$b+$a[$_..($x+1)])})+"$a$b"|%{$p[$i++]=(f $_).count};($p.GetEnumerator()|sort value)[0].Name

Çevrimiçi deneyin!

(Uzun / golf önerileri hoş görünüyor. Ayrıca son test vakası için TIO'da zaman aşımına uğradı, ancak algoritma bu vaka için sorunsuz çalışmalıdır.)

PowerShell'de birincil çarpanlara ayırma yerleşikleri yoktur, bu nedenle bu, Prime Factors Buddies hakkındaki cevabımın kodunu ödünç alır . Bu ilk satırın functionaçıklaması.

Girdiyi alıp boş bir hashtable olarak $a,$bayarladık $p. Sonra dizeyi alıp $b$avirgül-işleci ile tek bir diziye dönüştürüyoruz ve bunu bir şeyler, ile dizi-birleştiriyoruz . Malzeme bir döngü aracılığıyla sokulması, her noktasında, son olarak dizi-birleştirilmiş .$a$b$a$b

Bu noktada, $bher noktaya eklenen bir dizi var $a. Daha sonra bu diziyi for döngüsü üzerinden göndeririz |%{...}. Her yineleme, biz pozisyonda bizim Hashtable'a eklemek kaç ana faktörler arasında özellikle unsuru olduğunu vardır.$i++.countf$_

Son olarak, s'yi sorttemel alan hashtable'ı alıyoruz, ondan birini valuealıyoruz 0ve onun Name(yani, $iindeksin) 'i seçiyoruz . Boru hattında kalan ve çıktı örtük.



2

05AB1E , 27 21 bayt

ηõ¸ì¹.sRõ¸«)øεIýÒg}Wk

Çevrimiçi deneyin!

En düşük 0 dizinli p değerini döndürür .

-6 bayt için @Enigma sayesinde!

açıklama

ηõ¸ì                  # Push the prefixes of A with a leading empty string -- [, 1, 12, 123, 1234]
    ¹.sRõ¸«)          # Push the suffixes of A with a tailing empty space. -- [1234, 123, 12, 1, ]
            ø         # Zip the prefixes and suffixes
             ε    }   # Map each pair with...
              IýÒg    # Push B, join prefix - B - suffix, map with number of primes
                   Wk # Push the index of the minimum p

1
Aynı yöntemi kullanarak, bunu yeniden yazarak 6 bayt kaydedebilirsiniz ηõ¸ì¹.sRõ¸«)øεIýÒg}Wk.
Emigna

1

Temiz , 165 ... 154 bayt

import StdEnv,StdLib
@n h#d=hd[i\\i<-[2..h]|h rem i<1]
|d<h= @(n+1)(h/d)=n
?a b=snd(hd(sort[(@0(toInt(a%(0,i-1)+++b+++a%(i,size a))),i)\\i<-[0..size a]]))

Çevrimiçi deneyin!



0

JavaScript (ES6), 120 bayt

Girişi 2 dize olarak alır. 0 dizinli bir konum döndürür.

f=(a,b,i=0,m=a)=>a[i>>1]?f(a,b,i+1,eval('for(n=a.slice(0,i)+b+a.slice(i),x=k=2;k<n;n%k?k++:n/=x++&&k);x')<m?(r=i,x):m):r

Test senaryoları


0

J, 60 Bayt

4 :'(i.<./)#@q:>".@(,(":y)&,)&.>/"1({.;}.)&(":x)"0 i.>:#":x'

Açık dyad. B'yi sağdan, A'yı soldan alır.

0 indeksli çıktı.

Kutuları kullanmadan iyileştirmek mümkün olabilir.

Açıklama:

  4 :'(i.<./)#@q:>".@(,(":x)&,)&.>/"1({.;}.)&(":y)"0 i.>:#":y'  | Whole program
  4 :'                                                       '  | Define an explicit dyad
                                                     i.>:#":y   | Integers from 0 to length of y
                                                  "0            | To each element
                                     ({.;}.)&(":y)              | Split y at the given index (result is boxed)
                     (,(":x)&,)&.>/"1                           | Put x inbetween, as a string
                  ".@                                           | Evaluate
                 >                                              | Unbox, makes list
             #@q:                                               | Number of prime factors of each
      (i.>./)                                                   | Index of the minimum

0

Python 3, 128 bayt

0 endeksli; dizeleri parametre olarak alır. Jonathan Frech sayesinde -6 bayt.

from sympy.ntheory import*
def f(n,m):a=[sum(factorint(int(n[:i]+m+n[i:])).values())for i in range(len(n)+1)];return a.index(min(a))

:\n a-> :a.
Jonathan Frech

0

Python, 122 bayt

f=lambda n,i=2:n>1and(n%i and f(n,i+1)or 1+f(n/i,i))
g=lambda A,B:min(range(len(A)+1),key=lambda p:f(int(A[:p]+B+A[p:])))

Pratikte bu, varsayılan maksimum yineleme derinliğini oldukça hızlı bir şekilde aşar.

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.