Arkamdan geç Şeytan-Başbakan!


22

Şeytan-Asal

Onlar kim?
Bunları Primesiçerenler 666
Şeytan-Asallardır: [46663,266677,666599,666683,616669]
Bunlar DEĞİL :[462667,665669,36363631,555]

Arsa

6661'den daha büyük olan her sayı arkasında Şeytan-Asalları vardır.

Meydan okuma

Bir tamsayı verildiğinde n>6661Şeytan-Başbakanı arkanda (veya eşit) ve kendisine en yakın olanı bulun .

Örnekler

Tamsayı n=30000arkasında 3 Şeytan-Asal Sayı (SP) sahiptir: [6661, 16661, 26669].
Kodunuz 26669, arkasındaki en yakın olanı döndürmelidir.

Test Kılıfları

Girdi-> Çıktı

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

kurallar

Yor kodu n, dilinizin herhangi biri için çalışmalıdır .

Bu , yani bayt cinsinden en kısa cevap kazanır!


1
"yaklaşık bir dakika" tanımlayın. + - 30 saniye mi? Ben şahsen 30 dakika ve bir dakika o kadar da farklı olmadığını düşünüyorum ... Ayrıca bonuslar genellikle kaşlarını çattı ... Ben de bunun bir zorluk olarak daha iyi olabileceğini düşünüyorum output the nth satan prime...
— Socratic Phoenix

tamam insanlar tamam ... bonus kaldırılacak ...

Umarım meydan okumaya yaptığım düzenlemeye aldırmazsın.
— Shaggy

3
@Shaggy Başlık değişikliğinin ne anlamı var ...?
— Conor O'Brien,

3
@ ConorO'Brien Arkaik olarak kafiyeli ve görünen, sanırım.
— wizzwizz4

Yanıtlar:


7

Mathematica, 82 bayt

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

Bekle, bunun için yerleşik bir şey olmadığını mı söylüyorsun?
— Fon Monica'nın Davası,

7

Neim , 9 bayt

>ͻ:D+6S𝕚÷

Açıklama:

>         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

Çevrimiçi deneyin!


Demek ki "66 basamağa hazırlandı" diyen bir yerleşik var mı? O_O Neim ilerledi.
— Outgolfer Erik,

1
+6666'yı nasıl zorlar? Yoksa Neim sadece bu metal mi?
— Robert Fraser,

6
@RobertFraser Görünüşe göre +x612 + karakter kodu anlamına gelir x. Kodun kodu 654, yani 612 + 54 = 666.
— fergusq

@EriktheOutgolfer Neim, Neim iki bayt kullanarak her üç hane sayısını ve birkaç dört hatayı temsil edebilir.
— Okx

2
@EriktheOutgolfer '\+*=100,356,612,868 (artı, aşağıdaki karakterin sırası )
— Jonathan Allan

7

Jöle , 10 9 bayt

@Dennis sayesinde% 10 indirim!

ÆRwÐf666Ṫ

Çevrimiçi deneyin!

açıklama

Æ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Ṁ
— Bay Xcoder

