เอาเธอไว้ข้างหลังฉันซาตาน - นายก!


22

ซาตาน Primes

พวกเขาเป็นใคร?
พวกเขาPrimesมี666
สิ่งเหล่านี้คือซาตาน - ช่วงเวลา[46663,266677,666599,666683,616669]
เหล่านี้ไม่ใช่ :[462667,665669,36363631,555]

พล็อต

ทุกหมายเลขที่ใหญ่กว่า 6661 มีซาตาน primes อยู่ข้างหลังเขา

ความท้าทาย

รับจำนวนเต็มn>6661หา Satan-Prime ด้านหลัง (หรือเท่ากัน) และใกล้เคียงที่สุดกับตัวเอง

ตัวอย่าง

จำนวนเต็มn=30000มี 3 ซาตาน Primes (SP) [6661, 16661, 26669]ที่อยู่เบื้องหลังมัน:
รหัสของคุณจะต้องส่งคืน26669ที่ใกล้เคียงที่สุด

กรณีทดสอบ

Input-> เอาท์พุท

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

กฎระเบียบ

รหัสnเล็กน้อยควรใช้ได้กับทุกช่วงภาษาของคุณ

นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!


1
กำหนด "ประมาณหนึ่งนาที" มันคือ + - 30 วินาทีหรือไม่? โดยส่วนตัวฉันคิดว่า 30 นาทีและนาทีไม่ได้แตกต่างกันมาก ... แถมโบนัสมักจะขมวดคิ้ว ... และฉันคิดว่านี่อาจจะดีกว่าถ้าเป็นความoutput the nth satan primeท้าทาย ...
Socratic Phoenix

ตกลงผู้คนตกลง ... โบนัสจะถูกลบ ...

หวังว่าคุณจะไม่รังเกียจการแก้ไขที่ฉันทำกับชื่อการท้าทาย
Shaggy

3
@Shaggy การเปลี่ยนชื่อเรื่องให้บริการอะไร ...
Conor O'Brien

3
@ ConorO'Brien บทกวีและปรากฏโบราณฉันเข้าใจ
wizzwizz4

คำตอบ:



7

Neim , 9 ไบต์

>ͻ:D+6S𝕚÷

คำอธิบาย:

>         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

ลองออนไลน์!


ดังนั้นในตัวจึงมีการผลักดัน "66 ที่เติมให้เป็นหลัก" จริงหรือ O_O Neim มีความก้าวหน้า
Erik the Outgolfer

1
วิธีการที่ไม่+6ผลักดัน 666? หรือ Neim เป็นแค่โลหะนั่นเหรอ?
Robert Fraser

6
@RobertFraser เห็นได้ชัดว่า+xหมายถึงรหัส 612 + xลักษณะของ รหัส6เกิดขึ้นเป็น 54 ดังนั้น 612 + 54 = 666
fergusq

@EriktheOutgolfer ดี Neim สามารถแสดงตัวเลขสามหลักทั้งหมดและสี่หลักสองสามตัวโดยใช้สองไบต์
Okx

2
@EriktheOutgolfer '\+*=100,356,612,868 (บวกลำดับของถ่านต่อไปนี้)
Jonathan Allan

7

เยลลี่ , 10 9 ไบต์

บันทึกแล้ว 10% ขอบคุณ @Dennis!

ÆRwÐf666Ṫ

ลองออนไลน์!

คำอธิบาย

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

ทางเลือก:ÆRẇ@Ðf666Ṁ
Mr. Xcoder

5
ฉันชอบที่หาง (ขวาหลังจาก 666) ดูเหมือนว่าข้าม
เคนเมื่อ

4
wẇ@ควรจะทำงานแทน
เดนนิส

@Dennis s / sh / w / แน่นอนมันใช้งานได้: p
Erik the Outgolfer

5

Pyth , 15 14 ไบต์

ที่บันทึกไว้ 1 ไบต์ด้วยความช่วยเหลือจากเดฟ

