Ponha-se atrás de mim, Satanás-Prime!

22

Satanás-Primes

quem são eles?
eles estão Primescontendo 666
estes são Satanás-Primes: [46663,266677,666599,666683,616669]
estes NÃO são :[462667,665669,36363631,555]

Enredo

Todo número maior que 6661 tem Satanás-Primes atrás dele

O desafio

Dado um número inteiro, n>6661encontre o Satan-Prime atrás (ou igual) e mais próximo de si.

Exemplos

Integer n=30000tem 3 Satan-Primes (SP) por trás dele: [6661, 16661, 26669].
Seu código deve retornar 26669qual é o mais próximo por trás dele

Casos de teste

Entrada-> Saída

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

Regras

Seu código deve funcionar para qualquer um nno intervalo do seu idioma.

Isso é , então a resposta mais curta em bytes vence!

Shaggy
fonte
1
defina "cerca de um minuto". É + - 30 segundos? Pessoalmente, penso que 30 minutos e um minuto não diferem tanto assim ... Também bônus são geralmente desaprovado ... também eu acho que isso pode ter sido melhor como um output the nth satan primedesafio ...
socrático Phoenix
ok ok pessoal ... o bônus será removido ...
Espero que você não se importe com a edição que fiz do título do desafio.
Shaggy
3
@ Shaggy Em que ponto a mudança de título serve ...?
Conor O'Brien
3
@ ConorO'Brien Rimando e parecendo arcaico, presumo.
precisa saber é o seguinte

Respostas:

7

Mathematica, 82 bytes

Last@Select[Prime@Range@PrimePi@#,!FreeQ[Subsequences[IntegerDigits@#],{6,6,6}]&]&
J42161217
fonte
Espere, você quer dizer que não há um built-in para este?
Fund Monica's Lawsuit
7

Neim , 9 bytes

>ͻ:D+6S𝕚÷

Explicação:

>         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

Experimente online!

Okx
fonte
Então, há realmente um builtin para pressionar "66 anexado a um dígito"? O_O Neim progrediu.
Erik the Outgolfer
1
Como +6push 666? Ou Neim é apenas esse metal?
Robert Fraser
6
@RobertFraser Aparentemente +xsignifica 612 + código de x. O código de 6passa a ser 54, então 612 + 54 = 666.
Fergusq
@EriktheOutgolfer Bem, Neim pode representar todos os números de três dígitos e alguns quatro dígitos usando dois bytes.
Okx 26/08/17
2
@EriktheOutgolfer '\+*=100,356,612,868 (mais o ordinal do caractere a seguir) #
Jonathan Allan
7

Geléia , 10 9 bytes

Economize 10% graças a @Dennis!

ÆRwÐf666Ṫ

Experimente online!

Explicação

Æ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)
nmjcman101
fonte
Alternativa:ÆRẇ@Ðf666Ṁ
Sr. Xcoder
5
Eu amo que a cauda (logo após 666) parece uma cruz.
kaine
4
wdeve funcionar em vez de ẇ@.
Dennis
@ Dennis s / sh / w / é claro que funciona: p
Erik the Outgolfer
5

Pitão , 15 14 bytes

Guardou 1 byte com a ajuda de Dave .

Erros de memória 969696e qualquer coisa maior na minha máquina, mas tudo bem se receber memória suficiente.

ef&/`T*3\6P_TS

Experimente aqui ou confira o Conjunto de Testes.


Quão?

ef & / `T * 3 \ 6P_TSQ - Programa completo, com entrada implícita (Q) no final

             SQ - Intervalo [1, Q]
 f - filtro.
          P_T - É primo?
  & - E
   / `T * 3 \ 6 - Contém 666.
e - último elemento.
                - Saída implícita do resultado.

Pitão , 14 bytes

ef/`T*\63fP_TS

Experimente aqui!

