Questi miei primi sono sempre solidi


12

Creiamo una griglia N × N di spazi e caratteri di sottolineatura che può essere utilizzata per determinare visivamente se un numero è primo. (N può essere qualsiasi numero intero positivo.)

Questa griglia ha tre semplici regole:

  1. L'ennesima colonna contiene il motivo ripetuto di n - 1 caratteri di sottolineatura seguito da uno spazio. Questo modello inizia dalla prima riga e viene interrotto, possibilmente a metà percorso, nella riga N. (Le righe e le colonne sono indicizzate 1).
  2. La prima colonna è sostituita da tutti i trattini bassi anziché da tutti gli spazi.
  3. Se uno spazio si presenta da qualche parte, l'indice di riga è uguale all'indice di colonna, viene sostituito da un carattere di sottolineatura.

Esempio: N = 10

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

Gli indici sono solo per chiarezza. La stessa griglia (ciò che il tuo programma deve produrre) è:

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

Notare che:

  • La prima colonna contiene tutti i trattini bassi.
  • La seconda colonna indica lo spazio di sottolineatura, lo spazio di sottolineatura, ecc., Ad eccezione del carattere di sottolineatura nella riga 2.
  • La terza colonna indica lo spazio di sottolineatura, lo spazio di sottolineatura e così via, eccetto il carattere di sottolineatura nella riga 3.
  • eccetera.

Si noti inoltre che oltre a 1, solo le righe con numeri primi hanno caratteri di sottolineatura in ogni colonna.

Poiché i caratteri di sottolineatura coprono l'intera larghezza del carattere, ogni riga numerata per primo forma una linea continua continua. Quindi controllare se un numero è primo o no è abbastanza facile visivamente; controlla solo se la sua linea è solida su tutte le colonne. (In effetti è sufficiente guardare la radice quadrata dell'indice di riga ma emettere quella griglia sembra meno elegante.)

Programma

Scrivi un programma che disegnerà queste griglie fornite da N tramite stdin (o l'alternativa più vicina). L'output va allo stdout (o alternativa più vicina) e dovrebbe contenere solo spazi, trattini bassi e newline, con una nuova riga finale opzionale.

Vince il codice più corto.


Non capisco come determina il numero primo
Filip Bartuzi,

5
@FilipBartuzi Forse dai un'occhiata a en.wikipedia.org/wiki/Sieve_of_Eratosthenes

"L'ennesima colonna contiene lo schema ripetuto di n - 1 caratteri di sottolineatura seguito da uno spazio." Quindi la colonna n = 1 non dovrebbe essere tutti gli spazi, non tutti i trattini bassi?
algoritmo

6
Devo dire che non mi piace particolarmente il requisito "no trailing newline". Questo è molto difficile in alcune lingue, decisamente impossibile in altre e riguarda solo i programmi che stampano su STDOUT.
Dennis,

4
La descrizione è stata difficile da capire per me. Ecco come lo descriverei: inizia con una griglia di N righe di N trattini bassi. Per la nlinea th, fai in modo che il kcarattere th sia uno spazio se kè un divisore di mquello non è 1 o m.
Casey Chu,

Risposte:


7

CJam, 33 28 27 byte

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

Provalo online.

Come funziona

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

Esempio di esecuzione

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

Pubblicherò una spiegazione quando avrò finito di giocare a golf.
Dennis,

9
33 byte e non hai finito di giocare a golf ??

5

Rubino, 77 73 caratteri

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

Alcuni trucchi che ho usato:

  • L' ..operatore ha quasi la precedenza più bassa di tutti gli operatori in Ruby, quindi (1..n=gets.to_i)funziona.

  • Invece di aggiungere una a!=1condizione aggiuntiva durante il controllo per vedere se il personaggio dovrebbe essere uno spazio anziché un carattere di sottolineatura (poiché la prima riga è tutta di sottolineatura), ho appena iniziato l'intervallo 2e ho aggiunto un extra ?_.

  • La linea A può diventare linea B:

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

    perché devo avere uno spazio aggiuntivo tra be ?nella riga A, ma non è necessario tra 0e ?nella riga B. b?è un metodo Ruby valido, ma 0?non lo è.

  • putssi unirà automaticamente alle matrici con nuove righe per te, eliminando la necessità di un extra *"\n".

Uscita per n=100:

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

Ora incluso Extra-Special ™ Mega-Colorful Red © Highlight-Magic ™ ® Extended Edition ©: (clicca sulla miniatura per ingrandire)

Rubino con colore, 110 caratteri

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

Edizione estesa


1
Sembra che dovrebbe essere un frattale ...
Decadimento beta

Rimuovere lo spazio all'interno del ternario prima del ' '. Probabilmente incasina l'evidenziatore della sintassi, ma funziona ancora correttamente. Inoltre,a%b<1
Value Ink

*''funzionerà come join, ed è possibile verificare a<binvece che a!=bpoiché nessun fattore di a è maggiore di a. Potrebbero esserci anche risparmi nel tagliare una stringa di due caratteri con il risultato di alcuni calcoli su aeb invece di usare un ternario.
istocratico

5

J - 28 caratteri

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

Spiegato dall'esplosione:

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

Cosa sembra:

   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)

