Transpuesto, primos, ¡ay!

15

La tarea es simple: su programa lee un número entero como entrada e imprime si es primo o no. Puede imprimir "sí / no", "verdadero / falso" o cualquier cosa que identifique inequívocamente el resultado.

El desafío es que el código tiene que funcionar con sus filas y columnas transpuestas.

Para excluir la solución obvia (la solución "simple" más corta repetida verticalmente char-by-char con el uso de comentarios), la métrica es un poco diferente del código de golf habitual:

Debido a que el formato es muy importante en este desafío , el tamaño del código se mide en el área del rectángulo más pequeño en el que se ajusta el código. En otras palabras, el espacio en blanco sí cuenta y las líneas deben rellenarse para que tengan la misma longitud (no tiene que hacerlo cuando publique la solución, por simplicidad). Por ejemplo

int main()   
{            
    return 0;
}            

tendría un tamaño de 4 * 13 = 52 (y obviamente no se ajusta a ninguno de los dos criterios: detección principal y transposición).

El tamaño más pequeño gana.

Puede usar cualquier idioma y cualquier función de biblioteca, excepto si el único propósito de esa función es encontrar, generar o detectar números primos.

Editar:

Si bien el ganador probablemente sería la solución Golfscript, ¡otorgaré una recompensa de 50 puntos por la mejor solución C o C ++!

vsz
fuente
La métrica de su rectángulo no desalienta la solución obvia; mejor sería tomar la longitud lateral más larga. Sin embargo, esto reduciría la respuesta GS a tener puntuación de 4.
boothby
Tienes razón. El siguiente problema transpuesto debería tener una métrica diferente y prohibir soluciones simétricas. Sin embargo, creo que incluso entonces habrá alguien que eluda las reglas o al menos encuentre una solución que el control de calidad no esperaba al componer las reglas.
vsz

Respuestas:

7

GolfScript, 13 × 1

~.,2>{1$\%!}?

¡GolfScript ataca de nuevo!

Repite la entrada si es primo; de lo contrario, imprime la entrada concatenada con su divisor adecuado más pequeño. Sí, sé que eso está ampliando la definición de "cualquier cosa que identifique inequívocamente el resultado", pero hacer algo más elegante costaría unos pocos caracteres adicionales. Si desea una salida más agradable, agregar los tres caracteres ;]!al código produce 1primos y 0números compuestos.

El algoritmo es realmente ineficiente, solo la división de prueba de fuerza bruta de 2 a n −1. La mayoría de los operadores de GolfScript son solo caracteres individuales, por lo que este código funciona igual de bien transpuesto. Sin embargo, molestamente, el operador de asignación :no permite espacios en blanco entre sí y su objetivo, por lo que tuve que hacer esto completamente sin variables.

Ilmari Karonen
fuente
Wrt "cualquier cosa más elegante costaría unos pocos caracteres extra" - puede obtener un booleano estilo GolfScript por solo 2.
Peter Taylor
@ Peter: ¿Te refieres a algo como mi edición anterior, solo sin el !? ¿O tenías algo más elegante en mente?
Ilmari Karonen
1
Estaba pensando )antes ,para que siempre encuentre un divisor y =al final.
Peter Taylor
:seguido de nueva línea, se asigna al carácter de nueva línea, por lo que no es que el espacio en blanco no esté permitido, es solo que el espacio en blanco es lo que se le asigna
gnibbler
@gnibbler: Técnicamente, ambos tenemos razón. :no permite espacios en blanco, o cualquier otra cosa , entre sí y su objetivo: lo que sea que lo siga inmediatamente, ya sea espacio en blanco o cualquier otro token (sí, incluso números, cadenas o bloques de código), es a lo que se le asigna. Sin embargo, la documentación oficial advierte específicamente sobre el espacio en blanco, y por una buena razón, ya que en la mayoría de los otros lugares, agregar espacios en blanco entre los tokens en GolfScript no hace nada (normalmente, a menos que se haya asignado a ...).
Ilmari Karonen
21

C, 2 * 70 2 * 60

Imprime ypara primos, nada de lo contrario.
EDITAR : Se modificó el código para guardar 10 caracteres. Debe ejecutarse sin parámetros (así m=1).

