Gere Primes Sexy

8

Primes sensuais são pares de números (n, m)como ne mambos são primos e m = n + 6.

Você precisa criar uma função que aceite um número inteiro, verifique se há primos sensuais de 0 a esse número inteiro e retorne uma matriz de matrizes.

Por exemplo, listSexy(30)deve retornar [[5,11], [7,13], [11,17], [13,19], [17,23], [23,29]]ou algo equivalente.

Isso é e o programa com o menor número de vitórias ganha!

Rohit
fonte
Você pode explicar como é o formato de saída desejado?
Howard
11
Bah, eu odeio quando o desafio muda depois que as respostas são enviadas.
Griffin
2
Existe uma certa razão para verificar a partir de 0? Por que não devo verificar em (5,11)? Uma breve definição de números primos sensuais deve ser fornecida aqui, ao mesmo tempo em que é necessário um link para a Wikipedia para leitura adicional.
usuário desconhecido
1
Em português, Sexy Primes se traduz no mesmo que Sexy Cousins!
Sergiol

Respostas:

11

MATLAB 32

i=1:n;i(isprime(i)&isprime(i+6))

n é o seu número

Griffin
fonte
1 Essa é a ferramenta certa para o trabalho: isprime. Não que o op pretendesse.
Johannes Kuhn
5

J, 34 33 31 32 39 37 caracteres

