Tantangan bilangan bulat orde negatif, tapi ini Waktu Perdana!


12

Saya berbicara tentang pertanyaan ini , lihatlah jika Anda agak bingung.

Tugas utama

Tugas Anda adalah untuk menghasilkan bilangan bulat bersambung, dalam urutan menurun, tetapi meningkatkan bilangan bulat maksimum setiap kali Anda menekan 1 (untuk pertanyaan ini, 1 akan dianggap sebagai bilangan prima) . Meskipun ini tidak terdengar berbeda dari pertanyaan pertama, inilah bagian yang sulit: Semua angka yang dihasilkan mungkin hanya bilangan prima . Ini akan dirangkai menjadi satu string tanpa spasi atau baris baru. Masukan Anda juga akan menjadi bilangan prima .

Contoh:

1
21
321
5321
75321
1175321
Valid output:
1213215321753211175321

Memasukkan

Kode Anda hanya dapat mengambil satu input: perdana tertinggi untuk dicetak. Input ini dapat berasal dari mana saja (grafis, STDIN). Anda yakin bahwa inputnya adalah bilangan prima.

Keluaran

Anda harus menampilkan nomor yang dihasilkan. Anda bisa mendapatkan nomor ini dengan terus menghitung mundur, hanya menghitung nomor jika itu prima, lalu hubungkan semua hasil bersama ke satu nomor. "Baris" nomor terakhir (mis. 7, 5, 3, 2, 1) Harus dicetak sepenuhnya. Outputnya bisa berupa apa saja (angka, string, grafik), asalkan bisa dibaca. Pola Regex yang sama untuk memeriksa kasus pengujian Anda berlaku:

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

Jika output Anda tidak cocok dengan pola ini, kode Anda tidak valid.

Aturan

  • Input dijamin prima, tidak termasuk penanganan kesalahan, kecuali jika Anda ingin / perlu.
  • Outputnya mungkin hanya angka yang terhubung penuh, oleh karena itu tidak terpecah oleh apa pun, bahkan baris baru.
  • Algoritme Anda seharusnya tidak memeriksa instance pertama yang Nmuncul (misalnya, 17in 1175321), melainkan untuk instance pertama Nsebagai angka aktual.
  • Masukan Anda dijamin positif, jangan tambahkan penanganan kecuali Anda mau / perlu.

Uji kasus

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

Pemenang

Ini adalah , jadi pembuat kode dengan panjang byte paling sedikit menang!


8
Saya tidak akan menyarankan untuk mengubah tantangan, tetapi saya tidak berpikir itu 1adalah prima menurut definisi.
Erik the Outgolfer

3
1. Memiliki test case 1secara langsung bertentangan dengan spec, yang " meyakinkan " bahwa nomor input akan menjadi prima. 2. Spesifikasi output tampaknya mengandung banyak kontradiksi dan ambiguitas. " Angka" baris "terakhir (mis. 7, 5, 3, 2, 1) harus dicetak sepenuhnya " - jadi yang lain tidak? " Pola Regex yang sama untuk memeriksa kasus pengujian Anda berlaku ", tetapi " Output mungkin hanya angka yang terhubung penuh, oleh karena itu tidak terpecah oleh apa pun " bertentangan dengan regex itu. Tetapi regex jelas-jelas cerdik karena memungkinkan string kosong, dan tidak ada input yang bisa memberikan itu.
Peter Taylor

1
1. " Sebuah baris baru Trailing tunggal diperbolehkan. " Berlebihan / tidak konsisten dengan pola regex yang memungkinkan setiap jumlah karakter tertinggal. 2. Kalimat intro " Tugas Anda adalah untuk mengeluarkan bilangan bulat " menyesatkan karena Anda kemudian meminta untuk mengeluarkan satu nomor. 3. Seluruh penjelasan tentang urutan dan hasilnya membingungkan - orang pada dasarnya harus merekayasa balik apa yang Anda maksud dengan mempelajari contoh-contoh (daftar urutan dan kasus uji). Tantangan terakhir juga memiliki masalah ini, dan saya menyapa mereka di sana dalam sunting yang disarankan di sana, yang Anda tolak ... :(
smls

5
Apa gunanya secara sewenang-wenang menjadikan 1 prima?
Xanderhall

1
Tantangan bilangan bulat negatif tetapi setiap kali bilangan prima akan lebih cepat;)
SplittyDev

Jawaban:


5

Jelly , 9 byte

ÆR1;;\UFV

Cobalah online!

Bagaimana itu bekerja

Æ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.

