Lấy ngươi sau lưng Satan-Prime!


22

Số nguyên tố Satan

họ là ai
chúng Primeschứa 666
những thứ này là Satan-Primes: [46663,266677,666599,666683,616669]
chúng KHÔNG :[462667,665669,36363631,555]

Âm mưu

Mỗi số lớn hơn 6661 đều có Satan-Primes phía sau anh ta

Các thách thức

Cho một số nguyên n>6661tìm Satan-Prime phía sau (hoặc bằng) và gần nhất với chính nó.

Ví dụ

Số nguyên n=30000có 3 số nguyên tố Satan (SP) đằng sau nó : [6661, 16661, 26669].
Mã của bạn phải trả lại mã 26669gần nhất

Các trường hợp thử nghiệm

Đầu vào-> Đầu ra

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

Quy tắc

Mã Yor sẽ hoạt động cho bất kỳ ntrong phạm vi ngôn ngữ của bạn.

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng!


1
định nghĩa "khoảng một phút." Là + - 30 giây? Cá nhân tôi nghĩ rằng 30 phút và một phút không khác nhau nhiều ... Ngoài ra, tiền thưởng thường được tán thành ... tôi cũng nghĩ rằng điều này có thể tốt hơn khi output the nth satan primethử thách ...
Socratic Phoenix

ok ok mọi người ... tiền thưởng sẽ bị xóa ...

Hy vọng bạn không bận tâm đến chỉnh sửa tôi đã thực hiện cho tiêu đề thách thức.
Xù xì

3
@Shaggy Điểm thay đổi tiêu đề phục vụ ...?
Conor O'Brien

3
@ ConorO'Brien Vần điệu và xuất hiện cổ xưa, tôi đoán.
wizzwizz4

Câu trả lời:



7

Neim , 9 byte

>ͻ:D+6S𝕚÷

Giải trình:

>         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

Hãy thử trực tuyến!


Vì vậy, thực sự có một nội dung để đẩy "66 được thêm vào một chữ số"? O_O Neim đã tiến bộ.
Erik the Outgolfer

1
Làm thế nào để +6đẩy 666? Hay là Neim chỉ là kim loại đó?
Robert Fraser

6
@RobertFraser Rõ ràng +xcó nghĩa là 612 + mã ký tự của x. Mã 6xảy ra là 54, vì vậy 612 + 54 = 666.
fergusq

@EriktheOutgolfer Vâng, Neim có thể biểu thị cả ba chữ số và một vài bốn chữ số bằng hai byte.
Okx

2
@EriktheOutgolfer '\+*=100,356,612,868 (cộng với thứ tự của char sau đây)
Jonathan Allan

7

Thạch , 10 9 byte

Tiết kiệm 10% nhờ @Dennis!

ÆRwÐf666Ṫ

Hãy thử trực tuyến!

Giải trình

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

Thay thế:ÆRẇ@Ðf666Ṁ
Ông Xcoder

5
Tôi thích rằng Đuôi (ngay sau năm 666) trông giống như một cây thánh giá.
kaine

4
wNên làm việc thay ẇ@.
Dennis

@Dennis s / sh / w / tất nhiên nó hoạt động: p
Erik the Outgolfer

5

Bình thường , 15 14 byte

Đã lưu 1 byte với sự giúp đỡ từ Dave .

Lỗi bộ nhớ cho 969696 và mọi thứ cao hơn trên máy của tôi, nhưng sẽ ổn nếu được cung cấp đủ bộ nhớ.

ef&/`T*3\6P_TS

Hãy thử nó ở đây hoặc kiểm tra Test Suite.


Làm sao?

ef & / `T * 3 \ 6P_TSQ - Chương trình đầy đủ, với đầu vào ẩn (Q) ở cuối

             SQ - Phạm vi [1, Q]
 f - Bộ lọc.
          P_T - Là số nguyên tố?
  & - Và
   / `T * 3 \ 6 - Nó chứa 666.
e - Yếu tố cuối cùng.
                - Hoàn toàn xuất kết quả.

Bình thường , 14 byte

ef/`T*\63fP_TS

Hãy thử nó ở đây!


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

