Chunk + Énumérer une liste de chiffres

12

J'ai une liste de chiffres décimaux:

4, 4, 4, 7, 7, 9, 9, 9, 9, 2, 2, 2, 4, 4

La liste des chiffres décimaux est connue sous le nom d'éléments. Nous pouvons former des "morceaux" à partir de ces éléments en regroupant des nombres identiques et adjacents. Je veux attribuer à chaque bloc un numéro unique, en commençant par 1 et en augmentant de 1 dans l'ordre dans lequel les blocs apparaissent dans la liste d'origine. Ainsi, la sortie de l'exemple donné ressemblerait à ceci:

1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5

Format d'entrée

Une liste de chiffres. (0-9) Vous pouvez utiliser votre langage intégré pour lire cette liste comme vous le souhaitez. Encodage: ASCII

Format de sortie

Une série de nombres décimaux, séparés par un délimiteur. Votre programme doit toujours utiliser le même délimiteur. Le délimiteur doit être supérieur à 0 bits. Encodage: ASCII

Des échappatoires standard s'appliquent.

noɥʇʎԀʎzɐɹƆ
la source
8
Une raison particulière pour le format d'entrée et de sortie strict?
Unrelated String
2
@UnrelatedString Hmm, je vais les desserrer.
noɥʇʎԀʎzɐɹƆ
8
L'IO est encore assez strict. Ne pouvez-vous pas simplement dire «l'entrée et la sortie sont sous forme de liste» et laisser les valeurs par défaut du site s'en occuper pour vous?
Jo King
2
Pouvons-nous supposer que la liste n'est pas vide?
Jo King
1
Une liste par définition a déjà des délimiteurs. C'est pourquoi c'est une liste. Je ne comprends pas non plus ce que vous entendez You may use your language built-ins to read this list however you want.. Cela signifie-t-il que nous devons inclure une chaîne pour convertir le convertisseur dans notre soumission? Et sommes- nous autorisés à produire une liste?
Jo King

Réponses:

7

Python 3.8 (pré-version) , 41 octets

lambda l,n=0:[n:=n+(l!=(l:=x))for x in l]

Essayez-le en ligne!

Louez le morse magique :=des expressions d'affectation.


Python 2 , 42 octets

n=0
for x in input():n+=x!=id;id=x;print n

Essayez-le en ligne!

xnor
la source
Hmm, combien de temps cela durerait-il en Pyth?
noɥʇʎԀʎzɐɹƆ
Huh, j'ai évité idparce que c'est 2 octets de long ...
Erik the Outgolfer
Oof nice idea ofid
U10-Forward
@ noɥʇʎԀʎzɐɹƆ 8 octets pour une traduction simple: Essayez-le en ligne!
isaacg
3

Gelée , 6 5 octets

ŒɠµJx

Essayez-le en ligne!

Un octet enregistré grâce à UnrelatedString !

