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.