Non so se si può ottenere qualsiasi più breve di questo ... Queste parole chiave: range, inpute printcostare un bel po '.


3
Puoi sostituirlo i>j>1and i%j<1coni>j>1>i%j
seequ,

@Sieg: Cool! In realtà è la mia prima volta a sfruttare questi confronti concatenati.
Falko,

Avevo scritto questo codice esatto carattere per carattere fino a nomi var, incluso il i%j<1<j<i:-P. Quindi forse non si riduce affatto.
xnor

In realtà, penso (non testato) che puoi fare i%j<1. Implica i>=j.
Seequ,

@Sieg: Sì, ma è necessario i>j, i>=jper evitare spazi vuoti sulla diagonale.
Falko,

3

APL (28)

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

Spiegazione:

  • ⍳2⍴⎕: legge un numero N e crea una matrice di coordinate N-by-N
  • (... )/¨: per ogni coppia di coordinate, applica la seguente funzione:
    • Una cella deve avere uno spazio se:
    • 0=|⍨: y modx = 0 e
    • : x non è uguale a y e
    • 1≠⊢: x non lo è 1.
    • 1+: Aggiungi 1alla matrice di bit risultante perché le matrici APL iniziano da 1.
  • '_ '[... ]: sostituisci ciascuno 1con un carattere di sottolineatura e 2uno spazio.

Apparentemente 28 è il numero magico del golf qui.

2

Perl,    69   61

Versione aggiornata (grazie, Dennis !)

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

Versione originale:

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

1
1. Né join2..$nnecessità parentesi. 2. Con l' -ninterruttore, è possibile utilizzare $_invece di $n. 3. _è un bareword valido, quindi non necessita di virgolette. 4. È possibile utilizzare $"invece di " ". 5. È possibile utilizzare | invece di ||.
Dennis,

@Dennis - Grazie! Ne ho applicati alcuni. Non ho fatto la -ncosa perché volevo mantenerla un programma autonomo e non dovevo dirlo $^N=1. L'uso di _come bareword ha funzionato nel caso di, $i==_ma non ha funzionato nel caso di $i%_perché il parser pensava %_fosse un hash.
Todd Lehman,

1
1. Puoi tenerlo autonomo con uno shebang (di #!/bin/perl -nsolito viene conteggiato come 1 byte), ma ovviamente dipende da te. Non ho idea di cosa $^N=1... 2. $i==_non funzionerà correttamente; verificherà se $i == "_". Quello che intendevo è usare _invece di "_", cioè, say _e $i==$_?_:$".
Dennis,

@Dennis - ohhhh merda, hai ragione. La modifica che ho apportato ha introdotto una linea diagonale attraverso la matrice. Vergogna per non averlo preso. Fisso. Capisco cosa intendi per _= "_"ora. Sfortunatamente, funziona in quest'ultimo caso, ma mi dà un errore accanto al sayperché sembra pensare che sia un filehandle.
Todd Lehman,

2

CJam, 27 byte

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

Provalo online.

Questo approccio raggiunge lo stesso numero di byte dell'altra mia risposta, ma ho pensato che valesse la pena pubblicare comunque. Invece di contrassegnare i multipli corretti in ogni riga, fa esattamente quello che dice la specifica.

Come funziona

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

Esempio di esecuzione

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

1

C, 143

C non è ovviamente la scelta della lingua giusta per questo. Ma per completezza, ecco un modo possibile per farlo in C. Funziona per valori di n fino a 1048575. Legge n da input standard.

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

È molto veloce, tuttavia.

  • Il tempo di esecuzione per n = 1.000.000 (che produce una griglia di 1.000.000.000.000 di elementi) è di circa 55 minuti sul mio sistema.

  • Il tempo di esecuzione per n = 1000 (che produce una griglia di 1.000.000 di elementi) è inferiore a 1/100 di secondo.


4
1. L'inclusione non è necessaria per alcuni compilatori (ad es. GCC), quindi è possibile rimuoverlo. 2. Le variabili globali vengono inizializzate su 0 e predefinite su int, in modo da poterle utilizzare char x[1<<20];n,i,j;main.... 3. for(scanf("%d",&n);i++<n;)salva due byte sopra scanf("%d",&n);for(;++i<=n;).
Dennis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.