Vous devez écrire un programme ou une fonction qui reçoit une liste d'entiers distincts en entrée et en sortie ou renvoie le nombre d'occurrences des nombres en entrée dans la pyramide numérique inversée suivante.
En partant de la liste d'origine à chaque étape, nous en créons une nouvelle avec les valeurs maximales de chaque paire de nombres adjacents (par exemple, 5 1 2 6
devient 5 2 6
). Nous nous arrêtons lorsqu'il n'y a qu'un seul numéro dans la liste.
La pyramide complète pour 5 1 2 6
est
5 1 2 6
5 2 6
5 6
6
Le nombre d'occurrences résultant est 3 1 2 4
(pour 5 1 2 6
respectivement).
Contribution
- Une liste d'un ou plusieurs entiers sans répétition. (par exemple,
1 5 1 6
n'est pas valide.)
Production
- Une liste d'entiers positifs. Le
i
e élément de la liste est le nombre d'occurrences dui
e numéro d'entrée dans la pyramide.
Exemples
Entrée => Sortie
-5 => 1
8 4 => 2 1
5 9 7 => 1 4 1
1 2 3 9 8 6 7 => 1 2 3 16 3 1 2
6 4 2 1 3 5 => 6 4 2 1 3 5
5 2 9 1 6 0 => 2 1 12 1 4 1
120 5 -60 9 12 1 3 0 1200 => 8 2 1 3 16 1 4 1 9
68 61 92 58 19 84 75 71 46 69 25 56 78 10 89 => 2 1 39 2 1 27 6 5 1 6 1 2 14 1 12
Il s'agit de code-golf, donc l'entrée la plus courte l'emporte.
Puzzle bonus: pouvez-vous résoudre le problème à O(n*log n)
temps?
Réponses:
Pyth,
1917 octetsDécouvrez la démonstration en ligne ou l'intégralité suite de tests (itération des 4 premiers octets sur les exemples).
Celui-ci est un peu plus intelligent que l'approche naïve. Chaque numéro du triangle peut être représenté comme la valeur maximale d'un sous-ensemble connecté de
Q
. Dans la première ligne, il utilise les sous-ensembles de longueur 1, la deuxième ligne du triangle utilise les sous-ensembles de longueur 2, ...Explication
Pour visualiser cela un peu.
m.:QhdUQ
et l'entrée[5, 1, 2, 6]
me donne tous les sous-ensembles possibles:Et
mmeSk.:QhdUQ
me donne chacun de leurs maxima (qui correspond exactement aux rangées de la pyramide):Pyth,
2322 octetsIl s'agit simplement de l'approche «faites ce qu'on vous dit».
Découvrez la démonstration en ligne ou une suite de tests complète (itération des 4 premiers octets sur les exemples).
Explication
meSd.:G2
mappe chaque paire de[(G[0], G[1]), (G[1], G[2]), ...]
l'élément maximal.Y
est une liste vide, doncaYG
s'ajouteG
à laY
.u...QQ
applique à plusieurs reprises ces deux fonctions (len(Q)
heures) en commençant parG = Q
et en mettantG
à jour après chaque exécution.m/sYdQ
mappe chaque élément de la liste d'entrée à leur nombre dans laY
liste aplatie .la source
Python, 81
Une solution diviser pour mieux régner. L'élément maximal
M
s'infiltre tout le long de la pyramide, le divisant en un rectangle deM
et deux sous-pyramides.Ainsi, le résultat global est la sortie de la sous-liste de gauche, suivie de la zone du rectangle, suivie de la sortie de la sous-liste de droite.
La variable d'entrée
L
est réutilisée pour stocker le résultat afin que la liste vide soit mappée à la liste vide.Les constructions en solution sont verbeuses en Python. Peut-être qu'un langage avec correspondance de modèle peut implémenter le pseudocode suivant?
la source
f@{}=##&@@{};f@{a___,l_,b___}/;l>a~Max~b:={f@{a},Length@{a,0}Length@{b,0},f@{b}}
CJam,
2322 octetsToujours à la recherche d'options de golf.
Il s'agit d'une fonction CJam (en quelque sorte). Cela attend les numéros d'entrée sur la pile et renvoie également le nombre de sorties correspondant sur la pile. Un exemple:
feuilles
sur pile.
Je suis presque sûr que ce n'est pas à
O(n log n)
temps.Expansion du code :
Voyons comment cela fonctionne en élaborant un exemple de
5 1 2 6
Dans la deuxième ligne,
5 1 2 6
devient5 2 6
parce que5, 2 and 6
sont le maximum de[5 1], [1 2] and [2 6]
respectivement. Dans la troisième ligne, cela devient5 6
parce que5 and 6
sont au maximum[5 2] and [2 6]
respectivement. Cela peut également être écrit comme maximum de[5 1 2] and [1 2 6]
respectivement. De même pour la dernière ligne,6
est au maximum de[5 1 2 6]
.Donc, nous créons essentiellement les tranches de longueur appropriées à partir de la tranche de longueur
1
, qui est essentiellement les nombres originaux, chacun enveloppé dans un tableau, pour enfin une tranche de longueurN
pour la dernière ligne, oùN
est le nombre d'entiers en entrée.Essayez-le en ligne ici
la source
Mathematica, 72 octets
la source
Python, 81
Chaque entrée de la pyramide est le maximum de la sous-liste au sommet de son cône ascendant. Ainsi, nous générons toutes ces sous-listes, indexées par intervalles
[i,j]
avec0 < i < j <= len(L)
, et comptons le nombre de fois que chaque élément apparaît au maximum.Une manière plus courte d'énumérer les sous-intervalles sauverait probablement des caractères. Une paramétrisation à un seul indice des paires
[i,j]
serait une approche plausible.la source
Pip , 56 + 1 = 57 octets
Pas trop en concurrence avec le vaudou CJam, je le crains. On dirait que j'ai besoin d'un meilleur algorithme. Exécutez avec
-s
indicateur pour obtenir une sortie délimitée par des espaces.Non golfé, avec commentaires:
La redéfinition de
r
chaque fois à travers les œuvres comme suit:la source
APL (24)
C'est une fonction qui prend une liste, comme ça;
Explication:
{
...}⍵
: appliquez la fonction suivante à ⍵:⍵≡⍬:⍵
: si ⍵ est vide, retournez ⍵2⌈/⍵
: générer la liste suivante⍵,∇
: retourne ⍵, suivi du résultat de l'application de cette fonction à la liste suivante⍵∘.=
: comparer chaque élément de ⍵ à chaque élément du résultat de la fonction+/
: additionne les lignes (représentant les éléments dans ⍵)la source
Haskell, 78 octets
Utilisation:
f [68,61,92,58,19,84,75,71,46,69,25,56,78,10,89]
->[2,1,39,2,1,27,6,5,1,6,1,2,14,1,12]
.Comment ça fonctionne
la source
JavaScript, 109 octets
Je pense avoir trouvé une façon intéressante de procéder, mais ce n'est qu'après avoir réalisé que le code était trop long pour concourir. Eh bien, je le poste quand même si quelqu'un voit un potentiel de golf supplémentaire.
J'utilise la formule suivante ici:
De cette façon, il n'est pas nécessaire de générer la pyramide entière ou ses sous-ensembles. (C'est pourquoi j'ai d'abord pensé qu'il fonctionnerait en O (n), mais pas de chance, nous avons encore besoin de boucles internes.)
la source
MATLAB: (266 b)
CONTRIBUTION
un vecteur doit être de la forme [abcd ...]
exemple:
[2 4 7 11 3]
PRODUCTION
occurrences de modèle.
EXPLICATION:
si [abcd] est une entrée, le programme calcule le résultat ghij comme
g = (a> b) + (a> b) (a> c) + (a> b) (a> c) * (a> d) = (a> b) (1+ (a> c) ( 1+ (a> c))))
h = (b> a) + (b> c) + (b> a) (b> c) + (b> c) (b> d) + (b> a) (b> c) (b> d ) = ... 'simplifié'
i = (c> b) + (c> d) + (c> b) (c> d) + (c> b) (c> a) + (c> d) (c> b) (c> a ) = ..
j = (d> c) + (d> c) (d> b) + (d> c) (d> b) * (d> a) = ...
la source
J (49)
Je suppose qu'il y a matière à amélioration ...
la source