Te moje pierwsze liczby są zawsze ciągłymi liniami

12

Utwórzmy siatkę N × N spacji i znaków podkreślenia, których można użyć do wizualnego ustalenia, czy liczba jest liczbą pierwszą. (N może być dowolną liczbą całkowitą dodatnią).

Ta siatka ma trzy proste zasady:

  1. N-ta kolumna zawiera powtarzający się wzór n-1 znaków podkreślenia, po których następuje jedna spacja. Ten wzorzec zaczyna się w pierwszym rzędzie i jest zatrzymany, być może w połowie wzorca, w rzędzie N. (Rzędy i kolumny mają indeks 1).
  2. Pierwsza kolumna zostaje zastąpiona wszystkimi znakami podkreślenia zamiast wszystkich spacji.
  3. Jeśli gdzieś występuje spacja, indeks wiersza jest równy indeksowi kolumny, zostaje on zastąpiony znakiem podkreślenia.

Przykład: N = 10

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

Wskaźniki służą wyłącznie przejrzystości. Sama zwykła siatka (co program musi wypisać) to:

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

Zauważ, że:

  • Pierwsza kolumna to wszystkie podkreślenia.
  • Druga kolumna to spacja podkreślenia, spacja podkreślenia itp., Z wyjątkiem podkreślenia w wierszu 2.
  • Trzecia kolumna zawiera znak podkreślenia, znak podkreślenia itp., Z wyjątkiem podkreślenia w wierszu 3.
  • itp.

Zauważ również, że oprócz 1 tylko wiersze z liczbami pierwszymi mają podkreślenia w każdej kolumnie.

Ponieważ podkreślenia obejmują całą szerokość czcionki, każdy wiersz z liczbą pierwszą tworzy ciągłą ciągłą linię. Zatem sprawdzenie, czy liczba jest liczbą pierwszą, czy nie, jest dość łatwe wizualnie; po prostu sprawdź, czy jego linia jest ciągła we wszystkich kolumnach. (W rzeczywistości wystarczy spojrzeć na pierwiastek kwadratowy z indeksu wierszy, ale generowanie siatki wydaje się mniej eleganckie).

Program

Napisz program, który narysuje te siatki, otrzymując N poprzez stdin (lub najbliższą alternatywę). Dane wyjściowe są kierowane na standardowe wyjście (lub najbliższą alternatywę) i powinny zawierać tylko spacje, podkreślenia i znaki nowej linii, z opcjonalnym znakiem końca linii.

Najkrótszy kod wygrywa.


źródło
Nie rozumiem, jak to określa liczbę pierwszą
Filip Bartuzi
5
@FilipBartuzi Może sprawdź pl.wikipedia.org/wiki/Sieve_of_Eratosthenes
„N-ta kolumna zawiera powtarzający się wzór n-1 znaków podkreślenia, po których następuje jedna spacja.” Czy więc kolumna n = 1 nie powinna zawierać wszystkich spacji, a nie wszystkich znaków podkreślenia?
algorytmshark
6
Muszę powiedzieć, że nie podoba mi się szczególnie wymóg „brak nowej linii”. Jest to bardzo trudne w niektórych językach, wręcz niemożliwe w innych i wpływa tylko na programy, które drukują do STDOUT.
Dennis
4
Opis był dla mnie trudny do zrozumienia. Tak to opisałbym: Zacznij od siatki N linii N podkreślników. W nwierszu th zmień kznak th na spację, jeśli kjest dzielnikiem, mktóry nie jest równy 1 lub m.
Casey Chu,

Odpowiedzi:

7

CJam, 33 28 27 bajtów

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

Wypróbuj online.

Jak to działa

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

Przykładowy przebieg

$ cjam solid-primes.cjam <<< 10
__________
__________
__________
_ ________
__________
_  _______
__________
_ _ ______
__ _______
_ __ _____
$ cjam solid-primes.cjam <<< 100 | md5sum # trailing newline
e4396b316989813dada21141b569ccf9  -
Dennis
źródło
Wyślę wyjaśnienie, kiedy skończę grać w golfa.
Dennis
9
33 bajty i nie skończyłeś grać w golfa?
5

