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!


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

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!


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)

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!


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.


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.


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

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


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.


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!


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.

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

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



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.


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


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


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

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!



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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.