Una prueba principal que es LITERALMENTE excelente


23

Escriba un programa que pruebe la primalidad de un número específico y dé la salida como un valor booleano (True es primo). Su prueba principal puede (pero no tiene que ser) válida para el número 1.

Aquí está el truco: su propio programa tiene que sumar un número primo. Convierta todos los caracteres (incluidos los espacios) a su valor Unicode / ASCII ( tabla ). Luego, sume todos esos números para obtener la suma de su programa.

Por ejemplo, tome este programa no tan bueno que escribí en Python 3.3:

q=None
y=int(input())
for x in range(2,int(y**0.5)+1):
    if y%x==0:
        q=False
if not q:
    q=True
print(q)

Si convierte todos los caracteres a su valor Unicode / ASCII correspondiente, obtendrá:

113 61 78 111 110 101 10 121 61 105 110 116 40 105 110 112 117 116 40 41 41 10 102 111 114 32 120 32 105 110 32 114 97 110 103 101 40 50 44 105 110 116 40 121 42 42 48 46 53 41 43 49 41 58 10 32 32 32 32 105 102 32 121 37 120 61 61 48 58 10 32 32 32 32 32 32 32 32 113 61 70 97 108 115 101 10 105 102 32 110 111 116 32 113 58 10 32 32 32 32 113 61 84 114 117 101 10 112 114 105 110 116 40 113 41 

Luego puede encontrar la suma de esos números manualmente o con su propio programa. Este programa específico suma 8293, que es un número primo.

Por supuesto, este es Code Golf, por lo que cuanto más pequeño pueda hacer su programa, mejor. Como lo señalaron otros usuarios, este programa no es muy deportivo.

Algunas reglas:

Las entradas válidas incluyen STDIN y mensajes (sin funciones, es solo una forma de agregar código adicional gratuito). Se permiten espacios, pero solo si son cruciales para la funcionalidad de su programa. La salida debe ser una salida, no solo almacenada en una variable o devuelta (use print, STDOUT, etc.)

Las banderas se pueden usar y se deben contar literalmente, no expandidas. No se permiten comentarios. En cuanto a los caracteres no ASCII, deben asignarse al valor en su codificación respectiva.

Asegúrese de enumerar el tamaño de su programa y la suma del programa. Probaré para asegurarme de que los programas sean válidos.

¡Buena suerte!

Aquí hay un fragmento para contar la suma de su programa y verificar si es primo:


12
En los idiomas que no son de golf, parece que podría tomar el código de decisión primo más corto y ajustar los nombres de las variables hasta que la suma sea primo.
xnor

55
¿Por qué las restricciones en E / S?
Jonathan Allan el

2
¿Qué es un "valor de Unibyte"?
aditsu

55
Hablas de personajes y páginas de códigos. Un carácter Unicode siempre tiene el mismo punto de código, sin importar qué codificación se use para representarlo. En cuanto a los caracteres no ASCII, deben asignarse al valor en su codificación respectiva. me hace pensar que realmente desea la suma de los bytes valores a ser primer
Dennis

Respuestas:




6

Microscript II, 2 bytes (suma 137)

N;

Microscript II, 4 bytes (suma 353)

N;ph

De hecho, estoy bastante sorprendido de que ambos hayan tenido sumas de bytes primos.



4

Pyth, 2 bytes, 127

/P

Pruébalo en línea

Salidas 1para primos, 0para no primos.

/Tiene punto de código 47. PTiene punto de código 80.

Cómo funciona:

/P
/PQQ    Implicit variables.
        Q = input
 PQ     Prime factorize Q.
/  Q    Count how many times Q appears. 1 if prime, 0 if not.

4

Haskell, 52 bytes, 4421

main=do
 k<-readLn
 print$product[1..k-1]`rem`k==k-1

Teorema de Wilson.


2
Lo convirtió en un programa completo e independiente.
fquarp

La ::IO Intrealidad no debería ser necesario a menos que ese es el camino más corto se puede obtener una suma de primera.
Ørjan Johansen

