块+枚举数字列表


12

我有一个十进制数字列表:

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

十进制数字列表称为项目。通过将相同和相邻的数字分组在一起,我们可以从这些项目中形成“块”。我想为每个块分配一个唯一的数字,从1开始,并按块在原始列表中出现的顺序增加1。因此,给定示例的输出如下所示:

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

输入格式

数字列表。(0-9)您可以根据需要使用内置的语言阅读此列表。编码:ASCII

输出格式

一系列十进制数字,由定界符分隔。您的程序必须始终使用相同的定界符。定界符必须大于0位。编码:ASCII

有标准漏洞。


8
严格的输入和输出格式有什么特殊原因吗?
不相关的字符串,

2
@UnrelatedString嗯,我要松开它们。
noɥʇʎԀʎzɐɹƆ

8
IO仍然相当严格。您不能只说“输入和输出是列表”,而让网站默认值来替您处理吗?
乔·金

2
我们可以假设列表为非空吗?
乔·金

1
根据定义,列表已经有定界符。这就是为什么它是列表。我也不明白你的意思You may use your language built-ins to read this list however you want.。这是否意味着我们必须在提交中包括一个字符串以列出转换器?而我们允许的列表输出?
乔·金

Answers:





3

果冻6 5字节

ŒɠµJx

在线尝试!

多亏了UnrelatedString,节省了一个字节!

输入和输出作为数组(带有开/关括号)

这个怎么运作

Œɠµ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所有这些新奇的原子!
Caird coinheringaahing




2

Perl 6,21个字节

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

在线尝试!

匿名代码块,用于获取列表并返回列表。通过比较每对相邻元素是否不相等,而不是通过获取列表的累加和,来工作。




2

MATL,8字节

Y'wn:wY"

在线尝试!

说明:

    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

果冻,4 字节

ŒgƤẈ

在线尝试!

怎么样?

Œ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个字节

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

在线尝试!

命令行选项-p使perl将来自STDIN的输入行读取到“默认变量”中$_。然后$_用计数器搜索替换所有数字$i。而$i针对这比之前的数字,这也就是在第一位,因此计数器开始在不同的每个数字增加1。前一位存储在中$p


1

Pyth13 11字节

s.e*]hkhbr8

在线尝试!

         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个字节,感谢Xcoder先生


hMsM._+0nVt-2个字节。
Xcoder先生19年

或者,如果你想保持你的方法,rQ8是一样的r8,并.n可以s为-2,以及
Xcoder先生

很好,文档没有提到哪些函数采用隐式Q
ar4093

1

Scala,75个字节

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

在线尝试!

如果输入和输出必须是逗号分隔的字符串(而不是列表),则为102个字节。

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

1

果冻,5个字节

nƝÄŻ‘

在线尝试!

我最初的目标是使用4-byter(相同的程序,但没有Ż),但随后很快意识到由于疏忽,每次都必须以1开头...即使Jelly还有5乘,实际上要保留它,因为它使用了不同的方法。

对于输入列表的每对相邻项 大号,测试是否 大号一世大号一世+1个1个一世<|大号|并将这些结果保存在列表中。然后取该列表的累积总和,并将它们加1以匹配块索引系统。TL; DR。每当遇到不同的相邻项目时,我们都会将块索引增加1



1

JavaScript(ES6),30个字节

将输入作为整数数组。

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

在线尝试!

已评论

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字节

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

在线尝试!

通过命令行输入,输出到 STDOUT

Thx @ Night2讨厌的错误'0' == 0修正!


@ Night2好抓!更新并修复。谢谢!
640KB



0

加+,23字节

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

在线尝试!

这个怎么运作

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

视网膜0.8.2,34字节

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

在线尝试!说明:

\b\d+\b

依次匹配每个数字。

(?<=(...)*)

开始向后寻找尽可能多的匹配项。(下一个条目将按从右到左的顺序排列,因为这是向后移动的方式。)

\D*

跳过分隔符。

(\3|(\d+))

尝试匹配与上次相同的数字,但如果失败,则仅匹配任何数字,但请记住,我们必须匹配一个新数字。

\b

确保整数匹配。

$#3

计算新数字的数量。



0

C(gcc)62 61字节

这是我完成的其中几个完整程序比函数提交短的条目之一!

在第一遍中,我不在乎先前的值,因此我不得不依赖这样的事实,argv即指向某个位置的指针,并且极不可能在[0..9]之间!

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

在线尝试!


0

Scala,114个字节

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

在线尝试!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.