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.


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!


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]


1
@UnrelatedString tous ces nouveaux atomes!
caird coinheringaahing




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.




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

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]




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.


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


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(", ")

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|



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()

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 !


@ 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]


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.


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.


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!



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.