Ecrivez un programme qui prend (via STDIN / ligne de commande) un entier non négatif N.
Lorsque N est O
égal à 0, votre programme doit être imprimé (c'est la capitale, Oh, pas zéro).
Lorsque N vaut 1, votre programme devrait imprimer
\|/
-O-
/|\
Quand N vaut 2, votre programme devrait imprimer
\ | /
\|/
--O--
/|\
/ | \
Quand N vaut 3, votre programme devrait imprimer
\ | /
\ | /
\|/
---O---
/|\
/ | \
/ | \
Pour un plus grand N, ce motif continue exactement de la même manière. Chacun des huit rayons du « soleil » doit être faite de N des appropriés -
, |
, /
ou \
caractères.
Détails
- Au lieu d'un programme, vous pouvez écrire une fonction qui prend un entier. La fonction doit imprimer le dessin du soleil normalement ou le renvoyer sous forme de chaîne.
Vous devez soit
- ne pas avoir d'espaces de fin, ou
- n’avez que suffisamment d’espaces de fin pour que le motif soit un rectangle parfait (2N + 1) * (2N + 1).
La sortie de tout ou partie des N peut éventuellement avoir une nouvelle ligne.
Notation
Le code le plus court en octets gagne.
code-golf
ascii-art
kolmogorov-complexity
Les passe-temps de Calvin
la source
la source
N=0
.Réponses:
Pyth,
393836 octetsEssayez-le en ligne: Compilateur / Exécuteur Pyth
Explication
Une autre solution de 36 octets serait:
la source
C:
11610299959290Je pense que je me rapproche assez d'une solution minimale en utilisant cette approche, mais je ne peux m'empêcher de penser qu'il existe une bien meilleure approche dans C. Ungolfed:
la source
c,r;s(n){for(r=c=-n;r<=n;c++)putchar(c>n?c=-c,r++,10:c?r?c-r?c+r?32:47:92:45:r?124:79);}
GNU sed, 252 + 1
Ouf - j'ai battu la réponse php!
Score + 1 pour utiliser le
-r
paramètre.En raison des limitations de sed, nous devons graver près de 100 octets, il suffit de convertir N en chaîne de N espaces. Le reste est le truc amusant.
Explication
:
) convertissent N en une chaîne de N espacess/ //
supprime un espaces^.*^\\&|&/^;ta
convertit les espaces N-1 en:\
+ N-1 espaces +|
+ N-1 espaces +/
\
un espace à droite et/
un espace à gauche ...\|/
, qui est remplacé par-O-
et saute à l'n
étiquettepar
-
et imprimer-0-
par/|\
, et remplacerpar
-
et sauter dans la boucle principale\
un espace à droite et/
un espace à gauche ...\$
qui indique étaient terminés, et quittez.Sortie
la source
J,
373440 octetsUsage:
Explication (de gauche à droite):
i:
génère la liste-n, -(n-1), ..., n-1, n
( )"*/~@i:
crée le produit Descartes de i: avec lui-même dans un arrangement matriciel, par exemple pourn = 1
crée la3-by-3
matrice suivantepour chaque élément de matrice avec des entiers
x y
nous faisons ce qui suit+&|,-,+,[,]
calculer une liste de propriétés+&|
abs(x)+abs(y)
, est égal à0
ssi (si et seulement si)x=0
ety=0
-
xy, égal à0
ssfx=y
on est sur la diagonale+
x + y, égal à0
ssix=-y
on est sur l'anti-diagonale[
x, égal à0
ssfx=0
on est sur la rangée du milieu]
y, est égal à0
Ssfy=0
nous sommes dans la colonne du milieu'O\/-|'#~0=
Comparez ces valeurs de propriété ci-dessus à0
et prenez lei
caractère th de la chaîne'O\/-|'
si lai
propriété th est true.{.
prend le premier caractère d'une chaîne et s'il n'y en a aucun, il retourne un caractère d'espace comme remplissage, comme nous en avons besoin1:echo
Essayez-le en ligne ici.
la source
PHP, 182 octets
Cela semblait être une activité amusante pour ma première réponse. Les commentaires sur mon code sont les bienvenus.
Voici le code non-golfé avec des commentaires:
Édité avec code par royhowie
la source
if(($y-$h)==($x-$h))
fait la même chose queif(($y==$x)
. Vous pouvez enregistrer un autre personnage en le remplaçantif($x==y$)foo();else bar();
parif($x^$y)bar();else foo();
. Vous devriez également essayer d'utiliser des opérateurs ternaires au lieu d'if .. else
instructions.function s($n){$e=2*$n+1;for($i=0;$i<$e*$e;$i++){$x=$i%$e;$y=floor($i/$e);echo$y==$x?($x==$n?"O":"\\"):($e-1==$x+$y?"/":($y==$n?"-":($x==$n?"|":" ")));echo$x==$e-1?"\n":"";}}
$r
; Il suffit d'utiliserecho
($r.=
est la même quantité d'octets queecho
). 2. opérateur ternaire utilisé (enregistre beaucoup de caractères). 3.$h
était inutile puisqu'il égalait$n
. 4. Vous n'avez pas besoin d'utiliserfloor
for$x = floor($i%$e);
, puisqu'un module sur un entier n'aura pas besoin d'être arrondi.Python 2, 99
Prints ligne par ligne, créant chaque ligne en vérifiant si la coordonnée
(i,j)
(centrée sur(0,0)
) satisfaitj==-i
,j==0
,j==i
, ou pas, avec un hack pour faire le travail de la ligne centrale.la source
R
au lieu de.5
sauvegarder 1 octet.CJam,
48 45 43 4138 octetsC'est encore trop long et je continue à faire des choses redondantes, mais voici:
Essayez-le en ligne ici
la source
SpecBAS - 117 octets
Ceci imprime les barres obliques et les tirets dans une boucle, puis pointe le "O" au milieu.
Sortie utilisant 1, 2 et 9
la source
"-": NEXT y: PRINT AT s,s;"O"
de"-";AT s,s;"O": NEXT y
sauver deux octets.JavaScript (ES6) 97
98Cela semble assez différent ...
la source
OS / 2 Classic Rexx, 102 ... ou 14 pour la "version du tricheur"
Sortez les sauts de ligne pour "jouer au golf".
Version du tricheur, nommez le script, quel que soit le code source de votre choix, sous 255 caractères (nécessite un disque HPFS):
EDIT: Juste pour être clair, la version du tricheur n'est pas censée compter! C'est juste pour être stupide et montrer qu'un vieux chien peut encore faire des tours. :)
Par exemple, pour le divertissement et les jeux, implémentation des expressions "lambda" de style Java-8 / C11 sur un itérateur de liste. Non testé, mais devrait fonctionner sur un ordinateur central IBM d'environ 1979. ;)
- Le code d'appel suppose que vous avez déjà créé une tige (tableau), naturellement.
la source
Haskell,
1099896 octetsMerci à nimi et mauris pour leur aide!
Explication:
L'opérateur
#
spécifie quel caractère apparaît aux coordonnées (i, j), avec le soleil centré à (0,0). Functionf
construit la chaîne de résultat en mappant#
toutes les paires de coordonnées allant de -n à n.Usage:
la source
s
, par exemple0#0='O'
,0#_='-'
, etc. , et au1<2
lieu deTrue
.map(i#)[-n..n]
économiser deux octets.R,
177149 octetsMickey T. est l'homme! Il m'a aidé à réparer ma solution initialement incorrecte et à économiser 28 octets. Merci Mickey!
Ungolfed + explication:
Toute autre suggestion est la bienvenue!
la source
scan
n'a pas vraiment besoin duw=
. Il peut également être déplacé plus profondément dans les commandes. Leif
peut être abandonné si vous modifiez la façon dont la matrice est traitée dans quelques cas. En les appliquant, je reçoism=matrix(" ",(w=2*(n=scan()+1)-1),w);m[row(m)-rev(col(m))==0]='/';diag(m)="\\";m[,n]='|';m[n,]="-";m[n,n]="O";m[,w]=paste0(m[,w],'\n');cat(t(m),sep='')
. Plus de golf possible, je pense.C #,
230226 octetsComme demandé, la version non-golfée: string ug (int n) {
Ceci est mon premier post, donc excuses si j'ai fait quelque chose de mal. Tous les commentaires et corrections sont les bienvenus.
la source
s=2*n+1
plutôt ques=(n*2)+1
etw==s-h-1
plutôt que dew==(s-h)-1
le rendre un peu plus court.Ruby:
9892 caractèresProc qui retourne une chaîne avec le soleil.
Échantillon échantillon:
la source
Rouille, 215 caractères
J'ai essayé d'utiliser une méthode de découpage en chaîne (en créant une chaîne d'
n-1
espaces et en effectuant un découpage vers et à partir d'un index) comme ceci:Mais c'est en fait 3 caractères plus long.
Code non golfé:
Ce que j’aime, c’est la façon dont je rase quelques caractères sur les chaînes de formatage. Par exemple,
est équivalent à
parce que "l'incrémentation automatique" de la position de l'argument de chaîne de format n'est pas affectée par la spécification manuelle du nombre et agit de manière totalement indépendante.
la source
Octave 85
Bulding matrices comme toujours =)
eye
produit une matrice d'identité, le reste est explicite, je pense.la source
IDL 8.3, 135 octets
Je ne sais pas si cela peut être joué au golf plus ... C'est très simple. Tout d'abord, nous créons un
m x m
tableau (m=2n+1
) de chaînes vides; puis, nous dessinons les personnages dans les lignes (y=x
,y=-x
,y=n
etx=n
). Ensuite, nous lâchons O en un point(n, n)
et imprimons le tout, sous la forme dem
chaînes de longueur 1 sur chaque ligne, de manière à éviter tout espacement supplémentaire par rapport à l’impression native du tableau.Tester:
la source
Matlab,
9387 octetsMalheureusement, l'entête de la fonction doit être si grosse ... A part ça, je pense que c'est assez bien joué au golf. Je me demande si cela pourrait être mieux fait avec certaines des différences de syntaxe dans Octave.
la source
N=input('')
pour enregistrer 2 caractères. En dehors de cela, vous pouvez simplement écrire[E V D;H 79 H;D V E '']
pour convertir toute la matrice en tableau de caractères, ce qui vous permettra d'économiser un ou plusieurs octets supplémentaires. (Je viens de soumettre un programme Octave avec une approche légèrement différente, mais avant de trouver le vôtre =)Javascript ( ES7 Draft ) 115
la source
Pyth - 52 octets
La partie difficile était de savoir comment changer les barres obliques de chaque côté. Je me suis décidé pour définir un lambda qui utilise les symboles à utiliser.
Peut probablement être joué au golf plus, explication à venir.
Essayez-le en ligne ici .
la source
Perl, 94
Il y a beaucoup d'opérateurs ternaires imbriqués ici, mais je pense que le code est assez simple.
Essayez-le ici: ideone.com/E8MC1d
la source
for$x(-($n=<>)..$n){map{print$x^$_?$x+$_?$x?$_?$":'|':'-':'/':$x?'\\':O}-$n..$n;print$/}
- Quelques ajustements: convertir l’intérieur pour mapper et changer $ y en $ _; en ligne($n=<>)
.C # - 291 (programme complet)
la source
JavaScript (ES6),
139135140 + 1 octets(+1 est pour
-p
drapeau avec noeud dans la console)fixé:
usage:
ungolfed:
la source
(A=Array).from(A(m))
Python 3,
193186 octetsGolfé
Sortie
Ungolfed
la source
s=' ',b='\\',f='/',d='|',g='-'
est très long, alors vous feriez mieux de le déplacer en ajoutants,b,f,d,g=" \/|-"
à la deuxième ligne." \/|-"
comme une seule chaîne, plutôt que de la diviser en caractères individuels. Vous pouvez décompresser d'une chaîne commex,y,z="123"
, ce qui en faitx="1"
,y="2"
etz="3"
.CJam,
5955 octetsCela ne gagnera aucun prix tel quel, mais j'étais assez content que cela fonctionne!
Merci à Sp3000 pour ses astuces de golf.
la source
S
la'
version au lieu de la version pour l'espace et 2)'-A*'O'-A
vous pouvez le faire'-A*_'O\
car la générer deux fois est longPython,
175 129 127125 octetsEssayez-le en ligne ici .
la source
Ruby - 130 octets
usage:
la source
f=->n{a=(0...n).map{|i|(s=' ')*i+?\\+s*(m=n-1-i)+?|+s*(m)+?/+s*i};puts(a+[?-*n+'O'+?-*n]+a.reverse.map(&:reverse))}
(Voir Astuces pour jouer au golf en Ruby pour plus d’informations.)Perl
8591908986BUngolfed:
la source
Prolog, 219 octets
Non, ce n'est pas une langue de golf. Mais je pense que ce site a besoin de plus de Prolog.
Testé avec
swipl
Linux. Invoquer comme ceci:swipl -s asciiSun.prolog
; puis interrogez votre taille de soleil souhaitée:Ungolfed:
la source
JavaScript (ES6),
142140134117 octetsL'essayer
la source