Entrées et sorties sous forme de tableau (avec crochets d'ouverture / fermeture)

Comment ça fonctionne

ŒɠµJx - Main link, takes one argument:                       [7, 7, 5, 5, 5, 1]
Œɠ    - Get the lengths of consecutive elements:             [2, 3, 1]
  µ   - Call these lengths A
   J  - range(length(A))                                     [1, 2, 3]
    x - Repeat each element by the corresponding value in A: [1, 1, 2, 2, 2, 3]
caird coinheringaahing
la source
5 octets
Chaîne indépendante
1
@UnrelatedString tous ces nouveaux atomes!
caird coinheringaahing
2

05AB1E , 5 octets

¥Ā.¥>

Essayez-le en ligne!

M. Xcoder
la source
Alternative mineure à 5 octets: ¥Āpourrait également l'être üÊ.
Kevin Cruijssen
1
4 octets
Grimmy
2

Perl 6 , 21 octets

{+<<[\+] $,|$_ Zne$_}

Essayez-le en ligne!

Bloc de code anonyme qui prend une liste et renvoie une liste. Cela fonctionne en comparant si chaque paire d'éléments adjacents n'est pas égale, en prenant la somme cumulée de la liste.

Jo King
la source
2

05AB1E , 4 octets

γdƶ˜

Essayez-le en ligne!

γ       # group adjacent equal digits together
 d      # replace all digits with 1
  ƶ     # multiply each group by its 1-based index
   ˜    # flatten
Grimmy
la source
J'oublie toujours que 05ab1e a ça ƶ... +1
M. Xcoder
1
Voici une alternative à 4 octets:ηεγg
Kevin Cruijssen
2

R , 33 octets

function(x)cumsum(c(1,!!diff(x)))

Essayez-le en ligne!

Utilise la même méthode de somme cumulée que Luis Mendo et autres.

user2390246
la source
2

MATL , 8 octets

Y'wn:wY"

Essayez-le en ligne!

Explication:

    Y'      % run-length encoding
    w       % swap elements in stack
    n       % number of elements in array / size along each dimension
    :       % range; vector of equally spaced values
    w       % swap elements in stack
    Y"      % replicate elements of array
            % (implicit) convert to string and display
OrangeCherries
la source
2

Gelée , 4 octets

ŒgƤẈ

Essayez-le en ligne!

Comment?

ŒgƤẈ - Link: list of integers  e.g. [7,7,2,7,7]
  Ƥ  - for prefixes:     [7]   [7,7]   [7,7,2]      [7,7,2,7]        [7,7,2,7,7]
Œg   -   group runs      [[7]] [[7,7]] [[7,7],[2]]  [[7,7],[2],[7]]  [[7,7],[2],[7,7]]
   Ẉ - length of each    [1,   1,      2,           3,               3]
Jonathan Allan
la source
1

Haskell , 46 43 octets

scanl(+)1.map fromEnum.(zipWith(/=)=<<tail)

Essayez-le en ligne!

Fonction anonyme sans point qui prend une liste et retourne une liste

Jo King
la source
1

Perl 5 , 27 octets

s/\d/$i+=$&!=$p;$p=$&;$i/ge

Essayez-le en ligne!

L'option de ligne de commande -pfait perl lire la ligne d'entrée de STDIN dans la "variable par défaut" $_. Il remplace ensuite tous les chiffres $_par le compteur $i. Et $iest augmenté pour chaque chiffre qui est différent du chiffre précédent, qui se trouve également au premier chiffre, de sorte que le compteur démarre à 1. Le chiffre précédent est enregistré dans $p.

Kjetil S.
la source
1

Pyth , 13 11 octets

s.e*]hkhbr8

Essayez-le en ligne!

         r8  # Run-length encode (implicit argument is the input) (-> [[frequency, char], ...]
 .e          # Enumerated map (current element is b, index is k) over rQ8
   *]hk      # [ k+1 ] *
       hb    #           b[0]
s            # Reduce list on + ([a]+[b] = [a,b])

-2 octets grâce à M. Xcoder

ar4093
la source
hMsM._+0nVtpour -2 octets.
M. Xcoder
Ou si vous voulez garder votre approche, rQ8c'est la même chose r8et .npeut être aussi spour -2
M. Xcoder
Ah bien, les docs n'ont pas mentionné quelles fonctions prennent implicitementQ
ar4093
1

Scala , 75 octets

s=>s.scanLeft(("",0))((x,y)=>(y,x._2+(if(x._1!=y)1 else 0))).tail.map(_._2)

Essayez-le en ligne!

Si l'entrée et la sortie doivent être des chaînes séparées par des virgules (et non des listes), alors 102 octets.

s=>s.split(", ").scanLeft(("",0))((x,y)=>(y,x._2+(if(x._1!=y)1 else 0))).tail.map(_._2).mkString(", ")
Dr Y Wit
la source
1

Gelée , 5 octets

nƝÄŻ‘

Essayez-le en ligne!

Au départ, je visais un 4 octets (le même programme mais sans le Ż) mais j'ai rapidement réalisé qu'un 1 devait être ajouté à chaque fois en raison d'un oubli ... Même s'il y a un autre 5 octets dans Jelly, je vais en fait garder cela car il utilise une méthode différente.

LLiLi+1,1i<|L|

M. Xcoder
la source
1

JavaScript (ES6), 30 octets

Prend l'entrée comme un tableau d'entiers.

a=>a.map(p=n=>i+=p!=(p=n),i=0)

Essayez-le en ligne!

Commenté

