Dapatkan kamu di belakang saya Setan-Perdana!


22

Setan-Primes

siapa mereka?
mereka Primesmengandung 666
ini adalah Setan-Primes: [46663,266677,666599,666683,616669]
ini BUKAN :[462667,665669,36363631,555]

Merencanakan

Setiap angka yang lebih besar dari 6661 memiliki Setan-Primes di belakangnya

Tantangan

Diberikan bilangan bulat n>6661menemukan Setan-Perdana di belakang (atau setara) dan paling dekat dengan dirinya.

Contohnya

Bilangan bulat n=30000memiliki 3 Setan-Primes (SP) di balik itu: [6661, 16661, 26669].
Kode Anda harus mengembalikan 26669yang terdekat di belakangnya

Uji Kasus

Input-> Output

6662->6661    
10000->6661    
66697->66697 (a SP returns himself)  
328765->326663  
678987->676661
969696->966677

Aturan

Kode Anda harus bekerja untuk semua yang ada ndalam rentang bahasa Anda.

Ini , jadi jawaban tersingkat dalam byte menang!


1
mendefinisikan "sekitar satu menit." Apakah + - 30 detik? Saya pribadi berpikir bahwa 30 menit dan satu menit tidak berbeda banyak ... Juga bonus umumnya disukai ... juga saya pikir ini mungkin lebih baik sebagai output the nth satan primetantangan ...
Socratic Phoenix

ok ok people ... bonus akan dihapus ...

Semoga Anda tidak keberatan hasil edit yang saya buat untuk judul tantangan.
Shaggy

3
@Shaggy Apa gunanya perubahan judul dilayani ...?
Conor O'Brien

3
@ ConorO'Brien Berima dan tampil kuno, saya kira.
wizzwizz4

Jawaban:


7

Mathematica, 82 byte

