การทดสอบที่สำคัญที่สำคัญอย่างยิ่ง


23

เขียนโปรแกรมที่จะทดสอบ primality ของตัวเลขที่ระบุและให้ผลลัพธ์เป็นค่าบูลีน (True is prime) การทดสอบที่สำคัญของคุณสามารถ (แต่ไม่จำเป็นต้อง) ถูกต้องสำหรับหมายเลข 1

นี่คือรายการที่จับต้องได้: โปรแกรมของคุณต้องรวมเป็นจำนวนเฉพาะ แปลงอักขระทุกตัว (รวมถึงช่องว่าง) เป็นค่า Unicode / ASCII ( ตาราง ) จากนั้นเพิ่มตัวเลขทั้งหมดเข้าด้วยกันเพื่อรับผลรวมของโปรแกรมของคุณ

ตัวอย่างเช่นลองใช้โปรแกรมที่ไม่ค่อยดีนักที่ฉันเขียนใน 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)

หากคุณแปลงอักขระทั้งหมดเป็นค่า Unicode / ASCII ที่เกี่ยวข้องคุณจะได้รับ:

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 

จากนั้นคุณสามารถค้นหาผลรวมของตัวเลขเหล่านั้นด้วยตนเองหรือด้วยโปรแกรมของคุณเอง โปรแกรมเฉพาะนี้รวมไปถึง 8293 ซึ่งเป็นจำนวนเฉพาะ

แน่นอนว่านี่คือ Code Golf ดังนั้นยิ่งขนาดเล็กลงคุณสามารถทำให้โปรแกรมของคุณดีขึ้นได้ ตามที่ผู้ใช้คนอื่น ๆ ชี้ให้เห็นโปรแกรมนี้ไม่ได้กอล์ฟมาก

กฎไม่กี่:

อินพุตที่ถูกต้องประกอบด้วย STDIN และการแจ้งเตือน (ไม่มีฟังก์ชั่นมันเป็นเพียงวิธีเพิ่มรหัสพิเศษฟรี) อนุญาตให้เว้นวรรค แต่เฉพาะในกรณีที่จำเป็นต่อการทำงานของโปรแกรมของคุณ ผลลัพธ์จะต้องเป็นผลลัพธ์ไม่ใช่แค่เก็บไว้ในตัวแปรหรือส่งคืน (ใช้ print, STDOUT และอื่น ๆ )

สามารถใช้แฟล็กและควรนับอย่างแท้จริงไม่ขยาย ไม่อนุญาตให้แสดงความคิดเห็น สำหรับอักขระที่ไม่ใช่ ASCII ควรกำหนดให้กับค่าในการเข้ารหัสตามลำดับ

ตรวจสอบให้แน่ใจว่ารายการขนาดโปรแกรมของคุณและผลรวมของโปรแกรม ฉันจะทดสอบเพื่อให้แน่ใจว่าโปรแกรมนั้นถูกต้อง

โชคดี!

นี่เป็นตัวอย่างข้อมูลเพื่อนับผลรวมของโปรแกรมของคุณและตรวจสอบว่าเป็นข้อมูลที่ดีหรือไม่:


12
ในภาษาที่ไม่ใช่การเล่นกอล์ฟดูเหมือนว่าคุณสามารถใช้รหัสเฉพาะการตัดสินใจที่สั้นที่สุดและตั้งชื่อตัวแปรปรับแต่งได้จนกว่าผลรวมจะเป็นจำนวนเฉพาะ
xnor

5
ทำไมข้อ จำกัด ของ I / O
Jonathan Allan

2
"ค่า Unibyte" คืออะไร!
aditsu

5
คุณพูดถึงตัวละครและหน้ารหัส อักขระ Unicode มีจุดรหัสเดียวกันเสมอไม่ว่าจะใช้การเข้ารหัสใดเพื่อแสดง สำหรับอักขระที่ไม่ใช่ ASCII ควรกำหนดให้กับค่าในการเข้ารหัสตามลำดับ ทำให้ฉันคิดว่าจริง ๆ แล้วคุณต้องการให้ผลรวมของค่าไบต์เป็นค่าเฉพาะ
Dennis

คำตอบ:




6

Microscript II, 2 ไบต์ (รวม 137)

N;