Tôi đã thêm Q kết thúc do nhầm lẫn, đó là 14
Dave

"666"là một cách kém hiệu quả hơn để mô tả chuỗi 666 mà*3\6
Dave


4

Bash + Sử dụng lõi, 51 49 byte

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

Đưa đối số dòng lệnh. Có thể khá chậm với số lượng lớn hơn.


Điều này xuất ra tất cả "số nguyên tố satan" xuống còn 6661, nhưng chỉ nên in cái gần nhất bên dưới đầu vào: thử trực tuyến . Một sửa chữa sẽ chỉ là thêm |head -1vào cuối.
Justin Mariner

@JustinMariner lol, rất tiếc, đã sửa nó
markasoftware

4

Toán học, 64 62 61 53 byte

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

-1 byte nhờ @KellyLowder

-8 byte (wow) nhờ @Notatree

Giải trình

Lấy một đầu vào. Chúng tôi giảm giá theo các điều kiện sau:

  • đầu vào không phải là số nguyên tố, HOẶC

  • các chữ số của đầu vào không chứa ba 6s liên tiếp.

Chúng tôi lặp lại điều đó cho đến khi đạt được một nguyên tố Satan.


2
Rất đẹp. Bạn có thể mất thêm một _ vào cuối vì một số nguyên tố không thể kết thúc vào 6.
Kelly Lowder

@KellyLowder điểm tốt
JungHwan Min

1
Điều này thậm chí còn ngắn hơn với các chuỗi:#//.i_/;!PrimeQ@i||ToString@i~StringFreeQ~"666":>i-1&
Không phải là một cây

1
@Notatree wow! tốt đẹp!
JungHwan Min


3

Japt , 14 byte

õ fj w æ_sø666

Kiểm tra nó

Xem như đã có một phần thưởng dựa trên thời gian 50%: Hoàn thành trường hợp thử nghiệm 969696trong vòng nửa giây.


Giải trình

Đầu vào ngầm định của số nguyên U.

õ

Tạo một mảng các số nguyên từ 1đến U.

fj

Bộ lọc ( f) số nguyên tố.

w

Đảo ngược.

æ_

Trả về phần tử đầu tiên trả về giá trị trung thực (trong trường hợp này 1) khi được chuyển qua hàm kiểm tra nếu ...

sø666

Số nguyên được chuyển đổi thành một chuỗi ( s) chứa (ø ) 666.


Thay thế nhanh hơn, 15 byte

Một lần nữa, nhìn thấy như ban đầu có một phần thưởng dựa trên thời gian, đây là một giải pháp thay thế và nhanh hơn nhiều, mà tôi dường như không thể chơi gôn thêm nữa.

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

Kiểm tra nó


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

Hãy thử trực tuyến!

PowerShell không có bất kỳ yếu tố tích hợp nguyên tố chính nào, vì vậy, mã này mượn mã từ câu trả lời của tôi trên Prime Factors Buddies .

Chúng tôi lấy đầu vào $n, sau đó khai báo một số mới function ftính toán các yếu tố của đầu vào $a. Nếu đầu vào $alà số nguyên tố, thì điều này sẽ trả về $a.

Phần chính của chương trình là for()vòng lặp vô hạn . Trong vòng lặp, chúng tôi kiểm tra xem $n -matches có chống lại 666hay không và có phải $nlà số nguyên tố hay không (nghĩa là $nphù hợp với tất cả các yếu tố của $n). Nếu có, chúng tôi đặt $ntrên đường ống và exit, với đầu ra ngầm. Nếu không, chúng tôi giảm dần $n--và tiếp tục vòng lặp.


Cắt bớt phiên bản của tôi xuống và chỉ cần đạt được một nửa số byte của bạn: D - codegolf.stackexchange.com/a/140539/571
TessellatingHeckler

2

Python 2 , 77 76 byte

Chỉnh sửa: -1 byte nhờ @ Mr.Xcoder

Thời gian chạy chậm, chạy trong 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)))

Hãy thử trực tuyến!

Một giải pháp 76 byte khác

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

Hãy thử trực tuyến!

Với SymPy 73 byte

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

