ช่วงเวลาแห่งความผาสุกของฉันเป็นเส้นทึบเสมอ


12

ลองสร้างตาราง Nx N ของช่องว่างและขีดล่างที่สามารถใช้ในการตรวจสอบด้วยสายตาว่าจำนวนนั้นเป็นจำนวนเฉพาะหรือไม่ (N อาจเป็นจำนวนเต็มบวกใด ๆ )

กริดนี้มีกฎง่าย ๆ สามข้อ:

  1. คอลัมน์ที่ n ประกอบด้วยรูปแบบการซ้ำของขีดล่าง n - 1 ตามด้วยช่องว่างหนึ่งช่อง รูปแบบนี้เริ่มที่แถวแรกและหยุดอาจเป็นรูปแบบกลางที่แถว N (แถวและคอลัมน์มีการจัดทำดัชนี 1 รายการ)
  2. คอลัมน์แรกจะถูกแทนที่ด้วยขีดล่างทั้งหมดแทนช่องว่างทั้งหมด
  3. หากมีช่องว่างเกิดขึ้นที่ใดที่หนึ่งดัชนีแถวเท่ากับดัชนีคอลัมน์มันจะถูกแทนที่ด้วยเครื่องหมายขีดล่าง

ตัวอย่าง: N = 10

           1
  1234567890 <-- column indices
 1__________
 2__________
 3__________
 4_ ________
 5__________
 6_  _______
 7__________
 8_ _ ______
 9__ _______
10_ __ _____
 ^ row indices

ดัชนีเป็นเพียงเพื่อความชัดเจน กริดธรรมดานั้นเอง (สิ่งที่โปรแกรมของคุณจะต้องมีเอาต์พุต) คือ:

__________
__________
__________
_ ________
__________
_  _______
__________
_ _ ______
__ _______
_ __ _____

สังเกตว่า:

  • คอลัมน์แรกคือขีดล่างทั้งหมด
  • คอลัมน์ที่สองไปที่ช่องว่างขีดล่างขีดล่างช่องว่าง ฯลฯ ยกเว้นขีดล่างบนแถว 2
  • คอลัมน์ที่สามจะขีดเส้นใต้ขีดล่างช่องว่างขีดล่างขีดล่างช่องว่าง ฯลฯ ยกเว้นขีดล่างบนแถว 3
  • เป็นต้น

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

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

โปรแกรม

เขียนโปรแกรมที่จะวาดกริดเหล่านี้ให้ N ผ่าน stdin (หรือทางเลือกที่ใกล้เคียงที่สุด) เอาต์พุตไปที่ stdout (หรือตัวเลือกที่ใกล้เคียงที่สุด) และควรมีช่องว่างเครื่องหมายขีดล่างและบรรทัดใหม่เท่านั้นโดยขึ้นบรรทัดใหม่ที่เป็นตัวเลือก

รหัสที่สั้นที่สุดชนะ


ฉันไม่ทราบวิธีกำหนดจำนวนเฉพาะ
Filip Bartuzi

5
@FilipBartuzi อาจลองดูen.wikipedia.org/wiki/Sieve_of_Eratosthenes

"คอลัมน์ที่ n ประกอบด้วยรูปแบบการซ้ำของขีดล่าง n - 1 ตามด้วยช่องว่างหนึ่งช่อง" ดังนั้นคอลัมน์ไม่ควร n = 1 เป็นช่องว่างทั้งหมดไม่ใช่ขีดล่างทั้งหมดหรือไม่
algorithmshark

6
ฉันต้องบอกว่าฉันไม่ชอบความต้องการ "ไม่มีการขึ้นบรรทัดใหม่" โดยเฉพาะ นี่เป็นเรื่องยากมากในบางภาษาเป็นไปไม่ได้เลยที่จะมีผลกับโปรแกรมที่พิมพ์ไปยัง STDOUT เท่านั้น
เดนนิส

4
คำอธิบายนั้นยากสำหรับฉันที่จะเข้าใจ นี่คือวิธีที่ฉันจะอธิบาย: เริ่มต้นด้วยเส้นตารางของ N บรรทัดของขีดเส้นใต้ N สำหรับnสาย, th ทำให้kตัวอักษร TH พื้นที่ถ้าkเป็นตัวหารของmที่ไม่ได้ 1 mหรือ
Casey Chu

คำตอบ:


7

CJam, 33 28 27 bytes

