Sayı, en büyük primi art arda ondan daha az çıkararak 1'e ulaşabilir mi?


27

Meydan okuma:

Bir sayı verildiğinde, en büyük prime kesinlikle ondan daha az alın, bu sayıdan çıkarın, tekrar bu sayıdan daha büyük prime sahip yeni sayıya yapın ve bunu 3'den az olana kadar yapmaya devam edin. program bir gerçeğe uygun değer vermelidir, aksi halde program bir falsey değeri vermelidir.

Örnekler:

Bunların hepsi gerçek bir değer vermelidir:

3
4
6
8
10
11
12
14
16
17
18
20
22
23
24
26
27
29
30
32
34
35
37
38
40
41
42
44
46
47
48
50

Bunların hepsi falsey değerleri vermelidir:

5
7
9
13
15
19
21
25
28
31
33
36
39
43
45
49

Kurallar:



1
5-3 = 2, 2 - (- 2) = 4, 4-3 = 1. (/ wiseguy)

@Hurkyl -2 = -1 x 2, bu ;-) asal değil yani
ETHproductions

1
@ETProductions: Ah, ama -1 bir birimdir; bu faktoring, -2 = (- 1) × (-2) 2'den (2), hatta 2 = 1 × 2'den daha fazla

3
@ETHproductions: Rasyonel sayılar ilginç çünkü pratikte faydalı iki farklı yaklaşım var! Her şey bir birim olduğu için rasyonel sayıların üssü yoktur (2! Bile). Bununla birlikte, gerekçeleri, tam sayılardan yapılmış bir yapı olarak görebilir ve tam sayıların asallarını kullanarak bunları inceleyebilirsiniz. (örneğin asal çarpanlara soran kimse 9/10olarak 2^(-1) 3^2 5^(-1)ikincisi bakımından düşünmedir)

Yanıtlar:


8

Jöle , 9 8 bayt

’ÆRṪạµ¡Ḃ

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

Nasıl çalışır

’ÆRṪạµ¡Ḃ  Main link. Argument: n

     µ    Combine all atoms to the left into a chain.
’           Decrement; yield n - 1.
 ÆR         Prime range; yield all primes in [2, ..., n -1].
   Ṫ        Tail; yield p, the last prime in the range.
            If the range is empty, this yields p = 0.
    ạ       Compute the absolute difference of p and n.
      ¡   Call the chain to the left n times.
          This suffices since each iteration decreases n, until one of the fixed
          points (1 or 2) is reached.
       Ḃ  Bit; return the parity of the fixed point.

11

Retina , 31 bayt

.+
$*
+`1(?!(11+)\1+$)11+
1
^1$

0(Sahte) veya 1(truthy) yazdırır .

Çevrimiçi deneyin! (İlk satır, satır besleme ayrılmış bir test takımı sağlar.)

açıklama

.+
$*

Girişini çevirerek tekli girdi dönüştürme Niçine Nkopyaları 1.

+`1(?!(11+)\1+$)11+
1

Girişten en küçük prime tekrar tekrar kaldırın. Bu regex ile standart primallik testi dayanmaktadır .

^1$

Sonucun tek olup olmadığını kontrol edin 1.


Retina'yı unary olmadan nasıl kullanabilirsin? Oo
Addison Crump

@Syxer ilk iki satır girişi unary'e çevirir.
Martin Ender

Bu onları çıkarabileceğiniz ve unary girişi talep edebileceğiniz anlamına gelmiyor mu?
Addison Crump