Ruby, 77 73 znaków

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

Niektóre sztuczki, których użyłem:

  • ..Operator ma prawie najniższy priorytet wszystkich operatorów w Ruby, tak (1..n=gets.to_i)właśnie działa.

  • Zamiast dodawać dodatkowy a!=1warunek podczas sprawdzania, czy znak powinien być spacją zamiast podkreślenia (ponieważ pierwszy wiersz to wszystkie podkreślenia), właśnie zacząłem zakres 2i dodałem dodatkowy ?_.

  • Linia A może stać się linią B:

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

    ponieważ muszę mieć dodatkową spację między bi ?w linii A, ale to nie jest potrzebne między 0i ?w linii B. b?jest prawidłową metodą Rubiego, ale 0?nie jest.

  • putsautomatycznie dołączy do tablic z nowymi liniami, eliminując potrzebę dodatkowych *"\n".

Dane wyjściowe dla n=100:

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

Teraz w tym Extra-Special ™ Mega-kolorowy czerwony © Highlight-Magic ™ ® Extended Edition ©: (kliknij miniaturkę, aby powiększyć)

Rubinowy z kolorem, 110 znaków

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

Rozszerzone wydanie

Klamka
źródło
1
Wygląda na to, że powinien to być fraktal ...
Beta Decay
Usuń przestrzeń w trójce przed ' '. Prawdopodobnie psuje twój zakreślacz składni, ale nadal działa poprawnie. Ponadto,a%b<1
Wartość tuszu
*''będzie działał tak samo jak złączenie i możesz a<bzamiast tego sprawdzić, a!=bponieważ żaden współczynnik a nie jest większy niż a. Oszczędności mogą też wynikać z krojenia na dwuznakowy ciąg z wynikiem pewnej matematyki na a i b zamiast używania trójskładnika.
histocrat 11.04.16
5

J - 28 znaków

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

Wyjaśnione przez wybuch:

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

Jak to wygląda:

   1('_ '{~0==+&|:1&=+|/~)@:+i.25
_________________________
_________________________
_________________________
_ _______________________
_________________________
_  ______________________
_________________________
_ _ _____________________
__ ______________________
_ __ ____________________
_________________________
_   _ ___________________
_________________________
_ ____ __________________
__ _ ____________________
_ _ ___ _________________
_________________________
_  __ __ ________________
_________________________
_ _  ____ _______________
__ ___ __________________
_ ________ ______________
_________________________
_   _ _ ___ _____________
____ ____________________
algorytmshark
źródło
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)

Nie wiem, czy to może dostać każdy krótszy niż ten ... Te słowa kluczowe: range, inputa printkosztują sporo.

Falko
źródło
3
Można wymienić i>j>1and i%j<1zi>j>1>i%j
seequ
@Sieg: Cool! Właściwie to pierwszy raz wykorzystuję te połączone porównania.
Falko
Napisałem ten dokładny kod znak po znaku aż do nazw zmiennych, w tym i%j<1<j<i:-P. Więc może naprawdę nie jest krótszy.
xnor
Właściwie myślę, że możesz (nie przetestowane) zrobić i%j<1. To implikuje i>=j.
patrz
@Sieg: Tak, ale musimy i>j, a nie i>=jdo uniknięcia półfabrykatów na przekątnej.
Falko
3

APL (28)

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

Wyjaśnienie:

  • ⍳2⍴⎕: odczytaj liczbę N i utwórz macierz współrzędnych N-na-N
  • (... )/¨: dla każdej pary współrzędnych zastosuj następującą funkcję:
    • Komórka musi mieć spację, jeśli:
    • 0=|⍨: y modx = 0 i
    • : x nie jest równe y, i
    • 1≠⊢: x nie jest 1.
    • 1+: Dodaj 1do wynikowej macierzy bitów, ponieważ tablice APL zaczynają się od 1.
  • '_ '[... ]: zastąp każdy 1znakiem podkreślenia i 2spacją.