Mr. Xcoder
fonte
14 bytes:ef&/`T*3\6P_TS
Dave
Eu adicionei o final Q por engano, é 14
Dave
"666"é uma maneira menos eficiente de descrever a string 666 que é #*3\6
Dave
4

Bash + Core Utils, 51 49 bytes

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

Leva argumento de linha de comando. Pode ser bastante lento com números maiores.

markasoftware
fonte
Isso gera todos os "números primos de satanás" para 6661, mas deve ser impresso apenas o mais próximo abaixo da entrada: experimente online . Uma correção seria apenas adicionar |head -1ao final.
23717 Justin Mariner
@JustinMariner lol,
oops
4

Mathematica, 64 62 61 53 bytes

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

-1 byte graças a @KellyLowder

-8 bytes (uau) graças a @Notatree

Explicação

Pegue uma entrada. Nós o diminuímos sob estas condições:

  • a entrada não é primária, OU

  • os dígitos das entradas não contêm três 6s seguidos.

Repetimos isso até que um primo de Satanás seja alcançado.

JungHwan Min
fonte
2
Muito agradável. Você pode perder mais um _ no final uma vez que um nobre não pode terminar em 6.
Kelly Lowder
@KellyLowder good point
JungHwan Min 26/08
1
Isto é ainda mais curto com cordas:#//.i_/;!PrimeQ@i||ToString@i~StringFreeQ~"666":>i-1&
Não uma árvore
1
@Notatree wow! legais!
JungHwan Min 26/08/17
3

Perl 5 , 47 bytes

46 bytes de código + 1 para -p

{$f=0|sqrt;1while$_%$f--;/666/*!$f||$_--*redo}

Experimente online!

Xcali
fonte
3

Japonês , 14 bytes

õ fj w æ_sø666

Teste-o

Visto que não era um bónus baseado no tempo de 50%: caso teste é concluído 969696em menos de meio segundo.


Explicação

Entrada implícita de número inteiro U.

õ

Gere uma matriz de números inteiros de 1até U.

fj

O filtro ( f) inicia.

w

Marcha ré.

æ_

Retorne o primeiro elemento que retorna um valor de verdade (neste caso 1) quando passado por uma função que verifica se ...

sø666

O número inteiro convertido em uma string ( s) contém ( ø) 666.


Alternativa mais rápida, 15 bytes

Novamente, visto que havia originalmente um bônus baseado no tempo, aqui está uma solução alternativa e muito mais rápida, que eu não consigo mais jogar golfe.

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

Teste-o

Shaggy
fonte
2

PowerShell , 128 bytes

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

Experimente online!

O PowerShell não possui nenhum fator de fatoração principal incorporado, portanto, isso empresta o código da minha resposta no Prime Factors Buddies .

Tomamos informações $ne declaramos uma nova function fque calcula os fatores de entrada$a . Se a entrada $afor prime, isso retornará apenas $a.

A parte principal do programa é o for()loop infinito . Dentro do loop, verificamos se $n -matches contra 666e se $né primo (ou seja, $ncorresponde a todos os fatores de $n). Se for, colocamos $nno pipeline e exit, com saída implícita. Caso contrário, decrementamos $n--e continuamos o loop.

AdmBorkBork
fonte
Aparadas versão mina para baixo e apenas conseguiu acertar a metade da sua contagem de bytes: D - codegolf.stackexchange.com/a/140539/571
TessellatingHeckler
2

Python 2 , 77 76 bytes

Edit: -1 byte graças a @ Mr.Xcoder

Tempo de execução lento, é executado em 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)))

Experimente online!

Outra solução de 76 bytes

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

Experimente online!

Com o SymPy 73 bytes

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

Experimente online!

Halvard Hummel
fonte
76 bytes: lambda x:max(q for q in range(x+1)if"666"in`q`*all(q%t for t in range(2,q)))- use em max()vez de[][-1]
Mr. Xcoder
2

PowerShell , 71 69 64 bytes

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

Experimente online!

  • 328765 leva ~ 30 segundos na minha máquina, mas atinge o tempo limite de 60 segundos no Tio.run.

  • 678987 leva ~ 1,5 minutos.

  • 969696 leva ~ 4,5 minutos.
TessellatingHeckler
fonte
Maneira inteligente de fazer os fatores.
AdmBorkBork
2

MATL, 16 bytes

ZqP"@V'666'Xf?@.

Experimente no MATL Online

Explicação

         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
Suever
fonte
2

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

Este é um programa completo!
Você precisará do Boost para compilá-lo. (Ou copie e cole no seu shell C ++ online favorito.)
Execute-o na linha de comando, fornecendo n como argumento.

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

Atalhos foram feitos em termos de teste de número aleatório. O código original começou a testar possíveis números primos em 6661 e aumentou em dois. Você também receberá um aviso do compilador por causa disso (-1), em vez de npos.

Ainda assim, isso é executado rapidamente. Foram necessários apenas 40 segundos para encontrar todos os 214 satan primos abaixo de 1.000.000 no meu antigo AMD Sempron 130.

: ^ D

Dúthomhas
fonte
2

Pacote Bash + bsd-games, 33

  • 2 bytes salvos graças a @FedericoPoloni.
primes 2 $[$1+1]|grep 666|tail -1

Experimente online .

Trauma Digital
fonte
Você pode salvar 1 byte se substituir os dois últimos comandos por tail -n1.
Federico Poloni 26/08
@FedericoPoloni duh - não acredito que esqueci tailaqui. De fato, tail -1é ainda menos 1.
Digital Trauma
1

Python 3 , 85 83 80 bytes

O de Halvard é 4 bytes mais curto porque é feito em 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)))

Experimente online!

Reserve um tempo, é extremamente lento devido à sua O(n^2)complexidade.

Mr. Xcoder
fonte
1

JavaScript (ES6), 55 54 bytes

-1 byte graças a @ThePirateBay.

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

Muito lento com entradas grandes. Teste de primazia adaptado a partir deste código resposta de golfe .

Horários

  • A entrada 10000levou 10 segundos
  • A entrada 328765levou 3 minutos
  • A entrada 678987levou 9 minutos
  • A entrada 969696levou 16 minutos

Testes

Alguns deles travarão o navegador por vários minutos.

Versão mais rápida, 56 bytes

Conclui cada caso de teste em menos de um segundo.

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

Justin Mariner
fonte
2
Você nunca deve fazer isso. Isso é código de golfe e o desempenho é totalmente irrelevante. Eu sugiro que você volte à sua resposta anterior de 55 bytes. Além disso, você pode reduzi-lo para 54 bytes, substituindo d==1por d<2since n>6661.
52 bytes: f=n=>/666/.test(n)&(g=d=>n%--d?g(d):d<2)(n)?n:f(n-1)mas gerará um erro de recursão para números maiores.
Shaggy
f=n=>/666/.test(d=n)-eval("while(n%--d);d")?f(n-1):n
l4m2
1

Ruby, 67 , 66 , 58 , 56 bytes

Inclui +7bytes para-rprime

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

É muito rápido, computando valores de até ~2^52um segundo e 2^64em menos de 5 minutos (2011 MBP, Ruby 2.3.1).

Michael Klein
fonte
1

Stax , 10 bytes

ü>:Ñb/VP6─

Execute e depure

Explicação (sem embalagem):

^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
wastl
fonte
Bom programa. Obrigado por experimentar o stax. Para sua informação, também é possível executar vários casos usando a opção "Separador" como esta
recursiva
@recursive ah, thx
wastl
0

PHP , 148 bytes

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

Experimente online!

Mic1780
fonte
0

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

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

Experimente online!

  • 2 bytes salvos removendo chaves desnecessárias.
  • 3 bytes salvos combinando intdeclarações.

Tenho certeza de que isso poderia ser reduzido; talvez chamando func fe removendo recursivamente o forloop externo .

Abordagem recursiva, 85 bytes

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

Experimente online!

Não tenho certeza de quão bem essa abordagem se encaixa nos limites do código-golfe devido à necessidade de definir a Func<int,int> f = nullprimeira, e isso fé chamado novamente, mas não é contabilizado em bytes. Qualquer esclarecimento seria apreciado.

Ayb4btu
fonte