ไมโครวินาที II, 4 ไบต์ (รวม 353)

N;ph

จริง ๆ แล้วฉันค่อนข้างแปลกใจที่ทั้งสองแผลมีจำนวนไบต์ที่สำคัญ



4

Pyth, 2 ไบต์, 127

/P

ลองออนไลน์

เอาต์พุต1สำหรับช่วง0เวลาเฉพาะช่วงเวลา

/47มีจุดรหัส มีจุดรหัสP80

มันทำงานอย่างไร:

/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 ไบต์, 4421

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

ทฤษฎีบทวิลสัน


2
เปลี่ยนเป็นโปรแกรมเดี่ยวแบบเต็ม
fquarp

::IO Intมันไม่ควรจะเป็นสิ่งที่จำเป็นเว้นแต่ว่าเป็นทางที่สั้นที่สุดที่คุณจะได้รับผลบวกที่สำคัญ
Ørjan Johansen

โทรดีมาก อย่างไรก็ตามเราจะได้รหัสที่ `แฮช 'เป็นค่าคู่ การเพิ่มช่องว่างหรือบรรทัดใหม่ไม่ได้ทำอะไรเลย (แม้แต่ค่า) และไม่เปลี่ยนชื่อของตัวแปร (ปรากฏขึ้นสี่ครั้งดังนั้นการแทนที่รหัส (พูด c) จำนวนเงินเพื่อลบ 4 * c และเพิ่ม 4 * c ' . แม้ผลรวม แต่ก็สามารถ tweaked โดยการทำลายเส้นและยังคงเป็นที่สั้นกว่าที่เราได้กระทำ.
fquarp

1
47 ไบต์พร้อมการทดสอบแบบดั้งเดิม: ลองออนไลน์! (โปรดทราบว่ามีแท็บแทนที่จะเว้นวรรคเพื่อให้ได้จำนวนที่ถูกต้อง)
Laikoni

ยังยินดีต้อนรับสู่ PPCG!
Laikoni

4

Python 2, 50 ไบต์ 4201

ใช้งานได้สำหรับ 1 เอาต์พุตเป็นค่าบวกถ้านายกหรือศูนย์ถ้าไม่

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

ลองออนไลน์


Python 2, 44 ไบต์ 3701

ใช้งานไม่ได้สำหรับ 1 ส่งเอาต์พุตบูลีน

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

ลองออนไลน์



3

05AB1E , 2 ไบต์173

p=

คำอธิบาย:

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.

ลองออนไลน์!


บางสิ่งบางอย่าง "ความคิดเห็นไม่ได้รับอนุญาต" แต่ฉันเดาว่าไม่มีการใช้งานที่มีประสิทธิภาพทำงานได้ดี: D
Value Ink

2

PHP, 38 ไบต์, ผลรวม 2791

ความจริงแล้วสนุก: ด้วย$hแทนที่จะ$cเป็นผลรวมจะเป็น2801(เช่นไพร์ม) และการแทนค่าไบนารี่ที่101011110001อ่านเป็นทศนิยมก็เป็นจำนวนเฉพาะเช่นกัน

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

รับอาร์กิวเมนต์บรรทัดคำสั่งพิมพ์1หรือสตริงว่าง -rทำงานด้วย

รหัสที่นำมาจากฟังก์ชั่นเฉพาะของฉันเอง (ดูที่โพสต์ต้นฉบับหากคุณสามารถ)


@Artyer แก้ไขแล้ว
ติตัส

2

R, 27 32ไบต์, ผลรวม 2243 2609

บันทึก 5 ไบต์ด้วย @rturnbull

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

สิ่งนี้ใช้ประโยชน์จากฟังก์ชัน isprime ของไลบรารี 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()))สั้นลง 5 ไบต์และจำนวนเงินรวมถึงจำนวน2243เฉพาะเช่นกัน
rturnbull

@rturnbull ขอบคุณสำหรับ :) :)
MickyT


1

เยลลี่ 6 ไบต์ , ไบต์รวม 1,991

ƓÆḍ,ṠE

พิมพ์1ถ้าสำคัญและ0ถ้าไม่

TryItOnline!

ไบต์เป็นเลขฐานสิบหกคือ93 0D D5 2C CD 45(ดูที่หน้ารหัส ) หรือเป็นทศนิยม147 13 213 44 205 69ซึ่งจะรวมเป็น 691 ซึ่งเป็นจำนวนเฉพาะ

อย่างไร?

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

Æḍการทำงานเป็นเช่นนั้นช่วงเวลาและการ negations กลับในขณะที่จำนวนเต็มอื่น ๆ ทำไม่ได้ (คอมโพสิตและการ negations กลับตัวเลขที่มากกว่าหนึ่งหนึ่งและลบหนึ่งกลับเป็นศูนย์และศูนย์ผลตอบแทนที่ผิดปกติพอลบหนึ่ง)

การทำงานเป็นเช่นนั้นจำนวนเต็มเชิงลบกลับลบหนึ่งศูนย์ส่งกลับค่าศูนย์และจำนวนเต็มบวกกลับมาอย่างใดอย่างหนึ่ง

ดังนั้นทั้งสองฟังก์ชั่นจะส่งกลับค่าเดียวกันสำหรับช่วงเวลาเท่านั้น

โปรดทราบว่าโปรแกรม 3 ไบต์ƓÆPซึ่งทดสอบโดยตรงว่าอินพุตจาก STDIN นั้นดีเลิศหรือไม่นั้นไม่ใช่โปรแกรมแบบรวม (240)

การทดสอบความเท่าเทียมกันโดยใช้=(เท่ากับ), e(มีอยู่ใน) หรือ(ไม่ใช่เวกเตอร์เท่ากับ) เป็นเวลา 5 ไบต์เช่นกันไม่ได้ให้โปรแกรมเฉพาะผลรวมหลัก


ทางเลือก (อาจไม่ยอมรับ) 4 ไบต์รวม 571

หากข้อ จำกัด I / O ยังคงอนุญาตให้โปรแกรมเต็มรูปแบบที่จะโต้แย้ง

Æḍ⁼Ṡ

... โดยใช้หลักการเดียวกันกับข้างต้นซึ่งเป็นความเท่าเทียมกันที่ไม่ใช่เวกเตอร์ ค่าฐานสิบหกกำลัง0D D5 8C CDที่มี13 213 140 205อยู่ในทศนิยมซึ่งรวมไป 571, นายก

โปรดทราบอีกครั้งว่าโปรแกรม 2 ไบต์ÆPไม่มีผลรวมเฉพาะ (93)


ƓÆPG(311) และÆPF(163) ควรจะดีฉันคิดว่า?
Lynn

ในฐานะที่เป็น Unicode สำหรับƓÆḍ,ṠEค่าคือ16183ซึ่งเป็นสิ่งสำคัญโดยบังเอิญ!
2560

@Lynn ใช่ดูเหมือนว่า "การ จำกัด รหัสที่ไม่จำเป็น" (ยกเว้นอักขระเว้นวรรค) ได้ถูกยกขึ้นทำให้ƓÆPGตกลง ฉันยังถามด้วยว่าโปรแกรมที่รับอินพุตแทนการใช้ STDIN นั้นเป็นที่ยอมรับหรือไม่
Jonathan Allan

1
... หากทั้งสองอย่างตกลงกันแล้วก็ÆP¥คือ 3 ไบต์และ 97
Jonathan Allan


1

Mathematica, 21 ไบต์, 1997

Print@*PrimeQ@Input[]

Input[]อ่านบรรทัดอินพุต (จาก STDIN หากไม่มีการใช้ส่วนหน้าผ่านกล่องโต้ตอบหากใช้ส่วนหน้า Mathematica) Print@*PrimeQเป็นองค์ประกอบ ( @*) ของPrintและPrimeQฟังก์ชั่นและ@เป็นสัญกรณ์ฟังก์ชั่นคำนำหน้า


1

Perl 6 , 24 22 ไบต์1949

say .is-prime
for +get

ต้องการอักขระช่องว่างทั้งสามตัว
(Perl 6 ไม่สนใจสิ่งที่ชนิดของตัวละครของช่องว่างที่พวกเขามี แต่ดังนั้นฉันเลือกขึ้นบรรทัดใหม่แทนของพื้นที่ที่ใช้กันอย่างแพร่หลายสำหรับคนที่สอง ... )



1

พิพ 8 ไบต์511

0Na%,a=1

ฉันเขียนตัวตรวจสอบหลักและผลรวมนั้นก็สำคัญ สะดวกสบาย ตรวจสอบอินพุต 1-30: ลองออนไลน์!

คำอธิบาย

          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 ไบต์ 1103

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

ไม่ไกลจากจุดที่เหมาะสมที่สุดอย่างน้อยที่สุดฉันก็สามารถทดสอบโปรแกรมแบบดั้งเดิมได้จนถึง 17 ไบต์: echo(p:[:".1!:1)1ซึ่งน่าเสียดายที่ 1133 = 11 * 103

น่าเสียดายที่ฉันไม่สามารถทราบวิธีการป้อนข้อมูลแป้นพิมพ์ทำงานบน TIO ดังนั้นจึงไม่มีลิงก์

คำอธิบาย:

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

ตรวจสอบโปรแกรม:

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

1

C (gcc) , 62 60 ไบต์, 4583

ตรงไปตรงมาสวย เอาท์พุท * หากสำคัญมิฉะนั้นจะส่งสัญญาณเว้นวรรค ไม่ได้ผลสำหรับ 1

-2 ขอบคุณl4m2

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

ลองออนไลน์!


1
n;main(i){for(scanf("%d",&n);++i<n;)n=n%i?n:0;puts("*"+!n);}อาจต้องเปลี่ยนชื่อตัวแปรสำหรับผลรวมหลัก
l4m2

@ l4m2 เยี่ยมมาก!
Gastropner

1

AWK , 36 ไบต์, ผลรวมไบต์ 2239

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

ลองออนไลน์!

เอาต์พุต0ถ้าไม่ใช่ค่าเฉพาะและ1สำหรับไพรม์ ไม่ใช่รหัสที่มีประสิทธิภาพที่สุดอย่างแน่นอนเนื่องจากมันจะตรวจสอบจำนวนเต็มทุกตัวที่มากกว่า1เพื่อดูว่ามันแบ่งอินพุตหรือไม่


1

Excel (57 ไบต์, รหัสรวม 3547)

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

Excel ไม่มี "อินพุต" จริง ๆ เช่นนี้ แต่สูตรนี้คาดว่าจะมีการทดสอบหมายเลขใน A1 และส่งออกไปยังเซลล์ใด ๆ ที่คุณวางไว้มันเป็นสูตรอาร์เรย์ดังนั้นกด Ctrl-Shift-Enter เพื่อป้อน มันมากกว่าเข้า


1

Java 8, 114 ไบต์, 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);}}

ลองออนไลน์

คำอธิบาย:

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)

ฉันใช้xแทนiการทำให้ผลรวมของ Unicode เป็นไพรม์ ตรวจสอบผลรวม Unicode ที่นี่



0

SmileBASIC ขนาด 42 ไบต์ 2687

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

เอาท์พุท 1 (จริง) ถ้าจำนวนนั้นเป็นจำนวนเฉพาะมิฉะนั้นเป็น 0 (เท็จ)

ชื่อตัวแปรไม่ได้ถูกเลือกเพื่อทำให้โปรแกรมดีที่สุด Nเป็นnสีน้ำตาลไหม้ที่จะทดสอบDเป็นd iVisor และPติดตามว่า N คือพีจังหวะ



0

สนิม 190 ไบต์, 1,5013 คะแนน

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

ไม่ได้ผลสำหรับ 1


0

|pQใช้งานได้คะแนน 317 หากได้รับอนุญาตให้แลกเปลี่ยนความจริง / ความผิดพลาดก็|p!ใช้ได้เช่นกันสำหรับ 269
Khuldraeseth na'Barya

ขอขอบคุณ. ฉันไม่คิดว่าความท้าทายต้องการให้คะแนนถูกลดลงดังนั้นฉันจึงไม่ได้ปรับแต่งส่วนนั้น
Weijun Zhou

0

Whispers v2 , 33 ไบต์

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

ลองออนไลน์!

  1. คะแนน: 44381
  2. เพิ่มเพียง 6 ไบต์ / 2 อักขระเพื่อให้ถูกต้อง!
  3. 1ไม่สำคัญ

มันทำงานอย่างไร

นี่คือลำดับที่มันถูกดำเนินการใน:

		; 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.