s=.[:(,.-&6)[:I.1([:*/p:)"1 i.,.6-~i.

Perdeu um personagem mantendo ambos os números primos abaixo do limite ... e outros 7 declarando uma função.

Uso:

   s 100
11  5
13  7
17 11
19 13
23 17
29 23
37 31
43 37
47 41
53 47
59 53
67 61
73 67
79 73
89 83

Editar

Parece que muitas das novas respostas não estão criando funções, aceitando ou limitando os dois números do par abaixo n- se eu ignorar essas restrições também, posso ter 28 caracteres :

(,.6&+)I.*/"1[1 p:(i.,.6+i.)
Gareth
fonte
5

Mathematica , 35

{#,#+6}&~Array~#~Cases~{__?PrimeQ}&
Mr.Wizard
fonte
3

GolfScript, 32 caracteres

~),2>{:P{(.P\%}do(!},:L{6+L?)},p

Como o formato de saída não foi especificado, o código acima imprimirá o prime mais baixo de cada par. Assim, um número xé incluído se xe x+6são primos e ambos estão abaixo n. A entrada é fornecida como número único no STDIN.

> 150
[5 7 11 13 17 23 31 37 41 47 53 61 67 73 83 97 101 103 107 131]
Howard
fonte
Eu acho que você deve imprimir os dois números primos. É uma parte da tarefa.
ugoren
1
@ugoren A tarefa foi alterada após o envio da minha versão. Vou tentar adicionar isso à minha versão em breve.
Howard
Sim, sua resposta corresponde à tarefa original.
ugoren
2

K3 / Kona , 45

{a@&6=(-).'a:,/a,\:/:a:&{(x>1)&&/x!'2_!x}'!x}

.

{a@&6=(-).'a:,/a,\:/:a:&{(x>1)&&/x!'2_!x}'!x}100
(11 5
 13 7
 17 11
 19 13
 23 17
 29 23
 37 31
 43 37
 47 41
 53 47
 59 53
 67 61
 73 67
 79 73
 89 83)

E a mesma solução na encarnação atual de K, que é idêntica à solução K3, exceto pelo fato de que ele não possui um operador mod embutido, que adiciona cerca de 14 caracteres por 59

{a@&6=(-).'a:,/a,\:/:a:&{(x>1)&&/{x-y*x div y}[x;2_!x]}'!x}
tmartin
fonte
2

Python ( 93 90 99 95)

Yay para isprimefunções rápidas e sujas !

a=lambda x:all(x%i for i in range(2,x));b=2
while b<input():
 b+=1
 if a(b)&a(b+6):print b,b+6
beary605
fonte
1em vez de Truevocê vai economizar de 3 caracteres ...
Wooble
Por que continuo perdendo isso? Fixo.
beary605
Você não recebe um parâmetro limite. Além disso, []em all()não é necessária (pelo menos em Python 2,7).
ugoren
Uau! Sério? Legal! Vou implementar o parâmetro
beary605
Não sei por que você subtrai 1 de x, mas você pode removê-lo por 2 caracteres. Em seguida, você pode substituir o loop while por um para loops de 2 a input () + 1 para outros 2 caracteres.
JPvdMerwe
1

Oitava 39

Modifiquei minha resposta do MATLAB para obedecer às novas regras (irritantes). né o seu valor.

p=@isprime;i=1:n;[j=i(p(i)&p(i+6));j+6]

Pode ser testado aqui

Griffin
fonte
1

C, 102 99 95 caracteres

Retornar uma matriz em C é algo que você tenta evitar. Portanto, a função sobtém o limite ne um ponteiro para uma matriz de números inteiros e a preenche com os dados. Cada par de primos sensuais é colocado em duas posições na matriz. Assim o[0]=5, o[1]=11, o[2]=7, o[3]=13. A função assume que a matriz é grande o suficiente.

x=7,l;
p(){
    return++l>=x/2||x*(x-6)%l&&p();
}
s(int n,int*o){
    for(;l=++x<=n;)p()?*o++=x-6,*o++=x:0;
}
Ugoren
fonte
1

R, 83 caracteres

f=function(n){library(gmp);p=isprime;for(i in 1:n)if(p(i)&p(i+6)){print(c(i,i+6))}}

Uso:

f(150)
Paolo
fonte
1

Ruby 75 74

A nova versão usa o método de teste principal do Artem Ice :

z=->x{(9..x).map{|i|[i-6,i]}.select{|a|a.all?{|r|(2...r).all?{|m|r%m>0}}}}

Teste online: http://ideone.com/yaOdn

Cristian Lupascu
fonte
1

Ruby, 99 88 86 84 82 78

f=->x{(9..x).map{|n|[n-6,n]if[n,n-6].all?{|t|(2...t).all?{|m|t%m>0}}}.compact}

Saída de amostra:

[[5, 11], [7, 13], [11, 17], [13, 19], [17, 23], [23, 29], [31, 37], [37, 43], [41, 47], [47, 53], [53, 59], [61, 67], [67, 73], [73, 79], [83, 89]]

defhlt
fonte
1

Python, 137 132 126 122 116

Sei que isso é um fracasso, mas é a minha primeira resposta, então por que não?

f=lambda x:not[y for y in range(2,x)if x%y==0]
i=30
print [(x,y)for x in range(i)for y in range(i)if f(x)&f(y)&x-6==y]

Usando compreensão de lista, bem como o fato de que [] = False

f(x)na verdade, retorna todos os fatores de x, e então você pode descobrir o que é primordial.

ACarter
fonte
Você pode transformar f(x)em f=lambda x:not[y for y in range(2,x)if x%y==0]para salvar alguns caracteres. Você também pode reduzir os ifs no final da compreensão da sua lista com f(x)&f(y)&(x-6==y).
beary605
@ beary605 Eu realmente não sei muito sobre lamdas (bem, eu não sei nada), então vou dar uma olhada nisso, mas sim, e não se.
ACarter
Um lambda é uma função anônima que retorna um valor. a=lambda x,y,z:(value here)é o mesmo que def a(x,y,z):return (value here).
beary605
Impressionante, parece que eu entendi. Atualizada. Obrigado!
ACarter
1

JavaScript (1 tweet = 140 caracteres)

Aqui está:

function t(n,i){for(i=2;i<n;i++)if(!(n%i))return!1;return!0}function s(n,p){for(p=[],i=2;i<n-6;i++)if(t(i)&&t(i+6))p.push([i,i+6]);return p}

Tente s(30).

Inkbug
fonte
1

J, 25 caracteres

(#~*/"1@p:~&1)(,+&6)"0 i.

i.n cria um intervalo de [0, n)

(,+&6)"0pega cada número inteiro nna lista e faz um parn, n+6

(#~ condition)é basicamente um filter, e a condição, neste caso */"1@p:~&1, apenas verifica se um par é composto apenas por números primos.

racionalis
fonte
1

C # (279 caracteres)

Basicamente, é a solução da Saumil com alguns ajustes. Não tenho reputação suficiente para comentar, então ...

using System;namespace X{public class P{static int l=100;static void Main(){F(0);}static bool I(int n){bool b=1>0;if(n==1){b=1<0;}for(int i=2;i<n;++i){if(n%i==0){b=1<0;break;}}return b;}static void F(int p){if((p+6)<=l){if(I(p+6)&&I(p)){Console.WriteLine(p+6+","+p);}F(p+1);}}}}

Resultado:

11,5
13,7
17,11
19,13
23,17
29,23
37,31
43,37
47,41
53,47
59,53
67,61
73,67
79,73
89,83
Scapegrace
fonte
0

Perl: 73 char

sub p{(1x$_[0])!~/^(11+?)\1+$/}map{$x=$_+6;p($_)&&p($x)&&say"$_,$x"}2..<>

uso:

echo 30 | perl -E 'sub p{(1x$_[0])!~/^(11+?)\1+$/}map{$x=$_+6;p($_)&&p($x)&&say"$_,$x"}2..<>'

resultado:

5,11
7,13
11,17
13,19
17,23
23,29
Toto
fonte
0

C # 295

using System;using System.Linq;namespace K{class C{public static void Main(string[]a){Func<int,bool>p=i=>Enumerable.Range(2,i-3).All(x=>i%x>0);Console.WriteLine("["+String.Join(",",Enumerable.Range(0,int.Parse(a[0])).Where(i=>i>9&&p(i)&&p(i-6)).Select(i=>"["+(i-6)+","+i+"]").ToArray())+"]");}}}

Teste online: http://ideone.com/4PwTW (neste teste, substituí int.Parse(a[0])pelo valor int real, pois não posso fornecer argumentos de linha de comando para programas executados em ideone.com)

Cristian Lupascu
fonte
0

Mathematica - 69 48 caracteres

Supondo que m tenha sido atribuído um valor

p=PrimeQ;Cases[Range@m,n_/;p@n&&p[n+6]:>{n,n+6}]
DavidC
fonte
0

Scala (82)

def p(n:Int)=9 to n map(x=>List(x-6,x))filter(_.forall(l=>2 to l-1 forall(l%_>0)))

Saída de amostra: Vector(List(5, 11), List(7, 13), List(11, 17), List(13, 19), List(17, 23), List(23, 29), List(31, 37), List(37, 43), List(41, 47), List(47, 53), List(53, 59), List(61, 67), List(67, 73), List(73, 79), List(83, 89))

defhlt
fonte
0

Fator 140

Essa linguagem é divertida e interessante. Meu primeiro roteiro.

:: i ( n -- ? )
n 1 - 2 [a,b] [ n swap mod 0 > ] all? ;
:: s ( n -- r r )
11 n [a,b] [ i ] filter [ 6 - ] map [ i ] filter dup [ 6 + ] map ;

Uso:

( scratchpad ) 100 f

--- Data stack:
V{ 5 7 11 13 17 23 31 37 41 47 53 61 67 73 83 }
V{ 11 13 17 19 23 29 37 43 47 53 59 67 73 79 89 }
defhlt
fonte
0

PARI / GP (62 caracteres)

f(a)=w=[];forprime(x=0,a,isprime(x+6)&w=concat(w,[[x,x+6]]));w

Exemplo:

 (00:01) gp > f(a)=w=[];forprime(x=0,a,isprime(x+6)&w=concat(w,[[x,x+6]]));w
 (00:01) gp > f(30)
 %1 = [[5, 11], [7, 13], [11, 17], [13, 19], [17, 23], [23, 29]]
Yury
fonte
0

C # ( 321 303 290 caracteres)

using System;namespace X{public class P{ static int l=100;static void Main(){F(0);}static bool I(int n){bool b=true;if(n==1){b=false;}for(int i=2;i<n;++i){if(n%i==0){b=false;break;}}return b;}static void F(int p){if((p+6)<=l){int m=p+6;if(I(m)&&I(p)){Console.WriteLine(m+","+p);}F(p+1);}}}}

Produto:
11,5
13,7
17,11
19,13
23,17
29,23
37,31
43,37
47,41
53,47
59,53
67,61
73,67
79,73
89,83

Saumil
fonte
Bem-vindo ao CodeGolf! Você pode salvar alguns caracteres se der nomes de uma letra à classe e aos métodos (ex: em class Pvez de class Program).
Cristian Lupascu
0

Haskell (65 caracteres)

p n=[(x,x+6)|x<-[3..n-6],all(\k->all((>0).mod k)[2..k-1])[x,x+6]]

A saída:

Prelude> p 100
[(5,11),(7,13),(11,17),(13,19),(17,23),(23,29),(31,37),(37,43),(41,47),(47,53),(
53,59),(61,67),(67,73),(73,79),(83,89)]

Sobre a resposta do MATLAB aqui:

(Eu gastei todo o meu representante em uma recompensa, então ainda não posso comentar) . O Google diz: "a função isprime do Matlab ... é baseada no probabilístico Miller-Rabin". Portanto, parece que a entrada do MATLAB deve ser desqualificada.

Will Ness
fonte
0

R 85 81 caracteres

f=function(n){m=2:n;a=m[rowSums(!outer(m,m,`%%`))<2];cbind(b<-a[(a+6)%in%a],b+6)}

Exemplo de execução:

f(50)
      [,1] [,2]
 [1,]    5   11
 [2,]    7   13
 [3,]   11   17
 [4,]   13   19
 [5,]   17   23
 [6,]   23   29
 [7,]   31   37
 [8,]   37   43
 [9,]   41   47
plannapus
fonte
0

PHP, 106 bytes

function p($n){for($i=$n;--$i&&$n%$i;);return$i-1;}for(;++$i<$argv[1]-5;)p($i)|p($k=$i+6)?:print"$i,$k\n";

programa imprime pares como n,n+6 delimitados por quebras de linha. Corra com -r.

Modifiquei minha função is_prime (e salvei um byte) para que ela retorne 0para primos para jogar golfe no Elvis.

Titus
fonte
0

Gelatina , 13 bytes (não concorrente)

‘Ḷµż+6$ÆPẠ$Ðf

Experimente online!

Explicação aprimorada:

‘Ḷµż+6$ÆPẠ$Ðf Main link. Arguments: z.
‘Ḷ            Range: [0..z].
  µ           Start a new monadic chain.
    +6        Add 6 to each element of x. (implicit x=⁸).
      $       Last two links (+6) as a monad.
   ż          Interleave x and y.
       ÆP     Do a primality check every element of every element of z.
         Ạ    Do an "all" check on every element of z.
          $   Last two links as a monad.
           Ðf Keep the elements of z that return a truthy value given this monad.
Erik, o Outgolfer
fonte
-3

Caracteres Obj-C 64

if([self isPrime:i]&&[self isPrime:i+6])NSLog(@"%d %d\n",i,i+6);

isPrime implementado separadamente

akshay1188
fonte
6
Se você estiver declarando uma função isPrimeque não faz parte do idioma ou da biblioteca padrão, inclua a contagem de caracteres dessa função como parte da sua pontuação.
Gareth