Buena llamada. Sin embargo, luego obtenemos algo de código que se convierte en un valor par. Agregar espacios o nuevas líneas no hace nada (incluso valores), ni tampoco cambia el nombre de la variable (aparece cuatro veces, por lo que reemplazar su código (digamos c) equivale a restar 4 * c y sumar 4 * c ', dejando el . sum incluso Sin embargo, puede ser ajustado al romper las líneas y aún así ser más corto, lo que hice.
fquarp

1
47 bytes con una prueba de primalidad diferente: ¡ Pruébelo en línea! (tenga en cuenta que hay pestañas en lugar de espacios para obtener el recuento correcto).
Laikoni

¡Bienvenido también a PPCG!
Laikoni

4

Python 2, 50 bytes, 4201

Funciona para 1. La salida es positiva si es primo, o cero si no.

p=input();print all(p%m for m in range(2,p))*~-p;p

Pruébalo en línea


Python 2, 44 bytes, 3701

No funciona para 1. Emite un booleano.

p=input();print all(p%k for k in range(2,p))

Pruébalo en línea



3

05AB1E , 2 bytes,173

p=

Explicación:

p  # Checks if number is prime - returns 1 if true and 0 if false. Uses implicit input.
 = # Wouldn't usually be required for this sort of program, but I added it to make the sum prime.

Pruébalo en línea!


Algo que "los comentarios no están permitidos", pero supongo que las no-operaciones efectivas funcionan bien: D
Value Ink el

2

PHP, 38 bytes, suma 2791

Dato curioso: con en $hlugar de $c, la suma sería 2801(también un primo), y su representación binaria 101011110001leída como decimal también es un número primo.

for($b=$c=$argv[1];$c%--$b;);echo$b<2;

toma el argumento de la línea de comando, imprime 1o una cadena vacía. Corre con -r.

Código tomado de mi propia función principal (mira la publicación original si puedes).


@Artyer Está arreglado.
Titus el

2

R, 27 32 bytes, suma 2243 2609

Guardado 5 bytes gracias a @rturnbull

cat(gmp::isprime(scan(),r=43)>0)

Esto hace uso de la función isprime de la biblioteca gmp.

> sum(as.integer(charToRaw('cat(!!gmp::isprime(scan()))')))
[1] 2243
> cat(!!gmp::isprime(scan()))
1: 2243
2: 
Read 1 item
TRUE
> 

cat(!!gmp::isprime(scan()))es 5 bytes más corto y suma 2243, también primo.
rturnbull

@rturnbull gracias por eso :)
MickyT


1

Gelatina 6 bytes , suma de bytes 691

ƓÆḍ,ṠE

imprime 1si es primo y 0si no.

TryItOnline!

Los bytes en hexadecimal son 93 0D D5 2C CD 45(vea la página de códigos ), o en decimal son los 147 13 213 44 205 69que suman 691, que es primo.

¿Cómo?

ƓÆḍ,ṠE - Main Link: no arguments
Ɠ      - read and evaluate a line from STDIN (integer expected)
 Æḍ    - proper divisor count
   ,   - paired with
    Ṡ  - sign
     E - all equal? - returns a boolean (1 or 0)
       - implicit print

La Æḍfuncionalidad es tal que los primos y sus negaciones devuelven uno, mientras que otros enteros no (los compuestos y sus negaciones devuelven números mayores que uno, uno y menos uno devuelven cero y cero, curiosamente, menos uno).

La funcionalidad es tal que los enteros negativos devuelven menos uno, cero devuelve cero y los enteros positivos devuelven uno.

Por lo tanto, las dos funciones solo devuelven el mismo valor para los primos.

Tenga en cuenta que el programa de 3 bytes ƓÆPque prueba directamente si la entrada de STDIN es primo desafortunadamente no es un programa de suma prima (240).

Las pruebas de igualdad utilizando =(iguales), e(existe en) o (no iguales a vectorización) para 5 bytes tampoco producen programas de suma prima.


Alternativa (quizás no aceptable) 4 bytes, suma 571

Si las restricciones de E / S todavía permiten programas completos que toman un argumento.

Æḍ⁼Ṡ

... usando el mismo principio que el anterior, donde es la igualdad no vectorizante (el aspecto no vectorizador no tiene ningún efecto ya que no hay nada que vectorizar de todos modos). Los valores hexadecimales son 0D D5 8C CDlos que están 13 213 140 205en decimal, que suma a 571, un número primo.

Nuevamente, tenga en cuenta que el programa de 2 bytes ÆPno tiene una suma prima (93).


ƓÆPG(311) y ÆPF(163) deberían estar bien, creo?
Lynn el

Como Unicode, para ƓÆḍ,ṠE, el valor es 16183, ¡que coincidentemente es primo!
Artyer

@ Lynn Sí, parece que la "restricción de código innecesaria" (excepto el carácter de espacio) se ha eliminado, lo que hace que ƓÆPGesté bien. También he preguntado si un programa que toma información en lugar de usar STDIN es aceptable.
Jonathan Allan el

1
... Si ambas cosas están bien, entonces ÆP¥son 3 bytes y 97.
Jonathan Allan


1

Mathematica, 21 bytes, 1997

Print@*PrimeQ@Input[]

Input[]lee una línea de entrada (de STDIN si no se utiliza ningún extremo frontal, a través de un cuadro de diálogo si se utiliza el extremo frontal Mathematica), Print@*PrimeQes la composición ( @*) de la Printy PrimeQfunciones, y @es la notación función de prefijo.


1

Perl 6 , 24 22 bytes,1949

say .is-prime
for +get

Se requieren los tres caracteres de espacio en blanco.
(Sin embargo, a Perl 6 no le importa qué tipo de espacio en blanco son, así que elegí una nueva línea en lugar del espacio más utilizado para la segunda ...)



1

Pip , 8 bytes,511

0Na%,a=1

Escribí un corrector principal, y la suma fue primo. Conveniente. Verifique las entradas 1-30: ¡ Pruébelo en línea!