ข้อผิดพลาดของหน่วยความจำสำหรับ969696และสิ่งที่สูงกว่าในเครื่องของฉัน แต่มันก็ดีถ้ามันให้หน่วยความจำเพียงพอ

ef&/`T*3\6P_TS

ลองที่นี่หรือตรวจสอบชุดทดสอบ


อย่างไร?

ef & / `T * 3 \ 6P_TSQ - โปรแกรมเต็มรูปแบบพร้อมอินพุตโดยนัย (Q) ที่ส่วนท้าย

             SQ - ช่วง [1, Q]
 f - ตัวกรอง
          P_T - เป็นสิ่งสำคัญหรือไม่
  & - และ
   / `T * 3 \ 6 - มันมี 666
e - องค์ประกอบสุดท้าย
                - เอาท์พุทผลลัพธ์โดยปริยาย

Pyth , 14 ไบต์

ef/`T*\63fP_TS

ลองที่นี่!


14 ไบต์:ef&/`T*3\6P_TS
เดฟ

ฉันเพิ่มคำถามตอนจบโดยไม่ได้ตั้งใจ 14
เดฟ

"666"เป็นวิธีที่มีประสิทธิภาพน้อยกว่าในการอธิบายสตริง 666 ที่*3\6
เดฟ


4

Bash + Core Utils, 51 49 ไบต์

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

รับอาร์กิวเมนต์บรรทัดคำสั่ง สามารถทำได้ค่อนข้างช้าด้วยจำนวนที่มากขึ้น


เอาท์พุทนี้ทั้งหมด "จำนวนเฉพาะซาตาน" ลงไปที่ 6661 แต่มันควรจะพิมพ์ที่ใกล้เคียงที่สุดอย่างใดอย่างหนึ่งดังต่อไปนี้การป้อนข้อมูล: ลองออนไลน์ การแก้ไขอย่างหนึ่งจะเป็นการเพิ่ม|head -1ไปยังจุดสิ้นสุด
Justin Mariner

@JustinMariner ฮ่า ๆ ๆ ๆ ๆ คงซ่อม
markasoftware

4

Mathematica, 64 62 61 53 ไบต์

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

-1 ไบต์ขอบคุณ @KellyLowder

-8 ไบต์ (ว้าว) ต้องขอบคุณ @Notatree

คำอธิบาย

รับอินพุต เราลดค่าภายใต้เงื่อนไขเหล่านี้:

  • อินพุตไม่ใช่ไพร์มหรือ

  • ตัวเลขของอินพุตไม่มีสาม 6s ในหนึ่งแถว

เราทำซ้ำจนกระทั่งถึงนายกซาตาน


2
ดีมาก. คุณสามารถสูญเสียอีกหนึ่ง _ ในตอนท้ายเนื่องจากนายกไม่สามารถจบใน 6
Kelly Lowder

@KellyLowder เป็นจุดที่ดี
Min

1
สิ่งนี้ยิ่งสั้นลงด้วยสตริง:#//.i_/;!PrimeQ@i||ToString@i~StringFreeQ~"666":>i-1&
ไม่ใช่ต้นไม้

1
@Notatree ว้าว! ดี!
จองฮันมิน


3

Japt , 14 ไบต์

õ fj w æ_sø666

ทดสอบมัน

เห็นเป็นมีเป็นโบนัส 50% ตามเวลา: กรณีทดสอบเสร็จสิ้น969696ในภายใต้ครึ่งวินาที


คำอธิบาย

Uการป้อนข้อมูลโดยนัยของจำนวนเต็ม

õ

สร้างอาร์เรย์ของจำนวนเต็มจากไป1U

fj

ตัวกรอง ( f) จำนวนเฉพาะ

w

ย้อนกลับ

æ_

คืนค่าองค์ประกอบแรกที่คืนค่าความจริง (ในกรณีนี้1) เมื่อส่งผ่านฟังก์ชันที่ตรวจสอบว่า ...

sø666

จำนวนเต็มที่แปลงเป็นสตริง ( s) มี ( ø) 666


ทางเลือกที่เร็วกว่า 15 ไบต์

อีกครั้งเมื่อเห็นว่ามีโบนัสตามเวลาเดิมนี่เป็นทางเลือกและเร็วกว่ามากวิธีแก้ปัญหาที่ฉันไม่สามารถเล่นกอล์ฟได้อีกต่อไป

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

ทดสอบมัน


2

PowerShell , 128 ไบต์

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

ลองออนไลน์!

PowerShell ไม่ได้มีตัวประกอบที่สำคัญ ๆ สร้างอินดังนั้นนี้ยืมโค้ดจากคำตอบของฉันบนนายกรัฐมนตรีปัจจัยเพื่อน

เราใช้การป้อนข้อมูล$nแล้วประกาศใหม่ที่คำนวณจากปัจจัยของการป้อนข้อมูลfunction f $aถ้าใส่เป็นสำคัญแล้วนี้จะกลับมาเพียงแค่$a$a

ส่วนหลักของโปรแกรมคือfor()วงวนไม่สิ้นสุด ภายในลูปเราตรวจสอบว่า$n -matches เทียบกับ666หรือไม่และ$nเป็นไพรม์ (เช่น$nตรงกับปัจจัยทั้งหมดของ$n) ถ้าเป็นเช่นนั้นเราวาง$nบนไพพ์ไลน์และexitด้วยเอาต์พุตโดยปริยาย มิฉะนั้นเราจะลดลง$n--และดำเนินการต่อห่วง


ตัดทุ่นระเบิดของฉันลงและจัดการเพียงครึ่งหนึ่งของจำนวนไบต์: D - codegolf.stackexchange.com/a/140539/571
TessellatingHeckler

2

Python 2 , 77 76 ไบต์

แก้ไข: -1 ไบต์ขอบคุณ@ Mr.Xcoder

เวลาทำงานช้าวิ่งเข้า 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)))

ลองออนไลน์!

โซลูชัน 76 ไบต์อื่น

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

ลองออนไลน์!

ด้วยSymPy 73 ไบต์

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

ลองออนไลน์!


76 ไบต์: lambda x:max(q for q in range(x+1)if"666"in`q`*all(q%t for t in range(2,q)))- ใช้max()แทน[][-1]
Mr. Xcoder

2

PowerShell , 71 69 64 ไบต์

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

ลองออนไลน์!

  • 328765 ใช้เวลาประมาณ 30 วินาทีบนเครื่องของฉัน แต่ใช้เวลา จำกัด 60 วินาทีใน Tio.run

  • 678987 ใช้เวลาประมาณ 1.5 นาที

  • 969696 ใช้เวลา ~ 4.5 นาที

วิธีที่ชาญฉลาดในการทำปัจจัย
AdmBorkBork

2

MATL, 16 ไบต์

ZqP"@V'666'Xf?@.

ลองใช้ที่MATL Online

คำอธิบาย

         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 ไบต์

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

นี่เป็นโปรแกรมเต็มรูปแบบ!
คุณจะต้องเพิ่มเพื่อรวบรวม (หรือคัดลอกและวางลงในเชลล์ C ++ ออนไลน์ที่คุณชื่นชอบ)
เรียกใช้จากบรรทัดคำสั่งโดยให้nเป็นอาร์กิวเมนต์

Ungolfed:

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

มีการสร้างทางลัดในแง่ของการทดสอบตัวเลขแบบสุ่ม รหัสเดิมเริ่มทดสอบช่วงเวลาที่เป็นไปได้ที่ 6661 และเพิ่มขึ้นสอง คุณจะได้รับคำเตือนคอมไพเลอร์ด้วยเหตุนั้น (-1) ตรงนั้นแทนที่จะเป็น npos

ถึงกระนั้นมันก็ค่อนข้างเร็ว ใช้เวลาประมาณ 40 วินาทีในการค้นหาจำนวนทั้งหมด 214 ครั้งภายใต้ 1,000,000 ครั้งใน AMD Sempron 130 เก่าของฉัน

: D ^


2

แพ็คเกจ Bash + bsd-game อายุ 33 ปี

  • บันทึก 2 ไบต์ด้วย @FedericoPoloni
primes 2 $[$1+1]|grep 666|tail -1

ลองมันออนไลน์


คุณสามารถบันทึก 1 tail -n1ไบต์ถ้าคุณแทนที่ทั้งสองคำสั่งที่ผ่านมากับ
Federico Poloni

@FedericoPoloni duh - ไม่น่าเชื่อว่าฉันลืมtailที่นี่ ในความtail -1เป็นจริงแม้แต่น้อย 1
บาดเจ็บทางระบบดิจิตอล


1

JavaScript (ES6), 55 54 ไบต์

-1 ไบต์ขอบคุณ @ThePirateBay

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

ช้ามากด้วยอินพุตที่มีขนาดใหญ่ การทดสอบเบื้องต้นที่ดัดแปลงมาจากคำตอบกอล์ฟรหัสนี้

การกำหนดเวลา

  • อินพุต10000ใช้เวลา 10 วินาที
  • อินพุต328765ใช้เวลา 3 นาที
  • อินพุต678987ใช้เวลา 9 นาที
  • อินพุต969696ใช้เวลา 16 นาที

การทดสอบ

บางส่วนจะแขวนเบราว์เซอร์ของคุณเป็นเวลาหลายนาที

รุ่นที่เร็วกว่า 56 ไบต์

เสร็จสิ้นการทดสอบแต่ละกรณีในไม่กี่วินาที

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
คุณไม่ควรทำอย่างนั้น นี่คือรหัสกอล์ฟและประสิทธิภาพไม่เกี่ยวข้องโดยสิ้นเชิง ฉันขอแนะนำให้ย้อนกลับไปยังคำตอบ 55 ไบต์ก่อนหน้าของคุณ นอกจากนี้คุณสามารถลดความมันถึง 54 ไบต์โดยการแทนที่d==1ด้วยตั้งแต่d<2 n>6661

52 ไบต์: f=n=>/666/.test(n)&(g=d=>n%--d?g(d):d<2)(n)?n:f(n-1)แต่จะส่งผลให้เกิดข้อผิดพลาดในการเรียกซ้ำสำหรับจำนวนที่มากขึ้น
ปุย

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

1

ทับทิม, 67 , 66 , 58 , 56 ไบต์

รวม+7ไบต์สำหรับ-rprime

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

มันค่อนข้างเร็วใช้งานคอมพิวเตอร์ได้มากถึง~2^52ประมาณหนึ่งวินาทีและน้อย2^64กว่า 5 นาที (2011 MBP, Ruby 2.3.1)


1

Stax , 10 ไบต์

ü>:Ñb/VP6─

เรียกใช้และแก้ไขข้อบกพร่อง

คำอธิบาย (แยกออก):

^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

โปรแกรมที่ดี ขอขอบคุณที่ทดลองใช้ stax FYI ก็เป็นไปได้ที่จะทำหลาย ๆ กรณีโดยใช้ตัวเลือก "ตัวคั่น" เช่นนี้
เรียกซ้ำ

@recursive ah, ขอบคุณ
สูญเปล่า



0

C # (. NET Core) , 117 115 112 ไบต์

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

ลองออนไลน์!

  • บันทึก 2 ไบต์โดยลบวงเล็บปีกกาที่ไม่จำเป็น
  • 3 ไบต์บันทึกโดยรวมการintประกาศ

ฉันแน่ใจว่าสิ่งนี้อาจทำให้สั้นลง อาจจะโดยการโทรซ้ำfunc fและลบส่วนนอกfor-loop

วิธีการแบบเรียกซ้ำ, 85 ไบต์

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

ลองออนไลน์!

ฉันไม่แน่ใจว่าวิธีการนี้เหมาะสมกับขอบเขตของโค้ดกอล์ฟได้ดีเพียงใดเนื่องจากต้องตั้งค่าFunc<int,int> f = nullครั้งแรกและfถูกเรียกอีกครั้ง แต่ไม่นับรวมเป็นไบต์ การชี้แจงใด ๆ จะได้รับการชื่นชม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.