Hãy thử trực tuyến!


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)))- sử dụng max()thay vì[][-1]
Ông Xcoder


2

MATL, 16 byte

ZqP"@V'666'Xf?@.

Dùng thử tại MATL Online

Giải trình

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

Đây là một chương trình đầy đủ!
Bạn sẽ cần Boost để biên dịch nó. (Hoặc sao chép và dán vào trình bao C ++ trực tuyến yêu thích của bạn.)
Chạy nó từ dòng lệnh đưa n làm đối số.

Ung dung:

#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 << " ";
}

Các phím tắt được thực hiện về mặt kiểm tra số ngẫu nhiên. Mã ban đầu bắt đầu thử nghiệm các số nguyên tố có thể ở 6661 và tăng thêm hai. Bạn cũng sẽ nhận được một cảnh báo trình biên dịch vì điều đó (-1) ở đó thay vì npose.

Tuy nhiên, điều này chạy khá nhanh. Chỉ mất khoảng 40 giây để tìm thấy tất cả 214 số nguyên tố satan dưới 1.000.000 trên AMD Sempron 130 cũ của tôi.

: ^ D



1

Python 3 , 85 83 80 byte

Halvard's ngắn hơn 4 byte vì nó được thực hiện trong 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)))

Hãy thử trực tuyến!

Hãy cho nó một chút thời gian, nó cực kỳ chậm vì sự O(n^2)phức tạp của nó .


1

JavaScript (ES6), 55 54 byte

-1 byte nhờ @ThePirateBay.

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

Rất chậm với đầu vào lớn. Kiểm tra tính nguyên thủy thích nghi từ câu trả lời golf mã này .

Thời gian

  • Đầu vào 10000mất 10 giây
  • Nhập liệu 328765mất 3 phút
  • Nhập liệu 678987mất 9 phút
  • Nhập liệu 969696mất 16 phút

Xét nghiệm

Một số trong số này sẽ treo trình duyệt của bạn trong vài phút.

Phiên bản nhanh hơn, 56 byte

Hoàn thành mỗi trường hợp thử nghiệm trong một giây.

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
Bạn không bao giờ nên làm điều đó. Đây là mã golf và hiệu suất hoàn toàn không liên quan. Tôi thực sự khuyên bạn nên quay lại câu trả lời 55 byte trước đó của bạn. Ngoài ra, bạn có thể giảm nó đến 54 byte bằng cách thay thế d==1bằng d<2từ n>6661.

52 byte: f=n=>/666/.test(n)&(g=d=>n%--d?g(d):d<2)(n)?n:f(n-1)nhưng sẽ đưa ra lỗi đệ quy cho số lớn hơn.
Xù xì

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

1

Hồng ngọc 67 , 66 , 58 , 56 byte

Bao gồm các +7byte cho-rprime

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

Nó khá nhanh, tính toán các giá trị lên tới ~2^52trong khoảng một giây và 2^64dưới 5 phút (2011 MBP, Ruby 2.3.1).


1

Stax , 10 byte

ü>:Ñb/VP6─

Chạy và gỡ lỗi nó

Giải thích (giải nén):

^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

Chương trình tốt đẹp. Cảm ơn vì đã cố gắng. FYI, cũng có thể thực hiện nhiều trường hợp bằng cách sử dụng tùy chọn "Dấu phân cách" như thế này
đệ quy

@recursive ah, thx
Wastel



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

Hãy thử trực tuyến!

  • 2 byte được lưu bằng cách loại bỏ các dấu ngoặc không cần thiết.
  • 3 byte được lưu bằng cách kết hợp intkhai báo.

Tôi chắc chắn rằng điều này có thể được thực hiện ngắn hơn; có thể bằng cách gọi đệ quy func fvà loại bỏ lớp ngoài for.

Phương pháp đệ quy, 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);}

Hãy thử trực tuyến!

Tôi không chắc cách tiếp cận này phù hợp với giới hạn của golf-code do phải đặt Func<int,int> f = nullđầu tiên và fđược gọi lại, nhưng không được tính vào các byte. Bất kỳ làm rõ sẽ được đánh giá cao.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.