2
@Syxer yapabilirdim, ama bunu yapmayı bıraktım. Çok tehlikeli bir G / Ç formatı gibi görünüyor ve şimdi dönüşüm 6 bayttır (eskiden olduğu gibi ~ 200'ün aksine), Retina'nın "ondalık biçimde makul şekilde girdi alamaz" olarak sayıldığını sanmıyorum.
Martin Ender

Ah, anlıyorum. Sadece Retina'daki sıradan girdileri gördüm, bu yüzden kafam karıştı.
Addison Crump

8

Pyth, 18 15 14 bayt

-1 Bayt için @Maltysen için teşekkürler

#=-QefP_TUQ)q1

STDIN'e girdi alan ve yazdıran Trueveya Falseuygun şekilde bir program.

Çevrimiçi deneyin

Nasıl çalışır

#=-QefP_TUQ)q1  Program. Input: Q
#          )    Loop until error statement (which occurs when Q<3):
         UQ      Yield [0, 1, 2, 3, ..., Q-1]
     fP_T        Filter that by primality
    e            Yield the last element of that
 =-Q             Q = Q - that
            q1  Q is 1 (implicit variable fill)
                Implicitly print

Küçültme ile eski sürüm, 18 bayt

qu-G*<HGH_fP_TSQQ1

Çevrimiçi deneyin

Nasıl çalışır

qu-G*<HGH_fP_TSQQ1  Program. Input: Q
              SQ    Yield [1, 2, 3, ..., Q]
          fP_T      Filter that by primality
         _          Reverse it
 u                  Reduce it:
                Q    with base case Q and
                     function G, H -> 
     <HG              H<G
    *   H             *H (yields H if H<G, else 0)
  -G                  Subtract that from G
q                1  The result of that is 1
                    Implicitly print

Stolduğu U15 karakter
Maltysen

7

JavaScript (ES6), 64 63 bayt

@Neil sayesinde 1 bayt kaydedildi

g=(x,n=x-1)=>n<2?x:x%n?g(x,n-1):g(x-1)
f=x=>x<3?x%2:f(x-g(x-1))

Bunu 2 dakikada yazdım ... ve ilk defa mükemmel çalıştı. Kaçınılmaz hatayı bulan ilk kullanıcı kazanır ....

Denemek

Nasıl çalışır

İlk önce g (x) ' i ilk asal sayıyı bulan p = = x olarak tanımladık . Bu, aşağıdaki işlem kullanılarak yapılır:

  1. N = x-1 ile başlayın .
  2. Eğer n <2 , x asal; return x .
  3. Eğer x ile bölünebilir n , eksiltme x ve 1. adımda gidin.
  4. Aksi takdirde, n'yi azaltın ve 2. adıma gidin.

Bu zorluğun çözümü, f (x) , şimdi oldukça basittir:

  1. Eğer x <3 ise , x = 1 döndür .
  2. Aksi takdirde, g (x-1) çıkarın ve tekrar deneyin.

True değerini döndürmesi gereken 4326, geri dönüşü görünmüyor, ancak 4328 (true) ve 4329 (false), bu bir JS sınırlaması mı, yoksa bir hata mı?
Jonathan Allan

@JonathanAllan 4326 too much recursion, Firefox 48'deki tarayıcı konsoluna atar , bu yüzden özyinelemenin FF özyineleme sınırını geçtiğini tahmin ediyorum.
ETHProductions

Evet, bir sonraki asal aşağı 4297 (bir sonraki 4327), bu yüzden 4328 çalışıyor.
Jonathan Allan

4
x%2sana bir bayt kurtarmalıyım x==1.
Neil

@Neil Bunu asla düşünmezdim :-)
ETHproductions 12:16 '

6

Pyke, 15 11 bayt

WDU#_P)e-Dt

Burada dene!

            - stack = input
W           - while continue:
  U#_P)     -     filter(is_prime, range(stack))
       e    -    ^[-1]
 D      -   -   stack-^
         Dt -  continue = ^ != 1

1True olursa döndürür ve false olursa bir istisna oluşturur


5

Julia, 32 bayt

Bu diller arasında en kısa çözüm olmayacak olsa da, bu insan tarafından okunabilenlerin en kısa çözümü olabilir ...

!n=n>2?!(n-primes(n-1)[end]):n<2

Veya biraz daha net bir şekilde söylemek gerekirse

function !(n)
  if n>2
    m=primes(n-1)[end]   # Gets largest prime less than n
    return !(n-m)        # Recurses
  else
    return n<2           # Gives true if n is 1 and false if n is 2
  end
end

Mesela denir !37.


3

Mathematica, 32 bayt

