Eh bien, résumez vraiment.
Écrivez un programme ou une fonction qui prend une liste non vide d'entiers décimaux (0-9) et sort un "triangle" de chiffres pointant vers le bas avec la liste d'entrée en haut où chaque chiffre après la première ligne est la somme des deux chiffres au-dessus, modulo 10.
Par exemple, l'entrée [7, 5, 0, 9]
a une sortie
7 5 0 9
2 5 9
7 4
1
parce que 2
est (7 + 5) mod 10
, 5
est (5 + 0) mod 10
, 9
est (0 + 9) mod 10
, etc. jusqu'à 1
être (7 + 4) mod 10
.
Si la liste ne contient qu'un seul élément, la sortie correspond à l'entrée; par exemple, une entrée de [4]
donnera
4
Voici quelques exemples supplémentaires:
[0]
0
[1, 2]
1 2
3
[8, 7]
8 7
5
[0, 0]
0 0
0
[1, 4, 2]
1 4 2
5 6
1
[0, 1, 0]
0 1 0
1 1
2
[1, 0, 0, 0]
1 0 0 0
1 0 0
1 0
1
[1, 2, 3, 4]
1 2 3 4
3 5 7
8 2
0
[1, 2, 3, 5, 8]
1 2 3 5 8
3 5 8 3
8 3 1
1 4
5
[9, 2, 4, 5, 3, 2, 2]
9 2 4 5 3 2 2
1 6 9 8 5 4
7 5 7 3 9
2 2 0 2
4 2 2
6 4
0
Notez que dans la sortie:
- La première ligne n'a pas d'espaces de début.
- Chaque ligne suivante a un espace de tête de plus que la ligne précédente.
- Les chiffres sont séparés par un seul espace.
- Chaque ligne peut avoir jusqu'à un espace de fin.
- Il peut y avoir une seule nouvelle ligne de fin facultative.
- Vous devez utiliser les caractères pour les chiffres décimaux normaux (0 à 9).
Le code le plus court en octets gagne. Tiebreaker est une réponse antérieure.
Réponses:
BrainF ** k,
396391 octetsJe n'ai pas pu résister à la tentation de faire celle-ci. Au moins, le triangle est pointu vers le bas.
L'entrée se présente sous la forme d'une chaîne de caractères numériques suivie d'une seule nouvelle ligne.
La sortie contiendra un seul espace de fin sur chaque ligne.
Exemples:
Explication
Comme il est assez difficile d'expliquer le code d'un point de vue fonctionnel, nous pouvons plutôt le regarder du point de vue de l'état de la bande à différents moments. L'idée centrale ici est que le triangle que nous générons est initialisé comme un tableau compact (pour BF, de toute façon) qui diminue de taille de 1 à chaque itération d'une boucle. Une autre pensée importante est que nous utilisons
255
pour indiquer un "espace réservé" que nous pouvons rechercher sur la bande.Initialisation
C'est l'étape la plus simple. Au début du programme, nous exécutons ce qui suit:
Cela force la bande dans l'état suivant (où
>N<
indique l'emplacement du pointeur sur la bande)Le premier numéro ici est un emplacement "tampon". Nous n'allons pas l'utiliser à long terme, mais il est utile de simplifier les petites opérations et de copier les données.
Le deuxième nombre est le nombre d'espaces que nous afficherons au début de chaque ligne, en commençant après la première ligne. La première ligne n'aura pas d'espaces de tête.
Le troisième nombre est le caractère d'espace que nous générons.
Le quatrième nombre est un espace réservé 255, afin que nous puissions revenir à cette position relativement facilement.
Contribution
De cette position, nous lirons tous les caractères. Au terme de cette étape, nous espérons être dans la situation suivante:
Où
a b c d e f ...
indique la chaîne de caractères numériques qui a été entrée (pas la nouvelle ligne).Nous accomplissons cela avec les éléments suivants:
Il y a quelques nuances à cela. Tout d'abord, nous afficherons chaque caractère au fur et à mesure que nous les obtiendrons, puis afficherons un espace après. Deuxièmement, nous ne voulons pas copier la valeur ASCII sur la bande, nous voulons copier le chiffre numérique réel. Troisièmement, nous voulons arrêter lorsque nous atteignons une nouvelle ligne et nous laisser à la bonne place à ce moment-là.
Disons que notre contribution est
6723
. Ensuite, à la lecture du premier6
, notre bande ressemble à ceci:Nous vérifions que cette valeur n'est pas égale à
10
(une nouvelle ligne ASCII) avec,----------[++++++++++
. Nous imprimons ensuite la valeur et continuons en soustrayant simultanément 48 de la valeur d'entrée et en ajoutant 32 à la valeur à côté (>>++++++++[-<++++<------>>]<
), nous laissant ici:Remarquez comment tout au long de ce processus, nous pouvons supposer que tous les chiffres à droite de notre entrée sont 0 - cela signifie que nous ne risquons pas de ruiner un état précédent si nous utilisons des valeurs à droite pour calculer
6 * 8
et4 * 8
.Maintenant, nous sortons le caractère d'espace que nous venons de générer et prenons une nouvelle entrée, supprimant l'espace que nous avons calculé là-bas. Finalement, l'entrée sera terminée par une nouvelle ligne et la boucle se terminera, laissant un
255
où la nouvelle ligne aurait été (,----------]-
). Il s'agit du deuxième caractère d'espace réservé que nous utiliserons pour parcourir la bande. À ce stade de notre scénario, notre bande est exactement la suivante:Calcul
La façon dont cela fonctionne est que la liste des chiffres entre nos
255
espaces réservés va se réduire d'une unité à chaque itération de la boucle. Quand il ne reste plus qu'un chiffre, nous avons terminé et nous devons nous arrêter immédiatement (notez qu'à ce stade, chaque chiffre de cette liste a déjà été sorti, nous n'avons donc pas à nous soucier de le sortir à nouveau).Nous utilisons maintenant cette astuce pour naviguer vers le premier
255
espace réservé:<+[-<+]-
. Cela recherche efficacement une bande sur la gauche pour255
ne rien changer entre les deux. Maintenant que nous avons déplacé le pointeur, nous pouvons vérifier notre condition de sortie: s'il n'y a qu'un seul chiffre dans la liste, alors la cellule deux espaces à droite tiendra255
. Ainsi, nous vérifions cela et commençons une boucle:>>+[-<<
La première étape de notre boucle consiste à sortir une nouvelle ligne. Nous passons donc à la première cellule (notre cellule tampon), y ajoutons 10 et sortons. L'étape suivante consiste à sortir tous les premiers caractères de l'espace. Après leur sortie, nous incrémentons notre comptage pour le nombre d'espaces de tête. Ces étapes sont accomplies comme suit:
Ce qui nous laisse dans cet état:
Notre prochaine étape consiste à copier la première valeur de la liste, au-delà du deuxième espace réservé
255
:Nous le faisons essentiellement en faisant des allers-retours entre nos espaces réservés
255
, nous laissant ici:Nous commençons maintenant une boucle, itérant dans le reste de la liste, s'arrêtant lorsque nous frappons
255
:>+[-<
À ce stade, le chiffre à notre gauche immédiate est toujours 0. Donc, parce que nous les aimons, nous y ajoutons un espace réservé
255
afin de pouvoir revenir à notre place dans la liste. L'étape suivante consiste à déplacer la deuxième place de la liste vers des emplacements autour desquels nous avons déplacé la première place, après le deuxième espace réservé255
. Ces étapes sont accomplies comme suit:Nous laissant ici:
[ 0 2 32 255 255 >0< 2 3 255 7 6 7 0 ]
Maintenant, les deux6
et7
ont été déplacés vers un emplacement où le calcul peut avoir lieu. Nous avons besoin de deux copies du7
car le prochain numéro de la liste en aura également besoin. Le7
immédiatement après le255
sert à cet effet, tandis que l'autre7
sera consommé par le calcul.Tout d'abord, nous ajoutons les deux chiffres:
Nous laissant ici:
La prochaine combinaison d'étapes est la plus compliquée. Nous devons voir si le nombre que nous pointons est supérieur à 10, et si c'est le cas, nous soustrayons
10
. En réalité, ce que nous faisons, c'est que nous en soustrayons 10 et voyons s'il frappe0
à un moment quelconque de la soustraction. Si c'est le cas, nous ajoutons10
plus tard. À la fin de cela, nous devrions avoir la somme modulo 10.À ce stade, nous avons atteint l'objectif. Nous avons la somme modulo 10! Aussi, que le nombre soit supérieur ou non à 10, nous nous retrouverons ici:
Nos prochains objectifs sont de produire cette nouvelle somme, de la suivre avec un espace et de la réinjecter dans notre liste. Nous faisons tout cela avec nos techniques précédentes de
255
sauts et d'ajout48
à notre somme, donc je ne le couvrirai pas en détail.Et nous y sommes:
[ 0 2 32 255 3 255 2 3 255 7 0 0 51 >32< ]
remarquez comment nous mettons un255
espace réservé supplémentaire après notre nouvelle injection3
afin de ne pas perdre de place dans la liste. À ce stade, nous avons sorti notre somme et son espace, nous devons donc nettoyer et revenir à un état où la prochaine itération de cette boucle va fonctionner. Nous devons effacer nos cellules51
et32
, déplacer7
une fois vers la droite et naviguer vers notre espace réservé de liste afin de pouvoir recommencer.Maintenant, nous sommes ici:
[ 0 2 32 255 3 >0< 2 3 255 0 7 0 ... ]
qui est exactement où nous voulons être pour notre prochaine itération. Alors vérifiez 255 et continuez! (
>+]
)Lorsque nous serons retirés de la boucle, nous aurons une toute nouvelle liste - composée des sommes de la liste précédente. La première fois, cela ressemblera à ceci:
Maintenant, nous voulons répéter tout ce processus sur notre nouvelle liste, nous avons donc plop un
255
vers la gauche et tout recommencer! Nous devons faire un peu de nettoyage avec>>[-]<<
, puis supprimer notre espace réservé avec<-
. Après cela, nous sommes exactement au même endroit que nous étions après l'entrée, nous pouvons donc nous en sortir en faisant les mêmes vérifications<+[-<+]->>+
:, et boum! Nous avons notre boucle complète! Nous avons tous besoin est le support de fermeture, et quand il se termine , nous avons déjà tout sortie, donc nous avons terminé:]
.la source
Gelée ,
201918 octetsEssayez-le en ligne!
Contexte
La génération des nombres est simple dans Jelly. La sortie est un peu plus compliquée.
Jelly possède un atome de grille intégré (
G
) qui affiche une liste 2D avec des nouvelles lignes entre les lignes et des espaces entre les colonnes. Nous prenons le tableau 2D de nombres (généré avec chaque ligne inversée) et le transposons avec la valeur de remplissage@
. Après avoir vénéré le tableau résultant et transposé à nouveau, appliquerG
ce qui suit.Pour obtenir la forme triangulaire souhaitée, il suffit de supprimer la valeur de remplissage.
Comment ça marche
la source
Pyth - 18 octets
Suite de tests .
la source
Python 3.5,
747271 octetsL'entrée est une liste d'entiers (par exemple
f([1,2,3,5,8])
), la sortie est vers STDOUT. Le%10
et le fait quemap
renvoie unmap
objet en Python 3 est un peu ennuyeux, ce qui signifie que nous ne pouvons pas fairemap(lambda*x:sum(x)%10,L,L[1:])
ou similaire.La fonction fait une erreur, mais la sortie serait alors terminée. Merci à @xsot pour -1 octet en trouvant un bon endroit pour coller le
print
.la source
f=lambda L,*S:f([sum(x)%10for x in zip(L,L[1:print(*S,*L)]or 1)],'',*S)
None
!print
retourne quelque chose? Je ne connais pas laprint
fonction qui revient.print
fonction de Python revient - oui, elle revientNone
à la finNone
de trancher?05AB1E ,
201917 octetsCode:
Explication:
Utilise l' encodage CP-1252 . Essayez-le en ligne! .
la source
MATL,
3230292827262524 octets1 octet sauvé grâce à @Luis
Essayez-le en ligne!
Version modifiée pour tous les cas de test
Explication
la source
V
autorise le format spec. Vous pouvez enregistrer 1 octet en utilisantZ"
au lieu deO
: voir ce lien (j'ai du mal avec le format dans le commentaire)D
laquelle utilise par défaut les nombres à espace unique.En fait, 43 octets
Essayez-le en ligne!
Ce programme imprime une seule nouvelle ligne de fin après la sortie.
Explication:
la source
Mathematica, 67 octets
Exemple:
la source
CJam, 25 octets
Essayez-le en ligne!
Explication
Cela utilise une astuce assez soignée pour générer la disposition du triangle.
la source
JavaScript (ES6) 147 octets
la source
Julia,
6059 octetsBasé sur la réponse de @ Sp3000 . La fonction
\
accepte un tableau en entrée et renvoie une chaîne.Essayez-le en ligne!
la source
Pyke, 21 octets
Essayez-le ici!
J'aimerais penser que cette méthode est un peu différente.
la source
Perl 6 ,
65 63 6261 octetsExplication:
Exemple:
la source
TSQL,
198194191 octetsEn utilisant GOTO au lieu de l'un des WHILE, j'ai pu jouer au golf à 3 personnages
Golfé
Essayez-le en ligne (en utilisant l'ancien script avec 2 * PENDANT)
la source
Java 7,
230215213 octetsCela a fini par être un peu plus long que je ne le pensais.
Quelques octets enregistrés grâce à @GiacomoGarabello .
Code non testé et testé:
Essayez-le ici.
Sortie:
la source
void p(String s){System.out.print(s);}
et remplacez l'impression standard. Pour l'println
usagep("\n")
. Déplacez leint i
etint j
près duint c=0;
(int c=0,i,j;
) et déplacez l'print(a[i]+" ")
intérieur de lafor
condition afin que vous puissiez retirer les supports pour un total de -11<T>void p(T s){System.out.print(s);}
au lieu devoid p(String s){System.out.print(s);}
.C # 6,
125 + 31125 + 18 = 143 octetsLe +18 est pour
using System.Linq;
Merci à @TheLethalCoder pour avoir économisé 13 octets, en signalant une instruction using inutile
la source
JavaScript (ES6), 77 octets
la source
C, 138 octets
Golfé
Non golfé
la source
C #, 167 octets
Je suis en fait assez fier de cette solution, les expressions lambda sont si amusantes une fois que vous les maîtrisez
ici non golfé pour de nouvelles améliorations:
essayez-le ici
la source
List<int> a
->int[] a
,int x=a.Count
->int x=a.Length
,.ToList()
->ToArray()
Haskell, 139 octets
Prend l'entrée comme argument, sort vers STDOUT.
Version non golfée:
la source
Python 3, 97 octets
Imprime une seule nouvelle ligne de fin.
Comment ça marche
Essayez-le sur Ideone
la source
J, 44 octets
Basé sur cette solution .
la source
Javascript (en utilisant une bibliothèque externe) (198 octets)
Lien vers la bibliothèque: https://github.com/mvegh1/Enumerable/
Explication du code: Cela a été facile à utiliser la bibliothèque! Ne gagne pas en octets, mais le code n'est pas trop verbeux et facile à lire. Ainsi, l'entrée "n 'est un tableau d'entiers. Chargez-la dans la bibliothèque, stockée dans la variable" a "." B "est la chaîne de retour, stockez la chaîne jointe avec" "comme délimiteur dans b. C est le itération en cours, utilisez-la pour déterminer le nombre d'espaces à insérer. REMARQUE: cela ne semble fonctionner correctement que lorsque l'entrée est comprise entre 0 et 9. Ensuite, bien que vrai, répétez un certain ensemble de code. Ce code sert à créer un lot adjacent ensembles de l'énumérable courant "a", c'est-à-dire que si nous avons [1,2,3,4,5,6] nous obtenons [1,2], [2,3], [3,4], ... [ 6] ... puis filtrez-le afin que nous ayons seulement les lots de taille 2. Ensuite, nous mappons cela à une collection des sommes des lots% 10. Si a est vide, nous avons terminé, sinon nous ajoutons la nouvelle ligne à notre retour. Enfin revenez ...
Image à venir dans quelques minutes.
la source