Test główny, który jest literalnie pierwszy


23

Napisz program, który przetestuje pierwotność określonej liczby i poda wynik jako wartość logiczną (prawda jest liczbą pierwszą). Twój test podstawowy może (ale nie musi) być ważny na liczbę 1.

Oto haczyk: sam program musi sumować się do liczby pierwszej. Konwertuj każdy znak (łącznie ze spacjami) na jego wartość Unicode / ASCII ( tabela ). Następnie dodaj wszystkie te liczby razem, aby uzyskać sumę swojego programu.

Weźmy na przykład ten niezbyt świetny program, który napisałem w Pythonie 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)

Jeśli przekonwertujesz wszystkie znaki na odpowiadające im wartości Unicode / ASCII, otrzymasz:

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 

Następnie możesz znaleźć sumę tych liczb ręcznie lub we własnym programie. Ten konkretny program wynosi 8293, co jest liczbą pierwszą.

Oczywiście jest to Code Golf, więc im mniejszy jest program, tym lepiej. Jak zauważyli inni użytkownicy, ten program nie jest bardzo golfowy.

Kilka zasad:

Prawidłowe dane wejściowe obejmują STDIN i monity (brak funkcji, to tylko sposób na dodanie darmowego dodatkowego kodu). Spacje są dozwolone, ale tylko wtedy, gdy mają kluczowe znaczenie dla funkcjonalności twojego programu. Dane wyjściowe muszą być danymi wyjściowymi, a nie tylko przechowywanymi w zmiennej lub zwracanymi (użyj print, STDOUT itp.)

Flagi mogą być używane i powinny być liczone dosłownie, a nie rozszerzane. Komentarze nie są dozwolone. Jeśli chodzi o znaki spoza ASCII, należy je przypisać do wartości w odpowiednim kodowaniu.

Podaj rozmiar swojego programu i sumę programu. Będę testować, aby upewnić się, że programy są prawidłowe.

Powodzenia!

Oto fragment kodu zliczający sumę programu i sprawdzający, czy jest on najważniejszy:


12
W językach innych niż golfowe wygląda na to, że możesz po prostu wziąć najkrótszy kod decydujący o liczbach pierwszych i zmieniać nazwy zmiennych, aż suma będzie liczbą pierwszą.
xnor

5
Dlaczego ograniczenia we / wy?
Jonathan Allan

2
Co to jest „wartość Unibyte”?! ???
aditsu

5
Mówisz o znakach i stronach kodowych. Znak Unicode ma zawsze ten sam punkt kodowy, bez względu na to, jakie kodowanie jest używane do jego przedstawienia. Jeśli chodzi o znaki spoza ASCII, należy je przypisać do wartości w odpowiednim kodowaniu. sprawia, że ​​myślę, że naprawdę chcesz, aby suma wartości bajtów była liczbą pierwszą
Dennis,

Odpowiedzi:




6

Microscript II, 2 bajty (suma 137)

N;

Microscript II, 4 bajty (suma 353)

N;ph

Jestem właściwie zaskoczony, że oba te sumy mają sumy bajtów.



4

Pyth, 2 bajty, 127

/P

Wypróbuj online

Dane wyjściowe 1dla liczb pierwszych, 0dla liczb niepierwszych.

/ma punkt kodowy 47. Pma punkt kodowy 80.

Jak to działa:

/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 bajty, 4421

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

Twierdzenie Wilsona.


2
Przekształcił go w pełny samodzielny program.
fquarp

::IO IntNaprawdę nie powinno być konieczne, chyba że jest to najkrótszy sposób można dostać się doskonałą sumy.
Ørjan Johansen