a =>                // a[] = input array
  a.map(p =         // initialize p to a non-numeric value
  n =>              // for each value n in a[]:
    i +=            //   increment i if:
      p != (p = n), //     p is not equal to n; and update p to n
    i = 0           //   start with i = 0 (chunk counter)
  )                 // end of map()
Arnauld
la source
1

PHP , 52 octets

while(''<$d=$argv[++$x])echo$i+=$argv[$x-1]!=$d,' ';

Essayez-le en ligne!

Entrée via ligne de commande, sortie vers STDOUT.

Thx à @ Night2 pour le '0' == 0bugfix de comparaison embêtant !

640 Ko
la source
@ Night2 bonne prise! Mis à jour et corrigé. THX!
640 Ko
0

Ajouter ++ , 23 octets

D,f,@*,BGd€bL$bLRz€¦XBF

Essayez-le en ligne!

Comment ça fonctionne

D,f,@*,     - Define a function, f, that takes one argument:  [7 7 5 5 5 1]
       BG   - Group neighbouring elements together:           [[[7 7] [5 5 5] [1]]]          
       d    - Duplicate:                                      [[[7 7] [5 5 5] [1]] [[7 7] [5 5 5] [1]]]
       €bL  - Get the length of each:                         [[[7 7] [5 5 5] [1]] [2 3 1]]
       $bLR - Length, then range of length:                   [[2 3 1] [1 2 3]]
       z    - Zip together:                                   [[2 1] [3 2] [1 3]]
       €¦X  - Reduce each by repetition:                      [[1 1] [2 2 2] [3]]
       BF   - Flatten:                                        [1 1 2 2 2 3]
            - Due to the * in the function definition,
                 return the whole stack:                      [1 1 2 2 2 3]
caird coinheringaahing
la source
0

Retina 0.8.2 , 34 octets

\b\d+\b(?<=(\b(\3|(\d+))\D*)*)
$#3

Essayez-le en ligne! Explication:

\b\d+\b

Faites correspondre chaque numéro tour à tour.

(?<=(...)*)

Commencez à regarder en arrière pour autant de matchs que possible. (Les prochaines entrées seront dans l'ordre de droite à gauche car c'est ainsi que fonctionne lookbehind.)

\D*

Sautez les séparateurs.

(\3|(\d+))

Essayez de faire correspondre le même numéro que la dernière fois, mais à défaut, faites simplement correspondre n'importe quel numéro, mais rappelez-vous que nous devions faire correspondre un nouveau numéro.

\b

Assurez-vous que le nombre entier correspond.

$#3

Comptez le nombre de nouveaux numéros.

Neil
la source
0

Stax , 10 octets

▓ª2ªmD?Ä╧╖

Exécuter et déboguer

La sortie utilise l'espace comme délimiteur. L'entrée suit les spécifications précises en utilisant des virgules comme séparateurs, et maintenant des accolades.

récursif
la source
0

C (gcc) , 62 61 octets

C'est l'une des rares entrées que j'ai faites où un programme complet est plus court qu'une soumission de fonction!

Lors de la première passe, je ne me soucie pas de la valeur précédente, donc je peux compter sur le fait qu'il argvs'agit d'un pointeur vers quelque part et qu'il est extrêmement peu probable qu'il se situe entre [0..9]!

s;main(i,j){for(;~scanf("%d,",&i);j=i)printf("%d ",s+=j!=i);}

Essayez-le en ligne!

ErikF
la source
0

Scala , 114 octets

s.split(", ").zipWithIndex.scan(s.head,0){(a,b)=>if(a._1==b._1)a else b._1->(a._2+1)}.tail.unzip._2.mkString(", ")

Essayez-le en ligne!

Savonneux
la source
0

C (gcc) , 62 octets

f(_,l)int*_;{printf("%d ",l=--l?f(_,l)+(_[l]!=_[l-1]):1);_=l;}

Essayez-le en ligne!

Une fonction qui prend la liste et sa longueur comme arguments.


C (gcc) , 60 octets

f(_,l)int*_;{_=printf("%*d",--l?f(_,l)+(_[l]!=_[l-1]):2,0);}

Essayez-le en ligne!

Sorties en unaire, délimitées par 0s

attinat
la source