marinus
źródło
Najwyraźniej 28 to magiczna liczba w golfa.
2

Perl,    69   61

Zaktualizowana wersja (dzięki, Dennis !)

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

Orginalna wersja:

$n=<>;for$i(1..$n){say"_".join("",map{$i%$_||$i==$_?"_":" "}(2..$n))}
Todd Lehman
źródło
1
1. Ani nawiasy joinnie są 2..$npotrzebne. 2. Za pomocą -nprzełącznika możesz użyć $_zamiast $n. 3. _jest prawidłowym gołym słowem, więc nie wymaga cudzysłowów. 4. Możesz użyć $"zamiast " ". 5. Możesz użyć | zamiast ||.
Dennis
@Dennis - Dzięki! Zastosowałem kilka z nich. Nie zrobiłem tego -n, ponieważ chciałem, aby był to samodzielny program i nie musiałem mówić $^N=1. Użycie słowa _kluczowego działało w przypadku, $i==_ale nie działało w przypadku, $i%_ponieważ parser myślał, że %_to skrót.
Todd Lehman
1
1. Możesz zachować samowystarczalność za pomocą shebang ( #!/bin/perl -nzwykle jest liczony jako 1 bajt), ale to oczywiście zależy od ciebie. Nie mam pojęcia, co $^N=1działa ... 2. $i==_nie działa poprawnie; sprawdzi, czy $i == "_". Chodziło mi o to stosując _zamiast "_", czyli say _a $i==$_?_:$".
Dennis
@Dennis - o cholera, masz rację. Wprowadzona przeze mnie edycja wprowadziła ukośną linię przez matrycę. Wstyd mi, że tego nie złapałem. Naprawiony. Rozumiem, co masz na myśli _= "_"teraz. Niestety, działa w tym drugim przypadku, ale wyświetla błąd obok, sayponieważ wydaje się, że jest to uchwyt pliku.
Todd Lehman
2

CJam, 27 bajtów

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

Wypróbuj online.

Podejście to osiąga taką samą liczbę bajtów, jak moja inna odpowiedź, ale pomyślałem, że i tak warto to opublikować. Zamiast oznaczać odpowiednie wielokrotności w każdym rzędzie, robi dokładnie to, co mówi specyfikacja.

Jak to działa

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

Przykładowy przebieg

$ cjam prime-lines.cjam <<< 10; echo
__________
__________
__________
_ ________
__________
_  _______
__________
_ _ ______
__ _______
_ __ _____
$ cjam prime-lines.cjam <<< 100 | md5sum # no trailing newline
83c7b974e1510f482322456a9dbb461f  -
Dennis
źródło
1

C 143

C nie jest oczywiście dobrym wyborem do tego celu. Ale dla kompletności, oto jeden możliwy sposób, aby to zrobić w C. Działa dla wartości od n do 1048575. Odczytuje n ze standardowego wejścia.

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

Jest jednak bardzo szybki.

  • Czas działania dla n = 1 000 000 (co daje siatkę 1 000 000 000 000 elementów) wynosi w moim systemie około 55 minut.

  • Czas działania dla n = 1000 (który wytwarza siatkę o wartości 1 000 000 elementów) jest krótszy niż 1/100 sekundy.

Todd Lehman
źródło
4
1. Dołączenie nie jest potrzebne w przypadku niektórych kompilatorów (np. GCC), więc można je usunąć. 2. Zmienne globalne są inicjowane na 0 i domyślnie na int, dzięki czemu można ich używać char x[1<<20];n,i,j;main.... 3. for(scanf("%d",&n);i++<n;)oszczędza dwa bajty scanf("%d",&n);for(;++i<=n;).
Dennis