q~,:)_f{f{md\1=+'_S?}0'_tN}

ลองออนไลน์

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

q~        " Read one line from STDIN and evaluate it.                                     ";
,:)       " For “N”, push [ 1 ... N ].                                                    ";
_         " Push a copy.                                                                  ";
f{        " For each “I in [ 1 ... N ], push “I   [ 1 ... N ]”; then:                     ";
  f{      " For each “J in [ 1 ... N ], push “J   I”; then:                               ";
    md\   " Push “J % I   J / I”.                                                         ";
    1=+   " Calculate “J % I + (J / I == 1)”.                                             ";
    '_S?  " Push an underscore if the result is truthy and a space otherwise.             ";
  }       "                                                                               ";
  0'_t    " Replace the first character of the resulting array by an underscore.          ";
  N       " Push a newline.                                                               ";
}         "                                                                               ";

ตัวอย่างการวิ่ง

$ cjam solid-primes.cjam <<< 10
__________
__________
__________
_ ________
__________
_  _______
__________
_ _ ______
__ _______
_ __ _____
$ cjam solid-primes.cjam <<< 100 | md5sum # trailing newline
e4396b316989813dada21141b569ccf9  -

ฉันจะโพสต์คำอธิบายเมื่อฉันเล่นกอล์ฟเสร็จแล้ว
เดนนิส

9
33 ไบต์และคุณไม่ได้เล่นกอล์ฟ?

5

Ruby, 77 73 ตัวอักษร

puts (1..n=gets.to_i).map{|a|?_+(2..n).map{|b|a!=b&&a%b==0? ' ':?_}.join}

เทคนิคบางอย่างที่ฉันใช้:

  • ..ผู้ประกอบการมีเกือบต่ำสุดสำคัญของผู้ประกอบการทั้งหมดในทับทิมดังนั้น(1..n=gets.to_i)เพียงการทำงาน

  • แทนการเพิ่มเสริมa!=1สภาพเมื่อตรวจสอบเพื่อดูว่าตัวละครที่ควรจะเป็นพื้นที่แทนการขีดล่าง (ที่ตั้งแต่แถวแรกคือขีดทั้งหมด) ผมเพิ่งเริ่มต้นช่วงจากและใช้ได้เป็นพิเศษ2?_

  • บรรทัด A สามารถกลายเป็นบรรทัด B:

    A | a%b==0&&a!=b ? ' ':?_
    B | a!=b&&a%b==0? ' ':?_
    

    เพราะฉันต้องมีช่องว่างพิเศษระหว่างbและ?ในบรรทัด A แต่นั่นไม่จำเป็นระหว่าง0และ?ในบรรทัด B b?เป็นวิธี Ruby ที่ถูกต้อง แต่0?ไม่ใช่

  • puts*"\n"จะเข้าร่วมโดยอัตโนมัติอาร์เรย์ที่มีการขึ้นบรรทัดใหม่สำหรับคุณลบความจำเป็นในการเสริม

เอาท์พุทสำหรับn=100:

____________________________________________________________________________________________________
____________________________________________________________________________________________________
____________________________________________________________________________________________________
_ __________________________________________________________________________________________________
____________________________________________________________________________________________________
_  _________________________________________________________________________________________________
____________________________________________________________________________________________________
_ _ ________________________________________________________________________________________________
__ _________________________________________________________________________________________________
_ __ _______________________________________________________________________________________________
____________________________________________________________________________________________________
_   _ ______________________________________________________________________________________________
____________________________________________________________________________________________________
_ ____ _____________________________________________________________________________________________
__ _ _______________________________________________________________________________________________
_ _ ___ ____________________________________________________________________________________________
____________________________________________________________________________________________________
_  __ __ ___________________________________________________________________________________________
____________________________________________________________________________________________________
_ _  ____ __________________________________________________________________________________________
__ ___ _____________________________________________________________________________________________
_ ________ _________________________________________________________________________________________
____________________________________________________________________________________________________
_   _ _ ___ ________________________________________________________________________________________
____ _______________________________________________________________________________________________
_ __________ _______________________________________________________________________________________
__ _____ ___________________________________________________________________________________________
_ _ __ ______ ______________________________________________________________________________________
____________________________________________________________________________________________________
_  _  ___ ____ _____________________________________________________________________________________
____________________________________________________________________________________________________
_ _ ___ _______ ____________________________________________________________________________________
__ _______ _________________________________________________________________________________________
_ ______________ ___________________________________________________________________________________
____ _ _____________________________________________________________________________________________
_   _ __ __ _____ __________________________________________________________________________________
____________________________________________________________________________________________________
_ ________________ _________________________________________________________________________________
__ _________ _______________________________________________________________________________________
_ _  __ _ _________ ________________________________________________________________________________
____________________________________________________________________________________________________
_  __  ______ ______ _______________________________________________________________________________
____________________________________________________________________________________________________
_ _ ______ __________ ______________________________________________________________________________
__ _ ___ _____ _____________________________________________________________________________________
_ ____________________ _____________________________________________________________________________
____________________________________________________________________________________________________
_   _ _ ___ ___ _______ ____________________________________________________________________________
______ _____________________________________________________________________________________________
_ __ ____ ______________ ___________________________________________________________________________
__ _____________ ___________________________________________________________________________________
_ _ ________ ____________ __________________________________________________________________________
____________________________________________________________________________________________________
_  __ __ ________ ________ _________________________________________________________________________
____ _____ _________________________________________________________________________________________
_ _ __  _____ _____________ ________________________________________________________________________
__ _______________ _________________________________________________________________________________
_ __________________________ _______________________________________________________________________
____________________________________________________________________________________________________
_     ___ _ __ ____ _________ ______________________________________________________________________
____________________________________________________________________________________________________
_ ____________________________ _____________________________________________________________________
__ ___ _ ___________ _______________________________________________________________________________
_ _ ___ _______ _______________ ____________________________________________________________________
____ _______ _______________________________________________________________________________________
_  __ ____ __________ __________ ___________________________________________________________________
____________________________________________________________________________________________________
_ _ ____________ ________________ __________________________________________________________________
__ ___________________ _____________________________________________________________________________
_ __ _ __ ___ ____________________ _________________________________________________________________
____________________________________________________________________________________________________
_   _ _  __ _____ _____ ___________ ________________________________________________________________
____________________________________________________________________________________________________
_ __________________________________ _______________________________________________________________
__ _ _________ _________ ___________________________________________________________________________
_ _ ______________ __________________ ______________________________________________________________
______ ___ _________________________________________________________________________________________
_  __ ______ ____________ ____________ _____________________________________________________________
____________________________________________________________________________________________________
_ _  __ _ _____ ___ ___________________ ____________________________________________________________
__ _____ _________________ _________________________________________________________________________
_ ______________________________________ ___________________________________________________________
____________________________________________________________________________________________________
_   _  ____ _ ______ ______ _____________ __________________________________________________________
____ ___________ ___________________________________________________________________________________
_ ________________________________________ _________________________________________________________
__ _________________________ _______________________________________________________________________
_ _ ___ __ __________ _____________________ ________________________________________________________
____________________________________________________________________________________________________
_  _  __  ____ __ ___________ ______________ _______________________________________________________
______ _____ _______________________________________________________________________________________
_ _ __________________ ______________________ ______________________________________________________
__ ___________________________ _____________________________________________________________________
_ ____________________________________________ _____________________________________________________
____ _____________ _________________________________________________________________________________
_   _ _ ___ ___ _______ _______ _______________ ____________________________________________________
____________________________________________________________________________________________________
_ ____ ______ __________________________________ ___________________________________________________
__ _____ _ _____________________ ___________________________________________________________________
_ _  ____ _________ ____ ________________________ __________________________________________________

ตอนนี้รวมถึง Extra-Special ™ Mega-Colorful Red © Highlight-Magic ™ Extended Edition ©: (คลิกที่ภาพเพื่อขยาย)

ทับทิมมีสี, 110 ตัวอักษร

puts (1..n=gets.to_i).map{|a|x=(2..n).map{|b|a!=b&&a%b==0? ' ':?_}.join;x.index(' ')??_+x :"\e[41m_#{x}\e[0m"}

ฉบับขยาย


1
ดูเหมือนว่ามันควรจะเป็นเศษส่วน ...
Beta Decay

' 'นำพื้นที่ภายในประกอบไปด้วยก่อนที่ มันอาจทำให้ปากกาเน้นข้อความของคุณยุ่งเหยิง แต่ก็ยังทำงานได้ดี นอกจากนี้a%b<1
มูลค่าหมึก

*''จะทำงานเช่นเดียวกับการเข้าร่วมและคุณสามารถตรวจสอบa<bแทนa!=bเนื่องจากไม่มีตัวประกอบของ a มากกว่า นอกจากนี้ยังอาจประหยัดได้จากการแบ่งเป็นสองสายอักขระด้วยผลลัพธ์ของคณิตศาสตร์บางอย่างบน a และ b แทนที่จะใช้ ternary
ชำนาญในประวัติศาสตร์

