Créons une grille N × N d'espaces et de traits de soulignement qui peuvent être utilisés pour déterminer visuellement si un nombre est premier. (N peut être n'importe quel entier positif.)
Cette grille a trois règles simples:
- La nième colonne contient le motif répété de n - 1 traits de soulignement suivis d'un espace. Ce modèle commence à la première ligne et est arrêté, peut-être au milieu du modèle, à la ligne N. (Les lignes et les colonnes sont indexées sur 1.)
- La première colonne est remplacée par tous les traits de soulignement au lieu de tous les espaces.
- Si un espace apparaît quelque part, l'index de ligne est égal à l'index de colonne, il est remplacé par un trait de soulignement.
Exemple: N = 10
1
1234567890 <-- column indices
1__________
2__________
3__________
4_ ________
5__________
6_ _______
7__________
8_ _ ______
9__ _______
10_ __ _____
^ row indices
Les indices sont juste pour la clarté. La grille simple elle-même (ce que votre programme doit produire) est:
__________
__________
__________
_ ________
__________
_ _______
__________
_ _ ______
__ _______
_ __ _____
Remarquerez que:
- La première colonne est entièrement soulignée.
- La deuxième colonne contient l'espace de soulignement, l'espace de soulignement, etc., à l'exception du trait de soulignement de la ligne 2.
- La troisième colonne contient l'espace de soulignement, l'espace de soulignement, etc., à l'exception du trait de soulignement de la ligne 3.
- etc.
Notez également qu'en dehors de 1, seules les lignes numérotées principales ont des traits de soulignement dans chaque colonne.
Étant donné que les traits de soulignement couvrent toute la largeur de la police, chaque ligne numérotée principale forme une ligne continue continue. Donc, vérifier si un nombre est premier ou non est assez facile visuellement; vérifiez simplement si sa ligne est solide sur toutes les colonnes. (En fait, la recherche de la racine carrée de l'index de ligne suffit mais la sortie de cette grille semble moins élégante.)
Programme
Écrivez un programme qui dessinera ces grilles étant donné N via stdin (ou l'alternative la plus proche). La sortie va vers stdout (ou l'alternative la plus proche) et ne doit contenir que des espaces, des traits de soulignement et des retours à la ligne, avec un retour à la ligne facultatif.
Le code le plus court gagne.
n
e ligne, faites duk
th caractère un espace sik
est un diviseurm
qui n'est pas 1 oum
.Réponses:
CJam,
332827 octetsEssayez-le en ligne.
Comment ça fonctionne
Exemple d'exécution
la source
Ruby,
7773 caractèresQuelques astuces que j'ai utilisées:
L'
..
opérateur a presque la priorité la plus faible de tous les opérateurs dans Ruby, donc(1..n=gets.to_i)
fonctionne juste.Au lieu d'ajouter une
a!=1
condition supplémentaire lors de la vérification pour voir si le caractère doit être un espace au lieu d'un trait de soulignement (puisque la première ligne est tous des traits de soulignement), j'ai juste commencé la plage à partir de2
et ajouté un supplément?_
.La ligne A peut devenir la ligne B:
parce que je dois avoir un espace supplémentaire entre
b
et?
dans la ligne A, mais ce n'est pas nécessaire entre0
et?
dans la ligne B.b?
est une méthode Ruby valide, mais ce0?
n'est pas le cas.puts
joindra automatiquement les tableaux avec les nouvelles lignes pour vous, supprimant le besoin d'un supplément*"\n"
.Sortie pour
n=100
:Inclut maintenant Extra-Special ™ Mega-Colorful Red © Highlight-Magic ™ ® Extended Edition ©: (cliquez sur la vignette pour l'agrandir)
Rubis de couleur, 110 caractères
la source
' '
. Cela gâche probablement votre surligneur de syntaxe, mais il fonctionne toujours correctement. Aussi,a%b<1
*''
fonctionnera de la même manière que join, et vous pouvez vérifier aua<b
lieu dea!=b
car aucun facteur de a n'est supérieur à a. Il pourrait également y avoir des économies de découpage en une chaîne de deux caractères avec le résultat de quelques calculs sur a et b au lieu d'utiliser un ternaire.J - 28 caractères
Expliqué par l'explosion:
À quoi il ressemble:
la source
Python 2,
7671Je ne sais pas si elle peut obtenir une plus courte que ce ... Ces mots - clés:
range
,input
etprint
coûter beaucoup.la source
i>j>1and i%j<1
pari>j>1>i%j
i%j<1<j<i
:-P. Alors peut-être que ça ne raccourcit pas vraiment.i%j<1
. Cela impliquei>=j
.i>j
nei>=j
pas éviter les blancs sur la diagonale.APL (28)
Explication:
⍳2⍴⎕
: lire un nombre N et faire une matrice de coordonnées N par N(
...)/¨
: pour chaque paire de coordonnées, appliquez la fonction suivante:0=|⍨
: ymod
x = 0, et≠
: x n'est pas égal à y, et1≠⊢
: x ne l'est pas1
.1+
: Ajouter1
à la matrice de bits résultante car les tableaux APL commencent à 1.'_ '[
...]
: remplacez chacun1
par un trait de soulignement et2
par un espace.la source
Perl,
6961Version mise à jour (merci Dennis !)
Version originale:
la source
join
ni2..$n
besoin de parenthèses. 2. Avec le-n
commutateur, vous pouvez utiliser à la$_
place de$n
. 3._
est un mot vide valide, il n'a donc pas besoin de guillemets. 4. Vous pouvez utiliser$"
au lieu de" "
. 5. Vous pouvez utiliser|
au lieu de||
.-n
fait parce que je voulais le garder un programme autonome et ne pas avoir à dire$^N=1
. L'utilisation de_
as a bareword a fonctionné dans le cas de$i==_
mais n'a pas fonctionné dans le cas de$i%_
parce que l'analyseur pensait que%_
c'était un hachage.#!/bin/perl -n
est généralement compté comme 1 octet), mais cela dépend évidemment de vous. Je n'ai aucune idée de ce qui$^N=1
fonctionne ... 2.$i==_
ne fonctionnera pas correctement; il testera si$i == "_"
. Ce que je voulais dire, c'est utiliser à la_
place de"_"
, c'est-à-diresay _
et$i==$_?_:$"
._
="_"
maintenant. Malheureusement, cela fonctionne dans ce dernier cas mais me donne une erreur à côté desay
car il semble penser que c'est un descripteur de fichier.CJam, 27 octets
Essayez-le en ligne.
Cette approche atteint le même nombre d'octets que mon autre réponse, mais je pensais que cela valait quand même la peine d'être publié. Au lieu de marquer les multiples appropriés dans chaque ligne, il fait exactement ce que dit la spécification.
Comment ça fonctionne
Exemple d'exécution
la source
C, 143
C n'est évidemment pas le bon choix de langage pour cela. Mais pour être complet, voici une façon possible de le faire en C. Fonctionne pour des valeurs de n jusqu'à 1048575. Lit n à partir de l'entrée standard.
C'est cependant très rapide.
L'autonomie pour n = 1 000 000 (qui produit une grille de 1 000 000 000 000 d'éléments) est d'environ 55 minutes sur mon système.
Le temps d'exécution pour n = 1000 (qui produit une grille de 1 000 000 éléments) est inférieur à 1/100 de seconde.
la source
int
, vous pouvez donc les utiliserchar x[1<<20];n,i,j;main...
. 3.for(scanf("%d",&n);i++<n;)
enregistre deux octets de plusscanf("%d",&n);for(;++i<=n;)
.