2>(#//.x_/;x>2:>x+NextPrime@-x)&

Bu bir tamsayı alan ve bir boole döndüren adsız bir işlevdir.

açıklama

Burada bir sürü sözdizimi ve komik okuma düzeni var, bu yüzden ...

   #                               This is simply the argument of the function.
    //.                            This is the 'ReplaceRepeated' operator, which applies
                                   a substitution until the its left-hand argument stops
                                   changing.
       x_/;x>2                     The substitution pattern. Matches any expression x as
                                   long as that expression is greater than 2.
              :>                   Replace that with...
                  NextPrime@-x     Mathematica has a NextPrime built-in but no
                                   PreviousPrime built-in. Conveniently, NextPrime
                                   works with negative inputs and then gives you the 
                                   next "negative prime" which is basically a
                                   PreviousPrime function (just with an added minus sign).
                x+                 This gets added to x, which subtracts the previous
                                   prime from it.
2>(                           )    Finally, we check whether the result is less than 2.

Yakından atıyor #+0~Min~NextPrime@-#&~FixedPoint~#==1&(36 bayt). Güzel kullanımı //.!
Greg Martin

1
Sonunda kullandığınızda @GregMartin 35 <2.
Martin Ender

3

Python3, 102 92 90 89 88 bayt

f=lambda n:n<2if n<3else f(n-[x for x in range(2,n)if all(x%y for y in range(2,x))][-1])

Golf önerileri hoş geldiniz! Bunun gmpybir işlev içerdiğini görüyorum next_primeama henüz test edemiyorum :(

-2 byte, @JonathanAllan !

-1 byte, @Aaron sayesinde !

testcases

f=lambda n:n<2if n<3else f(n-[x for x in range(2,n)if all(x%y for y in range(2,x))][-1])

s="3 4 6 8 10 11 12 14 16 17 18 20 22"
h="5 7 9 13 15 19 21 25 28 31 33 36 39"

for j in s.split(" "):print(f(int(j)))
for j in h.split(" "):print(f(int(j)))

Çıktı 13 hakikat değeri ve 13 falsey değeridir. struthy davalarını ve hfalseyleri içerir.


1
if all(x%y for...çalışır
Jonathan Allan

1
n<3 else-> n<3elsebenimki ile aynı uzunlukta almak için;)
Aaron

2

Python, sempati ile, 60 bayt

import sympy
f=lambda n:n>2and f(n-sympy.prevprime(n))or n<2

Önceki yöntemim özyinelemeyi kullanarak semptomsuz 83 bayttı, ancak ayırt edilebilir ve tutarlı demek için truthy / falsey kullandım, ancak bunun yanlış bir yorum olduğu konusunda bilgilendirildim. Kuyruk yüzünden onu kurtarmış gibi görünmüyorum, ancak birinin nasıl yapılacağını bilmesi durumunda burada bırakacağım:

f=lambda n,p=0:n>2and(any(p%x==0for x in range(2,p))and f(n,p-1)or f(n-p,n+~p))or n


@ mbomb007 Eğer gerekliyse, teknik özelliklerin "doğru mu, yanlış mı" olduğunu düşündüm, oysa "hakikat veya falsey" ayırt edilebilir ve tutarlı mı?
Jonathan Allan

1
Hayır! Meta sitesinde karar verdiğimiz gibi tanımlanırlar. "Ayırt edici ve tutarlı" çıktı sağlayan herhangi bir soru, truthy / falsey yerine bunu belirtmelidir.
mbomb007

Tamam Okuduğum bu , ... bir noktada güncelleyecektir
Jonathan Allan

1

Vitsy, 28 26 bayt

Bu kesinlikle kısaltılabilir.

<]xN0)l1)-1[)/3D-];(pD-1[D

<                    Traverse the code in this direction, rotating on the line.
                     For the sake of reading the code easier, I'm reversing the
                     code on this line. This will be the order executed.

 D[1-Dp(;]-D3/)[1-)1l)0Nx]
 D                         Duplicate the top member of the stack.
  [      ]                 Do the stuff in brackets until break is called.
   1-                      Subtract 1 from the top item of the stack.
     D                     Duplicate the top member of the stack.
      p(                   If the top member is a prime...
        ;                  break;
          -                Pop a, b, push a - b.
           D3/)[         ] If this value is less than 3, do the bracketed code.
                1-         Subtract the top item of the stack by 1.
                  )        If the top item is zero...
                   1       Push 1.
                    l)     If the length of the stack is zero...
                      0    Push 0.
                       N   Output the top member of the stack.
                        x  System.exit(0);

Çevrimiçi deneyin!


1

MATL , 13 bayt

`tqZq0)-t2>}o

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

açıklama

`        % Do...while
  t      %   Duplicate. Takes input implicitly in the first iteration
  qZq    %   All primes less than that
  0)     %   Get last one
  -      %   Subtract (this result will be used in the next iteration, if any)
  t      %   Duplicate
  2>     %   Does it exceed 2? If so: next iteration. Else: execute the "finally" 
         %   block and exit do...while loop
}        % Finally
  o      %   Parity. Transforms 2 into 0 and 1 into 1
         % End do...while implicitly
         % Display implicitly