main(m,n){for(scanf("%d",&n);n%++m&&n>1;);n-m||puts("y");}/*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ 

El método para manejar la transposición es bastante genérico y puede aplicarse a cualquier programa.
Se basa en convertir esto:

abcd/*
\\\\*/

A esto:

a\
b\
c\
d\
/*
*/

Y ambos significan simplemente abcd.

Ugoren
fuente
wow, mal uso inteligente de la concatenación de líneas :)
vsz
2
Este es un sitio de golf / rompecabezas. No existe el mal uso.
stand
2
@ Boothby, supongo que se refiere al abuso. Pero no discuto con cumplidos.
ugoren
14

C - 13x13

Lee la entrada de stdin e imprime a 1for prime y a 0for not prime.

////m(i;(a=)<
////aans")a;2
//:Di)tc%;;p)
//O n{ adfau+
main//bn"o%t4
(a){///f,r-c8
int b///&(-h)
;scanf///bba;
("%d",&///;r}
a);for(b///( 
=a;a%--b;//( 
);putchar((b 
<2)+48);}    

editar: compila con gcc y clang ahora, otros compiladores no fueron probados

cuasimodo
fuente
12

C, 12x12 caracteres

Una solución bidimensional, a diferencia de mi otra respuesta , basada en el mismo código (y al igual que, imprime ypara prime, nada para composite).
La estructura es similar a la respuesta de Quasimodo , pero mi código es más corto y creo que mi uso de comentarios es un poco más eficiente, por lo que puedo ajustar 12x12.

////m()s";np
////am{c%n>u
////i,fad%1t
////nnon"+;s
main//rf,+)(
(m,n//((&m;"
){for(//n&ny
scanf(//)&-"
"%d",&n)//m)
;n%++m&&//|;
n>1;);n-m|| 
puts("y"); }
Ugoren
fuente
7

Perl, 14 x 14

Creo que me estoy acostumbrando a esto. Especifique el número como argumento de línea de comando, salidas 0o 1. Probablemente más margen de mejora.

$   n=pop;$p|=
 !  ($n%$_)for
  2 ..$n/2;   
   print!$p+m~
n(.r          
=$.i          
pn$n          
o%nt          
p$/!          
;_2$          
$);p          
pf +          
|o m          
=r ~          
multitud
fuente
3

Q

Comentarios maltratados para una solución simétrica de carácter ineficiente.

/{/////////////////////////////////
{(~)any 0=mod[x;2+(!)x-2]}"I"$(0:)0
/~
/)
/a
/n
/y
/ 
/0
/=
/m
/o
/d
/[
/x
/;
/2
/+
/(
/!
/)
/x
/-
/2
/]
/}
/"
/I
/"
/$
/(
/0
/:
/)
/0

Toma información de STDIN, devuelve un booleano.

skeevey
fuente
Noté el sqrtde allí. Al buscar números primos en code-golf, generalmente es ventajoso dividir (derrochador) hasta n en lugar de detenerse en sqrt n.
gnibbler
Muy cierto, gracias. Todavía no he tenido la oportunidad de intentar obtener una mejor puntuación.
skeevey
Debe incluir una puntuación en su respuesta
FlipTack,
2

Gelatina , cuadrado 2x2

PÆ
ÆP

Pruébalo en línea!

Creo que tengo la parte de transposición correcta, y si es así, la versión transpuesta de esto es

PÆ
ÆP

Pruébalo en línea!

(que es el mismo código)

caird coinheringaahing
fuente
44
Esto es válido: " Se puede utilizar cualquier lenguaje, y cualquier función de biblioteca , excepto si el único propósito de esta función es encontrar, generar o detectar números primos . "
Kevin Cruijssen
1

05AB1E , 1x5 1x3 ( 5 3 bytes )

Este no es un gran programa; cada línea es un programa alternativo separado para abordar el primer cheque (sin usar el primo incorporado).

