Negatif sipariş tamsayı meydan okuması, ancak Prime Time!


12

Bu sorudan bahsediyorum , biraz kafanız karışmışsa bir göz atın.

Ana görev

Göreviniz sıralı tamsayıları azalan sırayla çıkarmak, ancak her vurduğunuzda maksimum tamsayıyı artırmaktır 1 (bu soru için 1 asal sayı olarak kabul edilecektir) . Bu ilk sorudan farklı görünmese de , işin zor kısmı geliyor: Çıkarılan tüm sayılar sadece asal olabilir . Bunlar, boşluk veya satırsonu olmadan tek bir dizgiye birleştirilecektir. Girişiniz de asal bir sayı olacaktır .

Misal:

1
21
321
5321
75321
1175321
Valid output:
1213215321753211175321

Giriş

Kodunuz yalnızca bir girdi alabilir: yazdırılacak en yüksek asal. Bu giriş her yerden gelebilir (grafiksel, STDIN). Girişin asal bir sayı olduğundan emin olabilirsiniz.

Çıktı

Ortaya çıkan sayıyı çıkarmanız gerekir. Geriye saymaya devam ederek bu numarayı alabilir, yalnızca asal ise sayıyı sayabilir ve ardından tüm sonuçları bir numaraya bağlayabilirsiniz. Son numara "satır" (örn. 7, 5, 3, 2, 1) Tam olarak yazdırılmalıdır. Çıktı okunabilir olduğu sürece herhangi bir şey (sayılar, dizeler, grafiksel) olabilir. Test durumlarınızı kontrol etmek için aynı Regex modeli geçerlidir:

^(\D*(\d)+\D*|)$

Çıktınız bu kalıpla eşleşmiyorsa kodunuz geçersiz.

kurallar

  • Girişin birincil olduğundan emin olun, istemediğiniz / gerekmedikçe hata işlemeyi dahil etmeyin.
  • Çıktı yalnızca tam bağlantılı bir sayı olabilir, bu nedenle hiçbir şeyle bölünmez, hatta yeni satırlar bile olmaz.
  • Algoritmanız ilk Ngörünen örneği (örneğin, 17in 1175321) değil N, asıl sayı olarak ilk örneğini kontrol etmelidir .
  • Girişinizin pozitif olduğundan emin olun, istemediğiniz / gerekmedikçe işlem eklemeyin.

Test senaryoları