Explicación

          a is first command-line argument
    ,a    Numbers from 0 to a-1
  a%      Take a mod each of those numbers (a%0 gives nil)
0N        Count number of times 0 occurs in that list
      =1  If 0 occurs only 1 time (for a%1), then a is prime


1

J, 18 bytes, 1103

echo 1&p:".(1!:1)1

No lejos de ser óptimo, lo menos que pude jugar un test de primalidad de programa completo fue 17 Bytes: echo(p:[:".1!:1)1 que desafortunadamente suma 1133 = 11 * 103.

Desafortunadamente, no puedo entender cómo hacer que la entrada del teclado funcione en TIO, por lo que todavía no hay un enlace.

Explicación:

echo 1&p:".(1!:1)1  | Full program
           (1!:1)1  | Read a line of input from keyboard
         ".         | Evaluate (converts string to int)
     1&p:           | 1 for prime, 0 for composite
echo                | Print result. The space is required, as 'echo1' would be interpreted as a variable

Validando el programa:

   1 p:+/u:inv'echo 1&p:".(1!:1)1'  NB. Convert to ints, sum, and test primality
1

1

C (gcc) , 62 60 bytes, 4583

Muy claro. Salidas * si es primo, de lo contrario, genera un espacio. No funciona para 1.

-2 gracias a l4m2

p;main(i){for(scanf("%d",&p);++i<p;)p=p%i?p:0;puts("*"+!p);}

Pruébalo en línea!


1
n;main(i){for(scanf("%d",&n);++i<n;)n=n%i?n:0;puts("*"+!n);}Es posible que deba cambiar el nombre de alguna variable para la suma prima
l4m2

@ l4m2 ¡Buena!
Gastropner

1

AWK , 36 bytes, suma de bytes 2239

{for(a=1;$0%++a&&a<$0;);$0=(a==$0)}1

Pruébalo en línea!

Salidas 0si no es prime y 1para prime. Definitivamente no es el código más eficiente, ya que verifica cada número entero mayor que 1para ver si divide la entrada.


1

Excel (57 bytes, suma de código 3547)

=XOR(0<PRODUCT(MOD(A1,ROW(OFFSET(D2,0,,SQRT(A1))))),3>A1)

Excel realmente no tiene una "entrada" como tal, pero esta fórmula espera que el número que se probará esté en A1 y salga a cualquier celda en la que lo coloque. Es una fórmula de matriz, así que presione Ctrl-Shift-Enter para ingresar en lugar de entrar.


1

Java 8, 114 bytes, Prime 10037

interface M{static void main(String[]a){long n=new Long(a[0]),x=2;for(;x<n;n=n%x++<1?0:n);System.out.print(n>1);}}

Pruébalo en línea.

Explicación:

interface M{                     // Class
  static void main(String[]a){   //  Mandatory main-method
    long n=new Long(a[0]),       //   The first argument as number
    x=2;for(;x<n;n=n%x++<1?0:n); //   Check if `n` is a prime
    System.out.print(n>1);}}     //   Print whether `n` was a prime
                                 //    (if `n` is still the same: it's a prime;
                                 //     if `n` is now 0 or 1: it's not a prime)

Lo he usado en xlugar de ihacer que la suma Unicode sea primo. Verifique la suma unicode aquí.



0

SmileBASIC, 42 bytes, 2687

INPUT N:FOR D=2TO N/2P=P+!(N MOD D)NEXT?!P

Emite 1 (verdadero) si el número es primo, de lo contrario 0 (falso).

Los nombres de las variables no solo se eligieron para hacer que el programa sea primo. Nes el n umber a prueba, Des la d iVisor, y Pmantiene un seguimiento de si N es p escarcha.



0

Óxido, 190 bytes, puntaje 15013

fn main(){let A=&mut"".into();std::io::stdin().read_line(A);let(B,mut C)=(A.trim().parse::<u64>().unwrap(),true);for H in 2..((B as f64).sqrt()+1.0) as u64{if B%H==0{C=false}}print!("{}",C)}

Sin golf

fn main() {
    let input = &mut "".into();
    std::io::stdin().read_line(input);
    let (number, mut prime) = (input.trim().parse::<u64>().unwrap(), true);

    for x in 2..((number as f64).sqrt() + 1.0) as u64 {
        if number % x == 0 {
            prime = false;
        }
    }

    print!("{}", prime);
}

No funciona para 1



0

Susurros v2 , 33 bytes

>>> ⊤ℙ∘ℕ
> Input
>> 1∘2

Pruébalo en línea!

  1. Puntuación: 44381
  2. ¡Solo se agregaron 6 bytes / 2 caracteres para que sea válido!
  3. 1 no es primo

Cómo funciona

Esto se muestra en el orden en que se ejecuta:

		; Line 3:
>>  ∘		; Compose...
   1            ; Line 1 with
     2          ; The result of line 2

		; Line 2:
> Input		; Retrieve a line of input

		; Line 1:
>>> ⊤		; The input is...
     ℙ		; Prime
      ∘		; And it is...
       ℕ	; Natural
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.