Bu Asallarım Her Zaman Katı Hatlardır


12

Bir sayının asal olup olmadığını görsel olarak belirlemek için kullanılabilecek bir N × N boşluk ve alt çizgi ızgarası oluşturalım. (N herhangi bir pozitif tam sayı olabilir.)

Bu ızgara üç basit kurala sahiptir:

  1. N'inci sütun, n - 1 alt çizgilerinin ardından bir boşluk izleyen yinelenen modeli içerir. Bu örüntü ilk satırda başlar ve N satırında muhtemelen orta örüntüde durdurulur (Satırlar ve sütunlar 1-indekslenir.)
  2. İlk sütun, tüm boşluklar yerine tüm alt çizgilerle değiştirilir.
  3. Bir yerde bir boşluk oluşursa, satır dizini sütun dizinine eşittir, bunun yerine bir alt çizgi kullanılır.

Örnek: N = 10

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

Endeksler sadece netlik içindir. Düz ızgaranın kendisi (programınızın çıktısı gereken şey):

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

Dikkat:

  • İlk sütun tüm alt çizgilerdir.
  • İkinci sütun, 2. satırdaki alt çizgi hariç alt çizgi uzayı, alt çizgi uzayı vb.
  • Üçüncü sütun, 3. satırdaki alt çizgi hariç alt çizgi alt çizgi, alt çizgi alt çizgi vb. Gider.
  • vb.

Ayrıca, 1'in yanı sıra, her sütunda yalnızca asal numaralı satırların alt çizgileri olduğuna dikkat edin.

Alt çizgiler yazı tipi genişliğinin tamamını kapladığından, her asal numaralı satır kesintisiz bir düz çizgi oluşturur. Yani bir sayının asal olup olmadığını kontrol etmek görsel olarak oldukça kolaydır; çizgisinin tüm sütunlarda düz olup olmadığını kontrol etmeniz yeterlidir. (Aslında satır indeksinin kareköküne bakmak yeterlidir, ancak bu ızgarayı çıktılamak daha az zarif görünüyor.)

program

Stdin (veya en yakın alternatif) üzerinden N verilen bu ızgaraları çizecek bir program yazın. Çıktı stdout'a (veya en yakın alternatife) gider ve yalnızca isteğe bağlı bir son satır olan boşluklar, alt çizgiler ve yeni satırlar içermelidir.

En kısa kod kazanır.


Asal sayıyı nasıl belirlediğini
anlamıyorum


"N'inci sütun, n - 1 alt çizgi ve ardından bir boşluk yinelenen desen içeriyor." Yani n = 1 sütunu tüm boşluklar olmamalı, tüm alt çizgiler olmamalı mı?
algorithmmshark

6
Özellikle "takip eden satırsonu yok" şartını sevmediğimi söylemeliyim. Bu bazı dillerde çok zordur, diğerlerinde düpedüz imkansızdır ve sadece STDOUT'a yazdırılan programları etkiler.
Dennis

4
Açıklamayı anlamak benim için çok zordu. Ben bunu şöyle tarif ederim: N alt çizgi N çizgileri bir ızgara ile başlayın. Bu nsatır için, bu 1'in bir bölen kdeğilse th karakterini boşluk yapın . kmm
Casey Chu

Yanıtlar:


7

CJam, 33 28 27 bayt

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

Çevrimiçi deneyin.

Nasıl çalışır

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.                                                               ";
}         "                                                                               ";

Örnek çalışma

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

Golf yaptığım zaman bir açıklama göndereceğim.
Dennis

9
33 bayt ve golf bitmedi?

5

Ruby, 77 73 karakter

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

Kullandığım bazı püf noktaları:

  • ..Operatör Ruby tüm operatörlerin hemen hemen en düşük önceliğe sahiptir, bu yüzden (1..n=gets.to_i)sadece çalışır.

  • a!=1Karakterin alt çizgi yerine boşluk olup olmadığını kontrol ederken fazladan bir koşul eklemek yerine (ilk satırın tamamı alt çizgi olduğundan), aralığa yeni başladım 2ve fazladan ekledim ?_.

  • A çizgisi B çizgisi olabilir:

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

    çünkü A çizgisi arasında bve ?çizgisinde fazladan boşluk bırakmam gerekiyor, ama B çizgisi arasında 0ve ?B çizgisinde buna ihtiyaç duyulmuyor b?, geçerli bir Ruby yöntemidir, ama 0?değildir.

  • putssizin için yeni satırlarla dizilere otomatik olarak katılır ve fazladan bir ihtiyacı ortadan kaldırır *"\n".

Çıktı n=100:

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

Şimdi Extra-Special ™ Mega Renkli Kırmızı dahil © Highlight-Magic ™ ® Extended Edition ©: (büyütmek için küçük resme tıklayın)

Renkli yakut, 110 karakter

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

Genişletilmiş baskı


1
Bu bir fraktal olmalı gibi görünüyor ...
Beta Çürüme

Önce üçlü içindeki boşluğu kaldırın ' '. Muhtemelen sözdizimi vurgulayıcıyı bozar, ancak yine de düzgün çalışır. Ayrıca,a%b<1
Değer Mürekkep