Last@Select[Prime@Range@PrimePi@#,!FreeQ[Subsequences[IntegerDigits@#],{6,6,6}]&]&

Tunggu, maksudmu tidak ada built-in untuk ini?
Dana Gugatan Monica

7

Neim , 9 byte

>ͻ:D+6S𝕚÷

Penjelasan:

>         Increment input
 ͻ        Start infinite loop
  :        Previous prime
   D       Duplicate
    +6     Push 666
      S    Swap
       𝕚   See if 666 is a substring of the top of the stack
        ÷  If true, break

Cobalah online!


Jadi benar-benar ada builtin untuk mendorong "66 berganti menjadi digit"? O_O Neim telah berkembang.
Erik the Outgolfer

1
Bagaimana cara +6mendorong 666? Atau apakah Neim hanya logam itu?
Robert Fraser

6
@RobertFraser Rupanya +xberarti 612 + kode karakter x. Kode 6kebetulan adalah 54, jadi 612 + 54 = 666.
fergusq

@EriktheOutgolfer Nah, Neim dapat mewakili semua tiga digit angka dan beberapa empat digit menggunakan dua byte.
Okx

2
@EriktheOutgolfer '\+*=100,356,612,868 (ditambah ordinal dari char berikut yaitu)
Jonathan Allan

7

Jelly , 10 9 byte

Hemat 10% berkat @Dennis!

ÆRwÐf666Ṫ

Cobalah online!

Penjelasan

ÆR          # All primes in range [2, input]
   Ðf      # Keep those which satisfy
  w        # truthy if y is in x
     666   #           ^ (this is y)
        Ṫ  # Tail (take the last element)

Alternatif:ÆRẇ@Ðf666Ṁ
Tn. Xcoder

5
Saya suka bahwa Tail (tepat setelah 666) terlihat seperti salib.
kaine

4
wharus bekerja ẇ@.
Dennis

@Dennis s / sh / w / tentu saja bekerja: p
Erik the Outgolfer

5

Pyth , 15 14 byte

Disimpan 1 byte dengan bantuan dari Dave .

Kesalahan memori untuk 969696dan apa pun yang lebih tinggi pada komputer saya, tetapi tidak masalah jika diberikan memori yang cukup.

ef&/`T*3\6P_TS

Cobalah di sini atau periksa Test Suite.


Bagaimana?

ef & / `T * 3 \ 6P_TSQ - Program lengkap, dengan input implisit (Q) di akhir

             SQ - Rentang [1, Q]
 f - Filter.
          P_T - Apakah prima?
  & - Dan
   / `T * 3 \ 6 - Berisi 666.
e - Elemen terakhir.
                - Keluarkan hasilnya secara implisit.

Pyth , 14 byte

ef/`T*\63fP_TS

Coba di sini!


14 byte:ef&/`T*3\6P_TS
Dave

Saya menambahkan Q ending secara tidak sengaja, 14
Dave

"666"adalah cara yang kurang efisien untuk menggambarkan string 666 yang*3\6
Dave


4

Bash + Core Utils, 51 49 Bytes

seq $1|tac|factor|awk 'NF==2&&/666/&&!a--&&$0=$2'

Mengambil argumen baris perintah. Bisa sangat lambat dengan jumlah yang lebih besar.


Ini menghasilkan semua "setan primes" ke 6661, tetapi seharusnya hanya mencetak yang paling dekat di bawah input: coba online . Salah satu perbaikannya adalah dengan menambahkan saja |head -1sampai akhir.
Justin Mariner

@JustinMariner lol, whoops, memperbaikinya
markasoftware

4

Mathematica, 64 62 61 53 byte

#//.i_/;!PrimeQ@i||ToString@i~StringFreeQ~"666":>i-1&

-1 byte terima kasih kepada @KellyLowder

-8 byte (wow) terima kasih kepada @Natatree

Penjelasan

Ambil input. Kami menurunkannya dalam kondisi berikut:

  • inputnya tidak prima, ATAU

  • digit input tidak mengandung tiga 6s berturut-turut.

Kami ulangi itu sampai Setan utama tercapai.


2
Sangat bagus. Anda dapat kehilangan satu lagi _ pada akhirnya karena perdana tidak dapat berakhir pada 6.
Kelly Lowder

@KellyLowder good point
JungHwan Min

1
Ini bahkan lebih pendek dengan string:#//.i_/;!PrimeQ@i||ToString@i~StringFreeQ~"666":>i-1&
Bukan pohon

1
@ Tidak, wow! bagus!
JungHwan Min


3

Japt , 14 byte

õ fj w æ_sø666

Menguji

Melihat karena ada adalah bonus berdasarkan waktu 50%: kasus uji Rampungkan 969696di bawah setengah detik.


Penjelasan

Input bilangan bulat implisit U.

õ

Buat array bilangan bulat dari 1ke U.

fj

Saring ( f) bilangan prima.

w

Membalikkan.

æ_

Kembalikan elemen pertama yang mengembalikan nilai kebenaran (dalam hal ini 1) ketika melewati fungsi yang memeriksa apakah ...

sø666

Integer yang dikonversi menjadi string ( s) berisi ( ø) 666.


Alternatif Lebih Cepat, 15 byte

Sekali lagi, mengingat awalnya ada bonus berdasarkan waktu, inilah alternatif, dan jauh lebih cepat, solusi yang sepertinya tidak bisa saya mainkan lebih jauh.

U-@j *U´sø666}a

Menguji


2

PowerShell , 128 byte

param($n)function f($a){for($i=2;$a-gt1){if(!($a%$i)){$i;$a/=$i}else{$i++}}}for(){if($n-match666-and($n-eq(f $n))){$n;exit}$n--}

Cobalah online!

PowerShell tidak memiliki built-in faktorisasi prima, jadi ini meminjam kode dari jawaban saya pada Prime Factors Buddies .

Kami mengambil input $n, lalu menyatakan yang baru function fyang menghitung faktor-faktor input $a. Jika inputnya $aprima, maka ini akan kembali adil $a.

Bagian utama dari program ini adalah infinite for()loop. Di dalam loop, kami memeriksa apakah $n -matches melawan 666dan apakah $nprima (yaitu, $ncocok dengan semua faktor $n). Jika ya, kita letakkan $ndi pipeline dan exit, dengan output implisit. Kalau tidak, kami mengurangi $n--dan melanjutkan loop.


Versi tambang saya terpotong ke bawah dan hanya berhasil menekan setengah jumlah byte Anda: D - codegolf.stackexchange.com/a/140539/571
TessellatingHeckler

2

Python 2 , 77 76 byte

Sunting: -1 byte berkat @ Mr.Xcoder

Waktu berjalan lambat, berjalan masuk O(n^2)

lambda x:max(q for q in range(x+1)if"666"in`q`*all(q%t for t in range(2,q)))

Cobalah online!

Solusi 76 byte lainnya

lambda x:max(q*("666"in`q`*all(q%t for t in range(2,q)))for q in range(x+1))

Cobalah online!

Dengan SymPy 73 byte

lambda x:max(q for q in primerange(0,x+1)if"666"in`q`)
from sympy import*

Cobalah online!


76 byte: lambda x:max(q for q in range(x+1)if"666"in`q`*all(q%t for t in range(2,q)))- gunakan max()bukan[][-1]
Mr. Xcoder

2

PowerShell , 71 69 64 byte

param($s)for(;$s-notmatch666-or(2..($s/2)|?{!($s%$_)});$s--){}$s

Cobalah online!

  • 328765 membutuhkan waktu ~ 30 detik di mesin saya, tetapi batas waktu 60 detik di Tio.run habis.

  • 678987 memakan waktu ~ 1,5 menit.

  • 969696 memakan waktu ~ 4,5 menit.

Cara pintar melakukan faktor-faktor.
AdmBorkBork

2

MATL, 16 byte

ZqP"@V'666'Xf?@.

Cobalah di MATL Online

Penjelasan

         Implicitly grab input (n)
Zq       Compute the primes up to n (output is in increasing order)
P        Flip the array (so larger primes come first)
"        For each prime
  @V     Convert it to a string
  '666'  Push the string literal '666' to the stack
  Xf     Find the location of '666' in the prime
  ?      If it was present...
    @.   Push it to the stack and break
         Implicitly display the stack contents

2

C ++ 389 byte

#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/miller_rabin.hpp>
using namespace boost::random;typedef boost::multiprecision::cpp_int Z;int main(int,char**v){mt19937 m(clock());independent_bits_engine<mt11213b,256,Z>g(m);Z n{v[1]},p;while(p++<=n)if(miller_rabin_test(p,25,g)&&p.convert_to<std::string>().find( "666" )!=-1)std::cout<<p<<" ";}

Ini adalah program lengkap!
Anda perlu Boost untuk mengompilasinya. (Atau salin dan tempel ke shell C ++ online favorit Anda.)
Jalankan dari baris perintah dengan memberikan n sebagai argumen.

Tidak Disatukan:

#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/miller_rabin.hpp>
using namespace boost::random;

typedef boost::multiprecision::cpp_int integer;

int main( int argc, char** argv )
{
  mt19937 mt( clock() );
  independent_bits_engine <mt11213b, 256, integer> rng( mt );

  integer input {argv[ 1 ]};
  integer possible;

  while (possible++ <= input)
    if (
      // is_prime( possible )
      miller_rabin_test( possible, 25, rng )
    && 
      // possible has "666" in it
      (possible.convert_to <std::string> ().find( "666" ) != std::string::npos))

    std::cout << possible << " ";
}

Pintasan dibuat dalam hal pengujian angka acak. Kode asli mulai menguji kemungkinan bilangan prima di 6661 dan bertambah dua. Anda juga akan mendapatkan peringatan kompiler karena itu (-1) di sana alih-alih npos.

Namun, ini berjalan cukup cepat. Hanya butuh sekitar 40 detik untuk menemukan semua 214 setan primes di bawah 1.000.000 pada AMD Sempron 130 lama saya.

: ^ D


2

Paket Bash + bsd-games, 33

  • 2 byte disimpan berkat @FedericoPoloni.
primes 2 $[$1+1]|grep 666|tail -1

Cobalah online .


Anda dapat menyimpan 1 byte jika Anda mengganti dua perintah terakhir dengan tail -n1.
Federico Poloni

@FedericoPoloni ya - tidak percaya saya lupa di tailsini. Bahkan tail -11 bahkan kurang.
Digital Trauma

1

Python 3 , 85 83 80 byte

Halvard's berukuran 4 byte lebih pendek karena dilakukan dengan Python 2.

lambda k:max(x for x in range(k+1)if"666"in str(x)*all(x%i for i in range(2,x)))

Cobalah online!

Beri waktu, itu sangat lambat karena O(n^2)kerumitannya.


1

JavaScript (ES6), 55 54 byte

-1 byte terima kasih kepada @ThePirateBay.

f=n=>/666/.test(d=n)&eval("while(n%--d);d<2")?n:f(n-1)

Sangat lambat dengan input besar. Tes primality diadaptasi dari jawaban kode golf ini .

Pengaturan waktu

  • Input 10000butuh 10 detik
  • Memasukkan 328765 memakan waktu 3 menit
  • Memasukkan 678987 membutuhkan waktu 9 menit
  • Memasukkan 969696 memakan waktu 16 menit

Tes

Beberapa di antaranya akan menggantung browser Anda selama beberapa menit.

Versi Lebih Cepat, 56 byte

Selesaikan setiap test case dalam waktu kurang dari satu detik.

f=n=>/666/.test(n)&&eval("for(d=2;n%d++;);d>n")?n:f(n-1)

;[6662, 10000, 328765, 678987, 969696].forEach(n=>console.log(`f(${n}) -> ${f(n)}`))


2
Anda seharusnya tidak pernah melakukan itu. Ini kode golf dan kinerjanya sama sekali tidak relevan. Saya sangat menyarankan untuk mengembalikan jawaban 55 byte Anda sebelumnya. Anda juga dapat menguranginya menjadi 54 byte dengan menggantinya d==1dengan d<2sejak n>6661.

52 byte: f=n=>/666/.test(n)&(g=d=>n%--d?g(d):d<2)(n)?n:f(n-1)tetapi akan menimbulkan kesalahan rekursi untuk nomor yang lebih besar.
Shaggy

f=n=>/666/.test(d=n)-eval("while(n%--d);d")?f(n-1):n
14m2

1

Ruby, 67 , 66 , 58 , 56 byte

Termasuk +7byte untuk-rprime

->z{z.downto(1).find{|x|/666/=~x.to_s&&x.prime?}}

Ini cukup cepat, menghitung nilai hingga ~2^52sekitar satu detik dan 2^64dalam waktu kurang dari 5 menit (MBP 2011, Ruby 2.3.1).


1

Stax , 10 byte

ü>:Ñb/VP6─

Jalankan dan debug itu

Penjelasan (tidak dibungkus):

^w:pc$666$#! Full program, implicit input-parsing
^            Increment input
 w           do-while:
  :p           Previous prime
    c$         Copy and stringify
      666$     Push "666"
          #    Number of occurences
           !   Logical not
             Implicit output

Program yang bagus. Terima kasih telah mencoba stax. FYI, juga dimungkinkan untuk melakukan banyak kasus dengan menggunakan opsi "Separator" seperti ini
rekursif

@recursive ah, thx
wastl

0

PHP , 148 byte

<?php $p=[2];$s=[];for($i=3;$i<=$argv[1];$i++){foreach($p as $q)if($i%$q===0)continue 2;$p[]=$i;if(strpos($i,'666')!==false)$s[]=$i;}echo end($s);?>

Cobalah online!



0

C # (.NET Core) , 117 115 112 byte

f=>{for(int i=f;i>1;i--){int p=1,j=2;while(j<i)if(i%j++<1)p=0;if(p>0&$"{i}".Contains("666"))return i;}return 0;}

Cobalah online!

  • 2 byte disimpan dengan menghapus kawat gigi yang tidak perlu.
  • 3 byte disimpan dengan menggabungkan intdeklarasi.

Saya yakin ini bisa dibuat lebih pendek; mungkin dengan secara rekursif memanggil func fdan menghapus bagian luar for-loop

Pendekatan Rekursif, 85 byte

i=>{int p=1,j=2;while(j<i)if(i%j++<1)p=0;return p>0&$"{i}".Contains("666")?i:f(--i);}

Cobalah online!

Saya tidak yakin seberapa baik pendekatan ini cocok dalam batas-batas kode-golf karena harus mengatur yang Func<int,int> f = nullpertama, dan itu fdipanggil lagi, tetapi tidak dihitung terhadap byte. Klarifikasi apa pun akan dihargai.

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.