5
Kuyruğun (666'dan hemen sonra) haç gibi görünmesini seviyorum.
— kaine

4
wyerine çalışmalı ẇ@.
— Dennis,

@Dennis s / sh / w / elbette çalışır: p
— Outgolfer Erik

5

Pyth , 15 14 bayt

Dave'in yardımıyla 1 bayt kaydedildi .

Makinemde bellek hataları 969696ve daha yüksek şeyler var, ancak yeterli bellek verildiyse sorun yok.

ef&/`T*3\6P_TS

Burada deneyin ya da Test Suite'i inceleyin.


Nasıl?

ef & / `T * 3 \ 6P_TSQ - Sonunda örtük giriş (Q) bulunan tam program

             SQ - Aralık [1, Q]
 f - Filtre.
          P_T - Asal mı?
  & - Ve
   / `T * 3 \ 6 - 666 içerir.
e - Son eleman.
                - Sonuç olarak örtük bir şekilde çıktı alın.

Pyth , 14 bayt

ef/`T*\63fP_TS

Burada dene!


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

Sona çıkan Q'yu yanlışlıkla ekledim, 14
— Dave

"666"666 dizesini tanımlamanın daha az etkili bir yoludur*3\6
— Dave,


4

Bash + Core Utils, 51 49 Bayt

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

Komut satırı argümanını alır. Daha büyük sayılarla oldukça yavaş olabilir.


Bu, tüm "şeytan primleri" ni 6661'e çıkarır, ancak girişin altına en yakın olanı basmalıdır: çevrimiçi deneyin . Bir düzeltme sadece |head -1sonuna eklemek olacaktır.
— Justin Mariner

@JustinMariner lol, boğmaca, tamir
— markasoftware

4

Mathematica, 64 62 61 53 bayt

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

@KellyLowder sayesinde -1 bayt

@Notatree sayesinde -8 bayt (vay)

açıklama

Bir giriş yapın. Bu koşullar altında düşürüyoruz:

  • giriş asal değildir, VEYA

  • girişlerin rakamları arka arkaya üç 6 içermez.

Bunu bir Şeytan üstadı elde edinceye kadar tekrar ediyoruz.


2
Çok hoş. Sonunda bir _ daha kaybedersiniz, çünkü asal bir
— sayı

@KellyLowder iyi bir nokta
— JungHwan Min

1
Bu, karakter dizileri ile daha kısa:#//.i_/;!PrimeQ@i||ToString@i~StringFreeQ~"666":>i-1&
— Bir ağaç değil,

1
@ Notatree vay! Güzel!
— JungHwan Min


3

Japt , 14 bayt

õ fj w æ_sø666

Dene

Olarak orada gören olan bir% 50 zaman bazlı bir avantaj: tamamlar test durumda 969696yarım saniye altında.


açıklama

Tamsayının örtük girişi U.

õ

Gelen tamsayı dizisi oluşturmak 1için U.

fj

Süzgeç ( f) astarları.

w

Ters.

æ_

Aşağıdakileri 1kontrol eden bir işlevden geçirildiğinde (bu durumda ) bir gerçeği döndüren ilk öğeyi döndürün ...

sø666

Bir dizgeye ( s) dönüştürülen tam sayı ( ø) 666'yı içerir .


Daha Hızlı Alternatif, 15 bayt

Yine, başlangıçta zamana dayalı bir bonus olduğunu görünce, daha fazla golf oynayamayacağım alternatif ve daha hızlı bir çözüm var.

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

Dene


2

PowerShell , 128 bayt

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

Çevrimiçi deneyin!

PowerShell'de herhangi bir ana faktörlendirme yerleşik yok, bu yüzden bu, Prime Factors Buddies konusundaki cevabımın kodunu ödünç alıyor .

Girdi alıyoruz $n, sonra function fgirdi faktörlerini hesaplayan yeni bir ilan veriyoruz $a. Girdi $aasal ise, o zaman bu sadece dönecektir$a .

Programın ana kısmı sonsuz for()döngüdür. Eğer döngü içinde, biz kontrol $n -matchkarşı es 666olup olmadığı $n(yani asal $nait faktörlerin hepsini maçları $n). Öyleyse $n, boru hattına ve exitörtük çıktıyla yerleştiririz. Aksi takdirde, $n--döngüyü azaltır ve devam ettiririz.


Mayın sürümü aşağı kesilmiş ve sadece yarısını bayt sayısını vurmak başardı: D - codegolf.stackexchange.com/a/140539/571
— TessellatingHeckler

2

Python 2 , 77 76 bayt

Düzenleme: @ Mr.Xcoder sayesinde -1 bayt

Yavaş çalışma süresi 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)))

Çevrimiçi deneyin!

76 baytlık başka bir çözüm

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

Çevrimiçi deneyin!

İle SymPy 73 bayt

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

Çevrimiçi deneyin!


76 bayt: lambda x:max(q for q in range(x+1)if"666"in`q`*all(q%t for t in range(2,q)))- max()yerine[][-1]
— Bay Xcoder

2

PowerShell , 71 69 64 bayt

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