*''birleştirme ile aynı şekilde çalışır ve a'nın hiçbir faktörü a'dan büyük olmadığından a<bbunun yerine kontrol edebilirsiniz a!=b. Ayrıca, üçlü kullanmak yerine a ve b üzerinde bazı matematik sonuçlarıyla iki karakterli bir dizeye dilimlemekten de tasarruf edilebilir.
histokrat

5

J - 28 karakter

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

Patlama ile açıklanıyor:

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

Ne gibi görünüyor:

   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)

O ... Bu anahtar kelimeler bundan daha kısa alabilirsiniz emin değil: range, inputve printoldukça çok pahalı.


3
Sen yerini alabilir i>j>1and i%j<1ilei>j>1>i%j
seequ

@ Sieg: Harika! Aslında bu birleştirilmiş karşılaştırmaları ilk defa kullanıyorum.
Falko

Ben: i%j<1<j<i-P de dahil olmak üzere var isimlere kadar karakter için bu tam kodu yazmıştı . Belki de gerçekten kısalmaz.
xnor

Aslında, yapabileceğinizi (test edilmediğini) düşünüyorum i%j<1. Bunu ima eder i>=j.
seequ

@Sieg: Evet, ama diyagonaldeki boşluklardan kaçınmaya ihtiyacımız i>jyok i>=j.
Falko

3

APL (28)

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

Açıklama:

  • ⍳2⍴⎕: N sayısını okuyun ve N-N-koordinat matrisi hazırlayın
  • (... )/¨: her bir koordinat çifti için aşağıdaki işlevi uygulayın:
    • Bir hücrenin aşağıdaki durumlarda bir boşluğu olmalıdır:
    • 0=|⍨: y modx = 0 ve
    • : x, y ile eşit değildir ve
    • 1≠⊢: x değil 1.
    • 1+: 1APL dizileri 1'den başladığı için sonuçtaki bit matrisine ekleyin .
  • '_ '[... ]: her birini 1bir alt çizgi ve 2bir boşlukla değiştirin.

Görünüşe göre 28 burada sihirli golf numarası.

2

Perl,    69   61

Güncellenmiş sürüm (teşekkürler, Dennis !)

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

Orijinal versiyon:

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

1
1. Ne joinde 2..$nihtiyaç parantezler. 2. -nAnahtar ile $_yerine kullanabilirsiniz $n. 3. _geçerli bir bareword, bu yüzden tırnak gerekmez. 4. Bunun $"yerine kullanabilirsiniz " ". 5. | yerine kullanabilirsiniz ||.
Dennis

@Dennis - Teşekkürler! Bunlardan birkaçını uyguladım. Bir -nşey yapmadım çünkü bunu kendi içinde bir program olarak tutmak istedim ve söylemek zorunda değildim $^N=1. _Bir bareword olarak kullanılması , ayrıştırıcı bir karma olduğu $i==_için söz konusu $i%_olduğunda çalıştı, ancak işe yaramadı %_.
Todd Lehman

1
1. Sen bir shebang ile kendine yeten tutabilirsiniz ( #!/bin/perl -ngenellikle 1 bayt olarak sayılır), ama bu kesinlikle size kalmış. Ne işe $^N=1yaradığına dair hiçbir fikrim yok ... 2. $i==_düzgün çalışmayacak; eğer test edecek $i == "_". Demek istediğim , yani ve _yerine kullanmak . "_"say _$i==$_?_:$"
Dennis

@Dennis - ohhhh bok, haklısın. Yaptığım düzenleme matrisin içinden çapraz bir çizgi getirdi. Onu yakalamadığım için utanç. Sabit. Ne demek istediğini anlıyorum _= "_"şimdi. Ne yazık ki, ikinci durumda çalışır, ancak bana saybir dosya tanıtıcı olduğunu düşünüyor gibi yanında bir hata verir .
Todd Lehman

2

CJam, 27 bayt

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

Çevrimiçi deneyin.

Bu yaklaşım, diğer cevabımla aynı bayt sayısına ulaşıyor, ancak yine de göndermeye değer olduğunu düşündüm. Her satırda uygun katları işaretlemek yerine, spesifikasyonun söylediklerini aynen yapar.

Nasıl çalışır

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.       ";

Örnek çalışma

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

1

C, 143

C, bunun için doğru dil seçimi değildir. Ancak tamlık için, bunu C'de yapmanın olası bir yolu var . 1048575'e kadar n değerleri için çalışır . Standart girişten n okur .

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

Ancak çok hızlı.

  • Çalışma için , n (bir 1,000,000,000,000 element kafes üreten) = 1,000,000 benim sistemde yaklaşık olarak 55 dakikadır.

  • N = 1000 için çalışma süresi (1.000.000 elemanlı bir ızgarayı başlatır) 1/100 saniyeden azdır.


4
1. Bazı derleyiciler (ör. GCC) için içerme gerekmez, böylece kaldırabilirsiniz. 2. Global değişkenler 0 olarak başlar ve varsayılan olarak kullanılır int, böylece kullanabilirsiniz char x[1<<20];n,i,j;main.... 3. for(scanf("%d",&n);i++<n;)iki bayt kaydeder scanf("%d",&n);for(;++i<=n;).
Dennis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.