Input: -2, 0
Output: Any, or none (number isn't positive)

Input: 9
Output: Any, or none (number isn't prime)

Input: 1
Output: 1

Input: 7
Output: 121321532175321

Input: 23
Output: 1213215321753211175321131175321171311753211917131175321231917131175321

kazanan

Bu , bu yüzden bayt cinsinden en az uzunlukta kod yazarı kazanır!


8
Zorluğun değiştirilmesini önermeyeceğim, ama 1tanım gereği bir ana olduğunu düşünmüyorum .
Outgolfer Erik

3
1. Bir test vakası olması 1doğrudan spec, "çelişmektedir güvence veriyor giriş numarası asal olacak". 2. Çıktı özellikleri birden fazla çelişki ve belirsizlik içeriyor gibi görünüyor. " Son sayı" satırı "(örneğin 7, 5, 3, 2, 1) tam olarak yazdırılmalıdır " - öyleyse diğerleri değil mi? " Test durumlarınızı kontrol etmek için aynı Regex modeli geçerlidir ", ancak " Çıktı yalnızca tam bağlantılı bir sayı olabilir, bu nedenle hiçbir şeyle bölünmeyebilir " ifadesi normal ifadeyle çelişmektedir. Ancak normal ifade açıkça boştur, çünkü boş dizeye izin verir ve bunu verebilecek hiçbir girdi yoktur.
Peter Taylor

1
1. " Tek bir son satırsonuna izin verilir. " Herhangi bir sayıda sondaki karaktere izin veren normal ifade deseniyle gereksiz / tutarsız . 2. Daha sonra tek bir sayı çıkmasını istediğiniz için " Göreviniz tamsayıları vermektir " giriş cümlesi yanıltıcıdır. 3. Dizinin ve çıktının tüm açıklaması kafa karıştırıcıdır - insanlar temel olarak örnekleri inceleyerek (dizi listesi ve test senaryoları) ne demek istediğinizi tersine mühendislik yapmak zorundadır. Son meydan okuma da bu sorunları vardı ve orada reddetti ki orada önerilen bir düzenlemede onlara hitap ... :(
smls

5
1'i keyfi olarak birincil yapmanın anlamı nedir?
Xanderhall

1
Negatif sipariş tamsayı meydan okuma ama her zaman bir ana daha hızlı olur;)
SplittyDev

Yanıtlar:


5

Jöle , 9 bayt

ÆR1;;\UFV

Çevrimiçi deneyin!

Nasıl çalışır

ÆR1;;\UFV  Main link. Argument: n

ÆR         Prime range; yield all primes up to n.
  1;       Prepend the "prime" 1.
    ;\     Cumulative concatenation; yield all prefixes of the prime range.
      U    Upend; reverse each prefix.
       F   Flatten the resulting 2D array.
        V  Eval. This casts the integer array to string first, thus concatenating
           the integers.

Jöle okuduğumda, soruyu anlamak için tam tersine değil, golf hakkında öğrenmeye çok derin girdiğimi biliyorum. (Bu aslında oldukça okunabilir bir Jelly programı, gittiklerinde; benim için tek kafa karıştırıcı nokta V, bir listede garip özel

5

İşleniyor, 161 bayt

int p(int n){for(int k=1;++k<=sqrt(n);)if(n%k<1)return 0;return 1;}void t(int n){for(int i=1,j;i<=n;i++){if(p(i)<1)continue;for(j=i;j>0;j--)print(p(j)<1?"":j);}}

Bir işlev öncelik kontrolünü, diğeri baskı işlemini yapar. Tarafından arat(7)

Ungolfed

İlk fonksiyon öncelik kontrolü yapar. Bu şekilde daha fazla bayt kaydedildiği için bir intyerine döndürür boolean. ( intYerine boolean, 0yerine false, 1yerine true)

int Q103891p(int n){
  for(int k=1;++k<=sqrt(n);)
    if(n%k<1)return 0;
  return 1;
}

İkinci işlev dizeyi yazdırır. Her sayıdan yinelenir, eğer asal değilse, bir sonraki yinelemeye atlayın. Bir asal ise, başka bir fordöngü içindeki baskıya kadar devam eder. Yine, sayı asal ise, o zaman yazdırırız, aksi takdirde yazdırmayız.

void Q103891(int n){
  for(int i=1,j;i<=n;i++){
    if(p(i)<1)continue;
    for(j=i;j>0;j--)
      print(p(j)<1?"":j);
  }
}

5

Jöle , 12 bayt

ÆR;@1
ÇÇ€UVV

Çevrimiçi deneyin!

Eğer hiç 1s olmasaydı, kodum sadece ÆRÆRUVV7 baytlık olurdu .

Geliştirilmiş açıklama:

ÇÇ€UVV Main link. Arguments: z.
Ç      Run link1 on z.
 ǀ    Run link1 on z's elements.
   U   Reverse z's elements.
    V  Flatten z.
     V Concatenate z's elements.

ÆR;@1 Link 1. Arguments: z.
ÆR    Range of primes [2..z].
    1 Integer: 1.
  ;@  Concatenate x to y.

İrlandalı adam (Dennis denir?) Bir şekilde beni çok geride bıraktı .


4

05AB1E , 19 bayt

LDpÏX¸ì€Lí˜ÐXQsp+ÏJ

Çevrimiçi deneyin!

açıklama

L                     # range [1 ... input]
 DpÏ                  # keep only primes
    X¸ì               # prepend a 1
       €L             # map: range [1 ... n]
         í            # reverse each sublist
          ˜           # flatten list to 1D
           Ð          # triplicate
            XQ        # check elements in one copy for equality with 1
              sp      # check elements in one copy for primality
                +     # add the above lists giving a list with true values at indices
                      # comtaining 1 or a prime
                 Ï    # keep only those elements of the unmodified copy of the list
                  J   # join

DpÏAçıklama tarafından hayran . İyi iş!
devRicher

2

Brachylog , 17 bayt

y:{e1|e#p}f@[rcw\

Çevrimiçi deneyin!

Bundan daha kısa olamaz ...

açıklama

y                      The list [0, ..., Input]
 :{      }f            Find all...
   e1                     ...elements that are 1 (there is 1)...
     |                    ...or...
      e#p                 ...elements that are prime...
           @[          Take a prefix of the result
             rc        Reverse it and concatenate it into a number
               w       Write to STDOUT
                  \    Backtrack: try another prefix

2

GameMaker Dili, 169 bayt

Ana işlev (68 bayt)

b=""for(i=1;i<=argument0;i++){c=i while(j)b+=string(p(c--))}return b

İşlev p (46 bayt)

for(a=0;a<argument0;a++)while q(++b){}return b

İşlev q (55 bayt)

n=argument0 for(i=2;i<n;i++)if!(n mod i)p=1return p|n=1

Güzel, GML kullanan biri
FireCubez

@FireCubez Teşekkürler :) Çok kullanırdım. Aslında öğrendiğim ilk programlama diliydi.
Timtech

1

MATL , 15 bayt

Zq"1@ZqP]1v!VXz

Çevrimiçi deneyin!

Zq      % Implicit input. Push array of primes up to that value
"       % For each prime in that array
  1     %   Push 1
  @     %   Push current prime
  Zq    %   Push array of primes up to that
  P     %   Reverse
]       % End
1       % Push 1
&h      % Concatenate all stack horizontally
V       % Convert to string
Xz      % Remove spaces. Implicit display

1

Perl 6 , 41 bayt

{[~] flat [\R,] 1,|grep *.is-prime,2..$_}

( Çevrimiçi deneyin. )

Açıklama:

  • 1, |grep(*.is-prime, 2..$_): 1 dizisi ve asallar ... (1 2 3 5)
  • [,] ...: Virgül operatörü üzerinden azaltın ("katlayın") ... (1 2 3 5)
  • [\,] ...: Ara sonuçlarla ( üçgen azaltma ) ...((1) (1 2) (1 2 3) (1 2 3 5))
  • [\R,] ...: Ters meta-operatörü virgülle uygulayın ...((1) (2 1) (3 2 1) (5 3 2 1))
  • [~] flat ...: Liste iç içe geçmişini kaldırın ve dize concat operatörünün üzerine katlayın ... 1213215321

(Bu, önceki meydan okumaya verdiğim cevaba dayanıyor .)


1

Mathematica, 61 bayt

ToString/@(1<>Prime@Range[Range@PrimePi@#,0,-1]/.Prime@0->1)&

Bir tamsayı bağımsız değişkeni alan ve bir dize döndüren adsız işlev. (Giriş bir asal değilse, sadece en yakın prime "yuvarlar"; giriş pozitif değilse, 1 gibi davranır.)

Bu uygulama, Martin Ender'in benzer önceki zorluğa verdiği cevabı (bu yaşlı köpeğin yeni numaralar öğrenemeyeceğini kim söylüyor?): <>İç içe bir tamsayı listesini düzleştirmek için kötü hileyi kullanıyor .

Söz konusu iç içe liste, bu yanıttaki benzer bir iç içe liste, uygun uzunlukla ( PrimePi@#girdiye kadar ve girdiyi içeren prim sayısı ile verilir ) oluşturularak başlar; sonra Primeher öğeye uygulanır. Örneğin, giriş için 53 ana kod olan Range[Range@PrimePi@#,0,-1]verimleri {{1,0},{2,1,0},{3,2,1,0}}ve uygulanması Primeher bir eleman verimlerine {{2,Prime[0]},{3,2,Prime[0]},{5,3,2,Prime[0]}}1, 2, çünkü ve 3 asal 2, 3 ve 5 vardır. Martin Ender'in yaklaşımına daha fazla hata eklemeyi başardığım için gurur duyuyorum - Mathematica her yazdığında şikayet ediyor Prime[0].

Prime[0]bir şey değil, ama sorun değil: /.Prime@0->1hepsini 1s'ye dönüştürür . Ve biz de 1ön tarafta bir tane istiyoruz , bu yüzden ""Martin Ender'in cevabından basitçe 1bir bayt tasarrufu sağlıyoruz.


0

PHP, 72 bayt

for(;$n<$argv[1];print$s=$n.$s)for($i=2;$i>1;)for($i=++$n;--$i&&$n%$i;);

Zekâ çalıştırın -r

Yıkmak

for(;$n<$argv[1];               // loop $n up to argument:
    print$s=$n.$s)                  // 2. prepend $n to $s, print $s
    for($i=2;$i>1;)                 // 1. find next prime: break if $i<2
        for($i=++$n;--$i&&$n%$i;);      // if $n is prime, $i is 1 after loop (0 for $n=1)

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.