Saya tahu saya terlalu dalam belajar tentang golf ketika saya membaca Jelly untuk memahami pertanyaan daripada sebaliknya. (Ini sebenarnya adalah program Jelly yang cukup mudah dibaca, seiring berjalannya waktu; satu-satunya titik yang membingungkan bagi saya adalah kasus khusus yang aneh Vpada daftar.)

5

Memproses, 161 byte

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

Satu fungsi melakukan pengecekan primality, yang lainnya melakukan pencetakan. Sebut sajat(7)

Tidak disatukan

Fungsi pertama melakukan pengecekan primality. Ini mengembalikan intbukan booleankarena cara ini lebih banyak byte disimpan. ( intbukannya boolean, 0bukannya false, 1bukannya true)

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

Fungsi kedua mencetak string. Itu iterates melalui setiap nomor, jika itu bukan prima, lewati ke iterasi berikutnya. Jika prime, terus ke pencetakan di dalam for-lingkaran lain . Sekali lagi, jika angkanya prima, maka kami mencetaknya, kalau tidak, tidak.

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

Jelly , 12 byte

ÆR;@1
ÇÇ€UVV

Cobalah online!

Jika bukan karena 1s sama sekali, kode saya hanya akan ÆRÆRUVVselama 7 byte.

Penjelasan yang ditingkatkan:

ÇÇ€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.

Orang Irlandia (disebut Dennis?) Entah bagaimana mengungguli saya lol


4

05AB1E , 19 byte

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

Cobalah online!

Penjelasan

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

Kagum dengan DpÏpernyataan itu. Kerja bagus!
devRicher

2

Brachylog , 17 byte

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

Cobalah online!

Sepertinya tidak bisa menjadi lebih pendek dari itu ...

Penjelasan

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

Bahasa GameMaker, 169 byte

Fungsi utama (68 byte)

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

Fungsi p (46 byte)

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

Fungsi q (55 byte)

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

Bagus, seseorang yang menggunakan GML
FireCubez

@FireCubez Terima kasih :) Saya sering menggunakannya. Itu sebenarnya bahasa pemrograman pertama yang saya pelajari.
Timtech

1

MATL , 15 byte

Zq"1@ZqP]1v!VXz

Cobalah online!

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 byte

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

( Coba online. )

Penjelasan:

  • 1, |grep(*.is-prime, 2..$_): Urutan 1 dan bilangan prima ... (1 2 3 5)
  • [,] ...: Kurangi ("lipat") melalui operator koma ... (1 2 3 5)
  • [\,] ...: Dengan hasil antara ( pengurangan segitiga ) ...((1) (1 2) (1 2 3) (1 2 3 5))
  • [\R,] ...: Terapkan pembalikan meta-operator ke koma ...((1) (2 1) (3 2 1) (5 3 2 1))
  • [~] flat ...: Hapus daftar sarang, dan lipat operator string concat ... 1213215321

(Ini berdasarkan jawaban saya untuk tantangan sebelumnya .)


1

Mathematica, 61 byte

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

Fungsi tanpa nama mengambil argumen integer dan mengembalikan string. (Jika input bukan prima, ia hanya "membulatkannya" ke prime terdekat; jika inputnya tidak positif, ia berpura-pura sebagai 1.)

Implementasi ini menggunakan trik jahat dari jawaban Martin Ender untuk tantangan serupa sebelumnya (siapa bilang anjing tua ini tidak bisa mempelajari trik baru?): Menyalahgunakan <>untuk meratakan daftar bilangan bulat yang bersarang.

Daftar bersarang dalam pertanyaan dimulai dengan membuat daftar bertingkat yang sama seperti pada jawaban itu, dengan panjang yang sesuai (diberikan oleh PrimePi@#, jumlah bilangan prima hingga dan termasuk input); kemudian Primediterapkan ke setiap elemen. Misalnya, untuk input 5yang merupakan prima ke-3, kode Range[Range@PrimePi@#,0,-1]menghasilkan {{1,0},{2,1,0},{3,2,1,0}}, dan menerapkan Primeke setiap elemen menghasilkan {{2,Prime[0]},{3,2,Prime[0]},{5,3,2,Prime[0]}}sejak primer 1, 2, dan 3 masing-masing 2, 3, dan 5. Saya merasa bangga bahwa saya berhasil menambahkan lebih banyak kesalahan pada pendekatan Martin Ender — Mathematica mengeluh setiap kali ia menulis Prime[0].

Prime[0]bukanlah sesuatu, tapi tidak apa-apa: /.Prime@0->1mengubah semuanya menjadi 1s. Dan kami juga menginginkan sebuah 1di bagian depan, jadi kami mengganti jawaban ""dari Martin Ender dengan sederhana 1, yang sebenarnya menghemat satu byte.


0

PHP, 72 byte

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

Jalankan kecerdasan -r

kerusakan

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)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.