Çevrimiçi deneyin!

  • 328765 makinemde ~ 30 saniye sürüyor, ancak Tio.run'daki 60 saniye sınırını geçiyor.

  • 678987, ~ 1.5 dakika sürer.

  • 969696, ~ 4.5 dakika sürer.

Faktörleri yapmanın akıllı yolu.
— AdmBorkBork

2

MATL, 16 bayt

ZqP"@V'666'Xf?@.

MATL Online'da deneyin

açıklama

         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 bayt

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

Bu tam bir program!
Derlemek için Boost'a ihtiyacınız olacak. (Veya kopyalayıp en sevdiğiniz çevrimiçi C ++ kabuğuna yapıştırın.)
Komut satırından n değerini vererek çalıştırın . argüman olarak.

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

Rastgele sayı testi açısından kısayollar yapıldı. Orijinal kod 6661'de olası primerleri test etmeye başladı ve iki kat arttı. Ayrıca npos yerine orada (-1) olduğundan derleyici uyarısı alırsınız.

Yine de, bu oldukça hızlı bir şekilde çalışır. Eski AMD Sempron 130'umda 214 şeytan astarının hepsini 1.000.000'in altında bulmak sadece 40 saniye sürdü.

: ^ D



1

Python 3 , 85 83 80 bayt

Halvard'ın 4 bayt daha kısa çünkü Python 2'de yapıldı.

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

Çevrimiçi deneyin!

Biraz zaman verin, O(n^2)karmaşıklığı nedeniyle son derece yavaştır .


1

JavaScript (ES6), 55 54 bayt

@ ThePirateBay sayesinde -1 bayt.

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

Büyük girişlerde çok yavaş. Bu kod golf cevabına uyarlanmış asallık testi .

zamanlamalar

  • Giriş 10000 10 saniye sürdü
  • Giriş 328765 3 dakika sürdü
  • Giriş 678987 9 dakika sürdü
  • Giriş 96969616 dakika sürdü

Testler

Bunlardan bazıları tarayıcınızı birkaç dakika asacak.

Daha Hızlı Sürüm, 56 bayt

Her test vakasını bir saniyenin altında tamamlar.

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
Bunu asla yapmamalısın. Bu kod golf ve performans tamamen alakasız. Önceki 55 baytlık cevabınıza geri dönmenizi şiddetle tavsiye ederim. Ayrıca, değiştirerek 54 bayt bunu azaltabilir d==1ile d<2beri n>6661.

52 bayt: f=n=>/666/.test(n)&(g=d=>n%--d?g(d):d<2)(n)?n:f(n-1)ancak daha büyük sayılar için bir özyineleme hatası atacak.
— Shaggy,

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

1

Ruby, 67 , 66 , 58 , 56 bayt

İçin +7bayt içerir-rprime

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

Oldukça hızlı, ~2^52yaklaşık bir saniyede ve 2^645 dakikadan kısa sürede hesaplama değerleri (2011 MBP, Ruby 2.3.1).


1

Stax , 10 bayt

ü>:Ñb/VP6─

Koş ve hata ayıkla

Açıklama (paketlenmemiş):

^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

Güzel program. Stax denediğin için teşekkürler. Bilginize, bu gibi "Ayırıcı" seçeneğini kullanarak birden davaları yapmak da mümkündür , bu
— özyinelemeli

ah @recursive, thx
— Wastl

0

PHP , 148 bayt

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

Çevrimiçi deneyin!



0

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

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

Çevrimiçi deneyin!

  • Gereksiz parantez çıkarılarak 2 bayt kaydedildi.
  • intBildirimleri birleştirerek 3 bayt kurtardı .

Bunun daha kısa yapılabileceğine eminim; belki tekrar tekrar arayarak func fve dıştaki fordöngüyü kaldırarak .

Özyinelemeli Yaklaşım, 85 bayt

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

Çevrimiçi deneyin!

Func<int,int> f = nullİlki ayarlamak zorunda kaldığı için bu yaklaşımın kod-golf sınırlarına ne kadar uyduğundan emin değilim ve fbuna tekrar denir, ancak baytlara sayılmaz. Herhangi bir açıklama takdir edilecektir.

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.