1

CJam , 21 16 bayt

4 byte tasarruf için Dennis teşekkür ederiz.

ri{_1|{mp},W=-}h

Çevrimiçi deneyin!

açıklama

ri       e# Read input and convert to integer N.
{        e# Run this block as long as N is positive (or until the program aborts
         e# with an error)...
  _1|    e#   Duplicate and OR 1. This rounds up to an odd number. For N > 2, this
         e#   will never affect the greatest prime less than N.
  {mp},  e#   Get all primes from 0 to (N|1)-1.
         e#   For N > 2, this will contain all primes less than N.
         e#   For N = 2, this will contain only 2.
         e#   For N = 1, this will be empty.
  W=     e#   Select the last element (largest prime up to (N|1)-1).
         e#   For N = 1, this will result in an error and terminate the program, which
         e#   still prints the stack contents though (which are 1, the desired output).
  -      e#   Subtract from N. Note that this gives us 0 for N = 2, which terminates the 
         e#   loop.
}h

ri_{_1|{mp},W=-}*çalışmalı.
Dennis,

@Dennis Teşekkürler, 1|gerçekten zekice. :) (Her zaman bunun {...},gizli bir aralık bıraktığını unuturum ...)
Martin Ender

1

Perl, 42 bayt

İçin +1 içerir -p

STDIN'de giriş ile çalıştırın

reach1.pl:

