Dans une question de stackoverflow maintenant supprimée, quelqu'un a publié ce qui suit:
Écrivez un programme ou une fonction pour imprimer des motifs alternatifs dans *
et #
sur la base d'un entier donné n
. Quelques exemples:
Entrée: n=1
Sortie:
*
n=5
Sortie d' entrée :
*####
###**
***##
###**
*####
Entrée: n=8
Sortie:
*#######
######**
***#####
####****
****####
#####***
**######
#######*
Comme cela ressemblait à un défi de golf de code assez cool, le voici.
Comment ces modèles sont-ils construits?
La première ligne commence par un simple *
, suivi par la n-1
quantité de fin #
.
La deuxième ligne en contient alors deux *
, avec une n-2
quantité de interligne #
.
La troisième ligne commence par trois *
, suivie par la n-3
quantité de fuite #
.
etc.
Une fois que nous avons atteint le milieu ( n/2
), nous comptons à nouveau avec la quantité de *
, qui peut être vue dans les exemples ci-dessus.
REMARQUE: pour les nombres d'entrée impairs, la paire de lignes inversée (donc première et dernière; deuxième et avant-dernière; etc.) sont exactement les mêmes. Dans l' n=5
exemple, les première et dernière lignes sont *####
; l'avant-dernière ligne et l'avant-dernière sont ###**
.
Cependant, pour les nombres en entrée pairs, la paire de lignes inversée est inversée. Dans l' n=8
exemple, les première et dernière lignes sont *#######
et #######*
; l'avant-dernière ligne et l'avant-dernière ligne sont ######**
et **######
; etc.
Règles du défi:
- Vous pouvez utiliser deux caractères imprimables distincts au lieu de
*
et#
. Vous pouvez utiliserA
etB
;3
et7
;<
et>
; etc. Veuillez indiquer dans vos réponses ce que vous avez utilisé. - Vous pouvez supposer que ce
n
sera un entier positif (>= 1
) - Vous êtes autorisé à générer une liste / un tableau de chaînes pour chaque ligne ou une matrice 2D de caractères, au lieu de les imprimer sur STDOUT.
Règles générales:
- C'est le code-golf , donc la réponse la plus courte en octets l'emporte.
Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues autres que le golf de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation. - Des règles standard s'appliquent à votre réponse, vous êtes donc autorisé à utiliser STDIN / STDOUT, fonctions / méthode avec les paramètres appropriés et des programmes complets de type retour. Ton appel.
- Les failles par défaut sont interdites.
- Si possible, veuillez ajouter un lien avec un test pour votre code.
- De plus, l'ajout d'une explication à votre réponse est fortement recommandé.
Cas de test (du premier n=1
au dernier n=10
)
*
*#
#*
*##
#**
*##
*###
##**
**##
###*
*####
###**
***##
###**
*####
*#####
####**
***###
###***
**####
#####*
*######
#####**
***####
###****
***####
#####**
*######
*#######
######**
***#####
####****
****####
#####***
**######
#######*
*########
#######**
***######
#####****
*****####
#####****
***######
#######**
*########
*#########
########**
***#######
######****
*****#####
#####*****
****######
#######***
**########
#########*
Réponses:
Gelée , 9 octets
Essayez-le en ligne!
Explication
la source
Python 2 , 62 octets
Essayez-le en ligne!
Usages
x
et espace.Les lignes sont calculées comme ceci:
Utilisation du
%*s
spécificateur pour choisir entren
et-n
.la source
Perl 6 , 57 octets
Essayez-le en ligne!
Utilise la même méthode que la réponse Python de Lynn . Sorties utilisant
*
et espace.la source
MATL,
343118 octetsEssayez-le sur MATL en ligne
Utilise 0 pour * et 1 pour #. Basé sur la réponse Jelly de Lynn .
Ancienne réponse, 31 octets:
Essayez-le sur MATL en ligne
Utilise 1 pour * et 0 pour #.
la source
APL (Dyalog Classic) , 18 octets
Essayez-le en ligne!
sorties
AB
au lieu de*#
⎕
entrée évaluée n⍳⎕
le vecteur0 1 ... n-1
⊢⌊⌽
min (⌊
) entre eux (⊢
) et leur marche arrière (⌽
) - voir trains⊂>⊢⌊⌽
où est le⍳
vecteur dans son ensemble (⊂
) inférieur à chacun de ses⊢⌊⌽
- retourne un vecteur de vecteurs booléens (0/1)⊢∘⌽\
inverser tous les autres vecteurs↑
mélanger dans une matrice⎕a
l'alphabet anglais majuscule,'AB
...Z'
⎕a[
]
remplacer0
1
par'A'
'B'
la source
⎕a[...}
convertir enA
etB
sans espaces est plus court que de les conserver comme0
et1
sans espaces, étant donné que vous l'avez utilisé, mais curieux de savoir s'il y a beaucoup de différence d'octets si vous les gardez comme0
et1
.⎕d[
...]
soit⊃¨⍕¨
... Dans cette dernière expression⍕¨
est "formater chaque" - il transforme chaque nombre en un vecteur de caractères imbriqué , nous avons donc besoin de "d'abord chacun" "(⊃¨
) pour n'obtenir que les scalaires de caractères (et donc aucun espace lors de l'impression).Fusain , 21 octets
Essayez-le en ligne! Utilise
0
et1
. Le lien est vers une version détaillée du code et inclut§*#
ce qui traduit la sortie en*
et#
dans la question. Explication:la source
Gelée ,
1215 octets+3 correction
n=1
du bug de bord de cas :(Un programme complet acceptant un entier qui imprime la sortie telle que définie dans l'OP en utilisant
0
et1
pour*
et#
respectivement.Essayez-le en ligne!
Comment?
la source
Gelée , 15 octets
Essayez-le en ligne!
Programme complet.
*
=1
#
=0
la source
Java 10, 145 octets
Tout le ternaire le rend un peu désordonné, mais cela fonctionne bien. J'ai essayé d'aplatir la boucle imbriquée et diverses autres choses, mais elles n'ont fait qu'augmenter le nombre d'octets. Essayez-le en ligne ici .
Non golfé:
Java
811,179127 octetsEssayez-le en ligne ici (TIO n'a pas encore Java 11, donc cela utilise une méthode personnalisée qui se traduit par le même nombre d'octets que
String#repeat()
).Merci à Kevin Cruijssen d' avoir joué au golf 52 octets!
Non golfé:
la source
"*".repeat(...)
et"#".repeat(...)
(ainsi qu'en renvoyant une chaîne au lieu d'imprimer directement et de jouern-j-1
au golfn+~j
):n->{String r="",a,b;for(int j=0;j<n;b="#".repeat(j<n/2?n+~j:j),r+=(j++%2<1?a+b:b+a)+"\n")a="*".repeat(j<n/2?j+1:n-j);return r;}
repeat()
méthode est vraiment agréable pour le golf.Lua ,
148133octetsEssayez-le en ligne!
-15 octets grâce à @KevinCruijssen et @JoKing.
la source
(n+1)/2
to-~n/2
;or n-i+1
àor-~n-i
;i%2==0
ài%2<1
; etreverse() or
àreverse()or
. En outre, votre version TIO et le nombre d'octets contiennent tous deux un point-virgule de fin qui ne semble pas nécessaire. Belle première réponse, cependant. +1 de moi. Et bienvenue chez PPCG! :)-~n
fait votre suggestion? Ça marche vraiment, mais je ne comprends pas pourquoi.~
est un opérateur de négation unaire au niveau du bit. Cependant, ce qui~i
est important pour le codegolfing, c'est qu'il a la même valeur que-i-1
. On peut donc utiliser à la-~i
place dei+1
et~-i
au lieu dei-1
. Ceci est utile dans deux cas, que je pourrais tous deux utiliser dans votre réponse: se débarrasser des parenthèses, car-
et~
avoir la priorité de l'opérateur sur les autres opérations mathématiques, il(n+1)/2
peut donc en être ainsi-~n/2
. Et l'autre partie utile est de se débarrasser des espaces dans certains cas, comme je l'ai fait avecor-~n-i
.~
pourx+1
etx-1
et Utilisez unaire~
poura-b-1
eta+b+1
. Tous les conseils généraux, ainsi que les conseils spécifiques à la langue ( Conseils pour le golf à Lua dans ce cas), peuvent être intéressants à lire. :)Kotlin , 86 octets
Essayez-le en ligne!
Utilise
x
et espace comme symboles de sortie. Dérive de Lynn Answerla source
Perl 5 +
-pa -MPOSIX -M5.010
, 58 octetsEssayez-le en ligne!
la source
C (gcc) ,
10499 octetsEssayez-le en ligne!
la source
C (gcc) ,
118108octetsCelui-ci ne va pas gagner, mais c'est une approche différente (ou du moins, je pense que oui!) Au lieu de faire des manipulations de cordes, j'utilise le fait quedixX- 1 plus de [ 1 .. n ] = { 9 , 99 , 999 , . . . } , qui peut ensuite être multiplié pour obtenir le motif approprié;
printf()
effectue ensuite le remplissage nul pour la justification à droite.Malheureusement,
int
il n'a qu'une plage suffisante pour faire jusqu'à 9 chiffres (sur les plates-formes 32 bits), vous devez donc aller àlong
pour des modèles plus grands; un langage qui fait nativement l'arithmétique MP pourrait être capable de l'utiliser pour quelque chose.Merci à plafondcat pour la suggestion.
Essayez-le en ligne!
Preuve de concept que cela fonctionne avec l'arithmétique MP:
C # (compilateur mono C #) ,
187165 octets(143 octets + 22 octets pour l'
using System.Numerics;
en-tête)Essayez-le en ligne!
la source
Vim, 99 frappes
Il est toujours intéressant d'essayer de faire vim avec des arguments d'entrée. C'est très contre nature, donc ça ne va pas être incroyablement court. Il existe probablement d'autres bonnes approches à ce sujet.
L'entrée est supposée être par elle-même dans un tampon. Les registres sont supposés être vides. L'éditeur est supposé être assez grand pour contenir le résultat sans défilement (cela pourrait techniquement être évité au prix de certaines frappes).
Explication
Et en base64, avec des caractères réels (mettez les entrées
input
et les toucheskeys
et exécutez en utilisantvim -u NONE -s keys input
)la source
R , 75 octets
Essayez-le en ligne!
n
comme paramètre et renvoyant une matrice d'0/1
où0
correspond'*'
et1
correspond à'#'
la source
K (ngn / k) , 22 octets
Essayez-le en ligne!
{
}
fonction avec argumentx
!x
la liste(0;1;
...;x-1)
i:
affecter ài
i&|i
minima (&
) dei
et son inverse (|
)i>/:
comparer avec supérieur à (>
) pari
rapport à chaque élément de la liste de droite (/:
) - retourner une matrice booléenne (liste de listes)i|:/'
pour chaque ('
) j dansi
, inverse (|:
- nous avons besoin:
de forcer|
pour être unaire) l'élément correspondant j fois (n f/ x
applique lesf
n
temps surx
). Effectivement, inversez toutes les deux rangées."*#"
utiliser des éléments de matrice comme indices dans la chaîne"*#"
la source