Dobra decyzja. Otrzymujemy jednak kod, który „haszy” do wartości parzystej. Dodanie spacji lub nowych wierszy nic nie robi (nawet wartości), ani nie zmienia nazwy zmiennej (pojawia się cztery razy, więc zastąpienie jej kodu (powiedzmy c) oznacza odjęcie 4 * c i dodanie 4 * c ', pozostawiając suma nawet. Jednak można go poprawić, przerywając linie i nadal być krótszy, co zrobiłem
fquarp

1
47 bajtów z innym testem pierwotności: Wypróbuj online! (zwróć uwagę, że zamiast spacji są tabulatory, aby poprawnie wyliczyć liczbę).
Laikoni,

Witamy również w PPCG!
Laikoni,

4

Python 2, 50 bajtów, 4201

Działa dla 1. Wynik jest dodatni, jeśli jest liczbą pierwszą, lub zero, jeśli nie.

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

Wypróbuj online


Python 2, 44 bajty, 3701

Nie działa dla 1. Wyprowadza wartość logiczną.

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

Wypróbuj online



3

05AB1E , 2 bajty,173

p=

Wyjaśnienie:

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.

Wypróbuj online!


Coś, co „komentarze nie są dozwolone”, ale wydaje mi się, że skuteczne no-ops działają dobrze: D
Wartość Ink

2

PHP, 38 bajtów, suma 2791

Ciekawostka: $hzamiast $ctego suma byłaby 2801(również liczbą pierwszą), a jej reprezentacja binarna 101011110001odczytana jako dziesiętna jest również liczbą pierwszą.

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

pobiera argument wiersza poleceń, drukuje 1lub pusty ciąg znaków. Uruchom z -r.

Kod pobrany z mojej podstawowej funkcji (jeśli możesz, spójrz na oryginalny post).


@Artyer Jest naprawiony.
Tytus

2

R, 27 32 bajty, suma 2243 2609

Zaoszczędź 5 bajtów dzięki @rturnbull

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

Wykorzystuje to funkcję isprime biblioteki 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()))jest o 5 bajtów krótszy i sumuje się 2243również do liczby pierwszej.
rturnbull

@rturnbull dzięki za to :)
MickyT

1

Python 2, 44 bajty, suma bajtów 3109

To jest 44-bajtowa implementacja xnor z nazwami zmiennych o najniższej wartości, które dają sumę bajtów pierwszych.

Drukuje, 1jeśli jest pierwsza, a 0jeśli nie.

C=B=1
exec"B*=C*C;C+=1;"*~-input()
print B%C

1

Galaretka 6 bajtów , suma bajtów 691

ƓÆḍ,ṠE

drukuje, 1jeśli jest pierwsza, a 0jeśli nie.

TryItOnline!

Bajty w systemie szesnastkowym to 93 0D D5 2C CD 45(patrz strona kodowa ) lub w systemie dziesiętnym 147 13 213 44 205 69suma wynosi 691, co jest liczbą pierwszą.

W jaki sposób?

ƓÆḍ,Ṡ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

The ÆḍFunkcjonalność jest taka, że liczby pierwsze i ich negacje zwrócić jeden, podczas gdy inne całkowite zrobić NOT (kompozytów i ich negacje powrócić numery większe niż jeden, jeden i minus jeden zwracają zero i zerowym, co dziwne, minus jeden).

The Funkcjonalność jest taka, że liczby całkowite ujemne powrócić minus jeden, zero zwraca zero i dodatnie liczby całkowite powrócić jeden.

Zatem dwie funkcje zwracają tylko tę samą wartość dla liczb pierwszych.

Zauważ, że 3-bajtowy program ƓÆP który bezpośrednio sprawdza, czy dane wejściowe z STDIN są liczbą pierwszą, nie jest niestety programem sumy pierwszej (240).

Testowanie równości przy użyciu =(równości), e(istnieje w) lub (równości niewektoryzującej) dla 5 bajtów również nie daje programów z sumą pierwszą.


Alternatywne (być może nie do przyjęcia) 4 bajty, suma 571

Jeśli ograniczenia we / wy nadal zezwalają na pełne programy, które pobierają argument.