ÑPQ
ÒgΘ
ÒQP
ÕαΘ
fQO
fs¢
f`Q

-2 bytes gracias a Grimy .

Los espacios en blanco entre líneas son no-ops en 05AB1E, y dado que solo uso comandos de 1 byte, esto funciona bien después de la transposición.

Salidas 1/ 0para veracidad / falsey respectivamente.

Pruebe el primero en línea o verifique algunos casos de prueba más para todos ellos (con eval incorporado .V) .
Transpuesto: pruebe el primero en línea .

Explicación:

Ñ    # Get a list of all divisors of the (implicit) input-integer
     # (which would be only 1 and the integer itself for primes)
 P   # Take the product of that list
  Q  # And check if it's equal to the (implicit) input-integer

Ò    # Get a list of all prime factors of the (implicit) input-integer 
 g   # Get the amount of those prime factors by taking the length of the list
  Θ  # Check if that's equal to 1 (so only itself is a prime factor)

Ò    # Get a list of all prime factors of the (implicit) input-integer including duplicates
 Q   # Check for each if it's equal to the (implicit) input-integer
     # (1 if truthy; 0 if falsey)
  P  # Take the product of those checks (resulting in either 1 or 0 as well)

Õ    # Get the Euler totient of the (implicit) input-integer
 α   # Take the absolute difference with the (implicit) input-integer
  Θ  # Check if that's equal to 1

f    # Get a list of all prime factors of the (implicit) input-integer without duplicates
 Q   # Check for each if it's equal to the (implicit) input-integer
  O  # And take the sum of that (resulting in either 1 or 0)

f    # Get a list of all prime factors of the (implicit) input-integer without duplicates
 s   # Swap to get the (implicit) input-integer
  ¢  # And count how many time it occurs in the list

f    # Get a list of all prime factors of the (implicit) input-integer without duplicates
 `   # Dump all the content of this list onto the stack
  Q  # Check if the top two values are equal, or if only a single value is present, it will
     # use the (implicit) input-integer as second value

     # For all these program the same applies at the end:
     # (implicitly output the result with trailing newline)

NOTA: Si solo un valor verdadero / falso es válido, y no necesariamente tiene que ser distinto, ya sea Ògo Õαpodría usarse como 2 bytes válidos, ya que solo 1es verdadero en 05AB1E, y todo lo demás es falso: Pruebe ambos ellos para algunos casos de prueba .

Si se permitieran las incorporaciones, una sola phubiera sido suficiente: Pruébelo en línea o verifique algunos casos de prueba más .

Kevin Cruijssen
fuente
1
ÑPQo ÒgΘo ÒQPpara 3 bytes. ( Ñy Òambos tienen propósitos distintos a "encontrar, generar o detectar números primos", por lo que no están incluidos en la prohibición, según mi lectura).
Grimmy
1
Más de 3 byters: ÕαΘ, fQO, fs¢,f`Q
Grimmy
@ Grimy Ah, no puedo creer que no haya pensado en los divisores o en los factores primos incorporados ... Respondí demasiado rápido, supongo. Õα¡Sin embargo, no sabía nada ! Esa es una muy buena.
Kevin Cruijssen
0

Python 3 , tamaño 28 x 28

lambda i:i>1 and           \
all(i%j for j in range(2,i))
ml="""                     "
b("                        "
di"                        "
a%"  
 j   
i    
:f   
io   
>r   
1    
 j   
a    
ni   
dn   
     
 r   
 a   
 n   
 g   
 e   
 (   
 2   
 ,   
 i   
 )   
\)"""

Pruébalo en línea!

Joel
fuente
0

APL (Dyalog Unicode) , 10x11

{⍵∊∘.×⍨1↓⍳⍵          
           
           
 .          
 ×          
           
 1          
           
           
          }

Pruébalo en línea!

Se corrigió la función para cumplir con las especificaciones. Gracias @ Adám por el aviso.

Devuelve 0 para verdad, 1 para falsedad .

Cómo

{⍵∊∘.×⍨1↓⍳⍵  Dfn. everything below this is a noop up until closing the brace
         ⍳⍵  Range [1..arg]
       1    Dropping the first element (yields [2..arg])
   ∘.×⍨      Multiplication table for each element in the vector
 ⍵∊          Check if the argument is in the table.

La versión transpuesta es exactamente la misma.

J. Sallé
fuente