#!/usr/bin/perl -p
$_=1x$_;$_=$`while/\B(?!(11+)\1+$|$)|11$/

Klasik ilkellik regex kullanır


1

.NET Regex, 38 bayt

Sadece tek bir regex içinde kontrol edilebileceğini göstermek için.

^(?>(?<=(.*))..+(?<!^\1\2+(.+.)|$))+.$

Girişin tekdüze olduğu varsayılır.

açıklama

Basitçe kelimeye gereksinimi uygular, en büyük prime tekrar tekrar kaldırarak kalanının 1 olup olmadığını kontrol eder.

  • (?>(?<=(.*))..+(?<!^\1\2+(.+.)|$))+: Geri izlemeyen grup, bulduğumuz en büyük astarın geçersiz kılmadığından emin olur ve en büyük astarı +eşleştirme işlemini tekrar eder.

    • (?<=(.*))..+(?<!^\1\2+(.+.)|$): Kalan sayının altındaki en büyük primi eşleştir

      • (?<=(.*)): İddia için bir "çapa" noktası oluşturmak için ne kadar çıkardığımızı kaydedin.

      • ..+: En büyük sayıyı arayın ...

      • (?<!^\1\2+(.+.)|$): ... asal ve kalan sayılardan küçük.
        • (?<!^\1\2+(.+.)): Olağan ana test rutini, ^\1eşleştirilen tutarı kontrol ettiğimizden emin olmak için önde tacked ile..+
        • (?!<$): Kalan sayıdan daha az değer verin

(?<=(.*))Bölüm oldukça hantaldır. Daha iyi bir yol olup olmadığından emin değilim. Ayrıca, PCRE'de bir çözüm olup olmadığını merak ediyorum.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

0

Perl 6 ,  54 53 52  51 bayt

{($_,{$_-($_-1...2).first: *.is-prime}...3>*)[*-1]==1}
{($_,{$_-($_-1...2).first: *.is-prime}...3>*).any==1}
{any($_,{$_-($_-1...2).first: *.is-prime}...3>*)==1}
{any($_,{$_-(^$_).grep(*.is-prime)[*-1]}...3>*)==1}

Açıklama:

# bare block lambda with implicit parameter 「$_」
# used to generate all of the rest of the elements of the sequence
{
  # create an any Junction of the following list
  any(
    $_, # initialize sequence with the inner block's argument

    # bare block lambda with implicit parameter 「$_」
    {
      # take this inner block's argument and subtract
      $_ -

      ( ^$_ )            # Range up-to and excluding 「$_」
      .grep(*.is-prime)\ # find the primes
      [ * - 1 ]          # return the last value
    }

    ...   # keep doing that until

    3 > * # the result is less than 3

  # test that Junction against 「1」
  # ( returns an 「any」 Junction like 「any(False, False, True)」 )
  ) == 1
}

Örnek:

# show what is returned and if it is truthy
sub show ($_) {
  # 「.&{…}」 uses the block as a method and implicitly against 「$_」
  my $value = .&{any($_,{$_-(^$_).grep(*.is-prime)[*-1]}...3>*)==1}
  say join "\t", $_, ?$value, $value.gist;
}

show 3;  # 3    True    any(False, True)
show 4;  # 4    True    any(False, True)
show 5;  # 5    False   any(False, False)
show 10; # 10   True    any(False, False, True)
show 28; # 28   False   any(False, False, False)
show 49; # 49   False   any(False, False)
show 50; # 50   True    any(False, False, True)

0

Düzensiz , 63 bayt

p~?1_$-1p:;
n=i(0)?1_$-1p:;
_~
N=n
1(?!(11+)\1+$)11+~1
^11$~0
N

İki gün önce bu dili yarattım ve temel önermeler yerleşik döngüler olmaması, tek özelliklerin temel aritmetik ve karar vermesi ve program değerlendirmesi düzenli ifadelere dayanması.

açıklama

p~?1_$-1p:;
n=i(0)?1_$-1p:;
_~
N=n

Bu bölüm girişi tekli olarak dönüştürür. Her seferinde önceden, 0'a eşit olana kadar girişten tekrar tekrar 1 çıkarır 1_. Daha sonra tüm _s kaldırır . Kodumda unutmadıysam break, şöyle yazılabilirdi:

p~?1_$-1p:;
_~
n=i(0)?1_$-1p:;

O eşit olana kadar bir sonraki bölümü tekrar tekrar girişten büyük asal kaldırır 1veya 11birlikte, 11ile değiştirilmektedir 0.

1(?!(11+)\1+$)11+~1
^11$~0
N

Ben gelen regex kullanılan Martin Ender'in cevap .


0

Haskell, 79 bayt

Çok kısa değil ama puansız :)

(<2).until(<3)(until(flip(`until`(+1))2.(.)(<1).mod>>=(==))pred.pred>>=flip(-))

0

PowerShell v2 +, 81 bayt

param($n)while($n-gt2){$n-=(($n-1)..2|?{'1'*$_-match'^(?!(..+)\1+$)..'})[0]}!--$n

Girdi alır $n. Hala veya daha büyük olduğu whilesürece bir döngüye girer . Her yineleme, bir sayı çıkarır . Sayı, ( ) operatörü aracılığıyla bir menzile karşı uygulanan regex primallik testinin sonuçlarıdır , ardından sonuçların ilkidir (aralık azaldığından, bu seçilenlerin en büyüğüdür). Döngüyü tamamladıktan sonra , ya öyle olacak, ya da tanımı gereği, biz onu ön-azalttık (ya da ya da içine çevirerek ), ve bunun Boole'sunu alırız . Bu, boru hattında bırakılan ve çıktının kapalı olduğu.$n3$n($n-1)..2Where-Object?[0]$n12$n01!

Örnekler

PS C:\Tools\Scripts\golfing> 3..20|%{"$_ --> "+(.\can-the-number-reach-one.ps1 $_)}
3 --> True
4 --> True
5 --> False
6 --> True
7 --> False
8 --> True
9 --> False
10 --> True
11 --> True
12 --> True
13 --> False
14 --> True
15 --> False
16 --> True
17 --> True
18 --> True
19 --> False
20 --> True

0

Matlab, 51 bayt

v=@(x)x-max(primes(x-1));while(x>=3)x=v(x);end;x==1

Bu tarafından JS6 çözümüne ÇOK benzer ETHProductions ancak çalışma alanında olması değişkeni gerekiyor.


0

Python 2.7: 88 87 Bayt

r=lambda n:n>2and r(n-[a for a in range(2,n)if all(a%b for b in range(2,a))][-1])or n<2

Thx @TuukkaX -1 bayt daha!


1
Açıklamanızı güncelleyin;) Ayrıca, n<2yerine bir bayt kaydedebilirsiniz n==1.
Yytsi


0

Clojure, 125 bayt

#(loop[x %](if(> x 2)(recur(- x(loop[y(dec x)](if(some zero?(vec(for[z(range 2 y)](mod y z))))(recur(dec y))y))))(quot 1 x)))

Yikes, bu uzun bir kod parçası. En ayrıntılı dil tekrar grev!

Ungolfed:

(defn subprime [n]
  (loop [x n]
    (if (> x 2)
      (recur
        (- x
          (loop [y (dec x)]
            (if (some zero? (vec (for [z (range 2 y)] (mod y z))))
              (recur (dec y)) y))))
      (quot 1 x))))
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.