Æḍ⁼Ṡ

... stosując tę ​​samą zasadę, co powyżej, gdzie równość nie jest wektoryzująca (aspekt niewektoryzujący nie ma żadnego efektu, ponieważ i tak nie ma nic do wektoryzacji). Wartości szesnastkowe są dziesiętne, 0D D5 8C CDco daje 13 213 140 205sumę 571, liczbę pierwszą.

Ponownie zauważmy, że program 2-bajtowy ÆPnie ma sumy pierwszej (93).


ƓÆPGÆPFMyślę, że (311) i (163) powinny być w porządku?
Lynn,

Jako Unicode, bo ƓÆḍ,ṠEwartością jest 16183, która jest przypadkowo liczbą pierwszą!
Artyer,

@ Lynn Tak, wygląda na to, że „niepotrzebne ograniczenie kodu” (z wyjątkiem spacji) zostało zniesione, co czyni ƓÆPGOK. Zapytałem również, czy program przyjmujący dane wejściowe zamiast STDIN jest dopuszczalny.
Jonathan Allan

1
... Jeśli obie takie rzeczy są w porządku, ÆP¥to 3 bajty i 97.
Jonathan Allan


1

Mathematica, 21 bajtów, 1997

Print@*PrimeQ@Input[]

Input[]odczytuje wiersz danych wejściowych (jeśli nie ze standardowego wejścia przedni koniec używanego przez pole dialogowe, jeśli stosuje się przedni koniec Mathematica) Print@*PrimeQjest skład ( @*) z Printi PrimeQfunkcji i @ma oznaczenie funkcji prefiksu.


1

Perl 6 , 24 22 bajtów,1949

say .is-prime
for +get

Wszystkie trzy znaki spacji są wymagane.
(Perl 6 nie dba o to, jaki jest biały znak, więc wybrałem nowy wiersz zamiast częściej używanego miejsca na drugi ...)



1

Pip, 8 bytes, 511

0Na%,a=1

I wrote a prime checker, and the sum was prime. Convenient. Verify inputs 1-30: Try it online!

Explanation

          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

Not far from optimal, the least I could golf a full program primality test to was 17 Bytes: echo(p:[:".1!:1)1, which unfortunately sums to 1133 = 11*103.

Unfortunately I can't figure out how to get keyboard input working on TIO, so no link yet.

Explanation:

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

Validating the program:

   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

Pretty straight-forward. Outputs * if prime, otherwise it outputs a space. Does not work for 1.

-2 thanks to l4m2

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

Try it online!


1
n;main(i){for(scanf("%d",&n);++i<n;)n=n%i?n:0;puts("*"+!n);} may need to change some variable name for prime sum
l4m2

@l4m2 Nice one!
gastropner

1

AWK, 36 bytes, byte-sum 2239

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

Try it online!

Outputs 0 if not prime and 1 for prime. Definitely not the most efficient code, since it checks every integer greater than 1 to see if it divides the input.


1

Excel (57 bytes, code sum 3547)

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

Excel doesn't really have an "input" as such, but this formula expects the number to be tested to be in A1 and outputs to whatever cell you drop it in. It's an array formula, so press Ctrl-Shift-Enter to enter it, rather than Enter.


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

Try it online.

Explanation:

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)

I've used x instead of i to make the unicode sum a prime. Verify the unicode sum here.



0

SmileBASIC, 42 bytes, 2687

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

Outputs 1 (true) if the number is prime, otherwise 0 (false).

The variable names were not just chosen to make the program prime. N is the number to test, D is the divisor, and P keeps track of whether N is prime.



0

Rust, 190 bytes, 15013 score

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

Ungolfed

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

Does not work for 1



0

Whispers v2, 33 bytes

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

Try it online!

  1. Score: 44381
  2. Only 6 bytes/2 characters added to make it valid!
  3. 1 is not prime

How it works

This is shown in the order it is executed in:

		; 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.