5

J - 28 ตัวอักษร

1('_ '{~0==+&|:1&=+|/~)@:+i.

อธิบายโดยการระเบิด:

1(                    )@:+i.  NB. on vector 1..n, do
                   |/~        NB. take the table "column modulo row"
               1&=+           NB. add 1 to column 1
          =                   NB. identity matrix of size 10
            &|:               NB. transpose both tables (now table is row mod col)
           +                  NB. add them
  '_ '{~0=                    NB. space if cell=0 else underscore

ดูเหมือนว่า:

   1('_ '{~0==+&|:1&=+|/~)@:+i.25
_________________________
_________________________
_________________________
_ _______________________
_________________________
_  ______________________
_________________________
_ _ _____________________
__ ______________________
_ __ ____________________
_________________________
_   _ ___________________
_________________________
_ ____ __________________
__ _ ____________________
_ _ ___ _________________
_________________________
_  __ __ ________________
_________________________
_ _  ____ _______________
__ ___ __________________
_ ________ ______________
_________________________
_   _ _ ___ _____________
____ ____________________

4

Python 2, 76 71

r=range(1,input()+1)
for i in r:print''.join("_ "[i%j<1<j<i]for j in r)

ไม่แน่ใจว่ามันจะได้รับการใด ๆ ที่สั้นกว่านี้ ... คำหลักเหล่านี้: range, inputและprintค่าใช้จ่ายค่อนข้างมาก


3
คุณสามารถแทนที่i>j>1and i%j<1ด้วยi>j>1>i%j
seequ

@Sieg: เจ๋ง! มันเป็นครั้งแรกที่ฉันใช้ประโยชน์จากการเปรียบเทียบแบบแบ่งส่วน
Falko

ฉันได้เขียนรหัสตัวอักษรสำหรับอักขระถึงชื่อ var รวมถึงi%j<1<j<i:-P ดังนั้นบางทีมันอาจจะไม่สั้นลงเลย
xnor

อันที่จริงผมคิดว่า (ไม่ได้ทดสอบ) i%j<1ที่คุณสามารถทำได้ i>=jมันหมายถึง
seequ

@ ซิก: ใช่ แต่เราต้องการi>jไม่i>=jหลีกเลี่ยงช่องว่างในแนวทแยง
Falko

3

APL (28)

'_ '[(1+(1≠⊢)∧≠∧0=|⍨)/¨⍳2⍴⎕]

คำอธิบาย:

  • ⍳2⍴⎕: อ่านตัวเลข N แล้วสร้างเมทริกซ์พิกัด N-by-N
  • (... )/¨: สำหรับแต่ละคู่ของพิกัดใช้ฟังก์ชั่นต่อไปนี้:
    • เซลล์ต้องมีช่องว่างถ้า:
    • 0=|⍨: y modx = 0 และ
    • : x ไม่เท่ากับ y และ
    • 1≠⊢: x 1ไม่
    • 1+: เพิ่ม1ไปยังเมทริกซ์บิตที่ได้เนื่องจากอาร์เรย์ APL เริ่มต้นที่ 1
  • '_ '[... ]: แทนที่แต่ละอัน1ด้วยเครื่องหมายขีดล่างและ2เว้นวรรค

เห็นได้ชัดว่า 28 เป็นหมายเลขมายากลกอล์ฟที่นี่

2

Perl,    69   61

อัปเดตเวอร์ชันแล้ว (ขอบคุณเดนนิส !)

$n=<>;for$i(1..$n){say"_".join"",map{$i%$_|$i==$_?_:$"}2..$n}

รุ่นเดิม:

$n=<>;for$i(1..$n){say"_".join("",map{$i%$_||$i==$_?"_":" "}(2..$n))}

1
1. ทั้งjoinมิได้2..$nจำเป็นต้องวงเล็บ 2. ด้วย-nสวิทช์, คุณสามารถใช้แทน$_ $n3. _เป็น bareword ที่ถูกต้องดังนั้นจึงไม่จำเป็นต้องมีเครื่องหมายคำพูด 4. คุณสามารถใช้แทน$" " "5. คุณสามารถใช้แทน| ||
เดนนิส

@Dennis - ขอบคุณ! ฉันสมัครไปสองสามข้อ ผมไม่ได้ทำสิ่งที่เพราะผมอยากจะให้มันเป็นโปรแกรมที่ตัวเองและไม่ต้องพูด-n $^N=1การใช้งานของ_bareword ทำงานในกรณีของ$i==_แต่ไม่ได้ทำงานในกรณีของ$i%_เพราะ parser คิดว่า%_แฮช
ทอดด์เลห์แมน

1
1. คุณสามารถเก็บมันไว้ในตัวด้วย shebang ( #!/bin/perl -nโดยปกติจะนับเป็น 1 ไบต์) แต่นั่นก็ขึ้นอยู่กับคุณแล้ว ฉันไม่รู้ว่า$^N=1จะทำอะไร... 2. $i==_ทำงานไม่ถูกต้อง $i == "_"มันจะทดสอบว่า สิ่งที่ผมหมายถึงคือใช้_แทน"_"คือและsay _ $i==$_?_:$"
เดนนิส

@Dennis - อึโอ้โหคุณพูดถูกแล้ว การแก้ไขที่ฉันทำแนะนำให้เป็นเส้นทแยงมุมผ่านเมทริกซ์ น่าอายที่ฉันไม่จับมัน แก้ไขแล้ว. ฉันเห็นสิ่งที่คุณหมายถึงเกี่ยวกับ_= "_"ตอนนี้ น่าเสียดายที่มันใช้งานได้ในกรณีหลัง แต่ทำให้ฉันมีข้อผิดพลาดถัดจากsayเพราะฉันคิดว่ามันเป็นไฟล์แฮนด์บอล
ทอดด์เลห์แมน

2

CJam, 27 ไบต์

q~:I,{__I?'_*S+I*I<'_t}%zN*

ลองออนไลน์

วิธีนี้ทำให้ได้จำนวนไบต์เท่ากับคำตอบอื่น ๆ ของฉัน แต่ฉันคิดว่ามันคุ้มค่าที่จะโพสต์ แทนที่จะทำเครื่องหมายทวีคูณที่เหมาะสมในทุกแถวมันทำสิ่งที่ข้อกำหนดระบุ

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

q~:I                         " Read an integer I from STDIN.                              ";
    ,{                }%     " For each J ∊ {1,...,I}:                                    ";
          '_*S+              " Push J - 1 underscores followed by a space.                ";
               I*I<          " Repeat the pattern to complete I characters.               ";
       _I?                   " For the first row, replace all spaces with underscores.    ";
      _            '_t       " Replace the Jth character by an underscore.                ";
                        zN*  " Transpose rows and columns; separate with linefeeds.       ";

ตัวอย่างการวิ่ง

$ cjam prime-lines.cjam <<< 10; echo
__________
__________
__________
_ ________
__________
_  _______
__________
_ _ ______
__ _______
_ __ _____
$ cjam prime-lines.cjam <<< 100 | md5sum # no trailing newline
83c7b974e1510f482322456a9dbb461f  -

1

C, 143

เห็นได้ชัดว่า C ไม่ใช่ตัวเลือกที่ถูกต้องสำหรับภาษา แต่เพื่อความสมบูรณ์นี่เป็นวิธีหนึ่งที่เป็นไปได้ที่จะทำใน C. ทำงานสำหรับค่าของnถึง 1048575 อ่านnจากอินพุตมาตรฐาน

#include <stdio.h>
main(){int n,i=0,j;scanf("%d",&n);char x[1<<20];x[n+1]=0;
for(;++i<=n;){for(j=0;++j<=n;)x[j]=i%j|i==j|j==1?95:32;puts(x+1);}}

มันเร็วมากอย่างไรก็ตาม

  • รันไทม์สำหรับn = 1,000,000 (ซึ่งสร้างกริด 1,000,000,000,000 องค์ประกอบ) ใช้เวลาประมาณ 55 นาทีในระบบของฉัน

  • รันไทม์สำหรับn = 1,000 (ซึ่ง produes กริด 1,000,000 องค์ประกอบ) น้อยกว่า 1/100 วินาที


4
1. การรวมไม่จำเป็นสำหรับคอมไพเลอร์บางตัว (เช่น GCC) เพื่อให้คุณสามารถลบออกได้ 2. ตัวแปรที่ทั่วโลกเริ่มต้น 0 และเริ่มต้นเพื่อให้คุณสามารถใช้int char x[1<<20];n,i,j;main...3. บันทึกไบต์ที่สองมากกว่าfor(scanf("%d",&n);i++<n;) scanf("%d",&n);for(;++i<=n;)
เดนนิส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.