索引一个数字


15

给定一个数字字符串或一个整数作为输入,您将不得不对其进行索引。

这是修改输入的方式。我们将以30043376111一个示例为例:

首先,找到各个数字每次出现的索引总和:

0: 1 + 2 = 3
1: 8 + 9 + 10 = 27
3: 0 + 4 + 5 = 9
4: 3
6: 7
7: 6

然后,构造一个新的整数或字符串,其中上面的数字按其索引的总和顺序排列。如果多个数字产生相同的总和,则较小的数字位于较大的数字之前:

047631

最后,删除所有前导零,然后返回或打印结果:

47631

您必须编写一个程序或函数来返回或打印索引的输入。

这是,因此以字节为单位的最短代码胜出!

如果需要,可以添加更多的测试用例。


对于函数,返回字符串可以吗?以字符串作为参数怎么样?
科纳·奥布莱恩

@ ConorO'Brien 给定一个数字字符串或一个整数
AdmBorkBork

@AdmBorkBork好吧,这可以回答输入问题> _>
Conor O'Brien

@ ConorO'Brien另外,构造一个新的整数或字符串,听起来也可以返回字符串。
AdmBorkBork

Answers:


1

k,7个字节

.<+/'=$

在线代表

  $30043376111 / convert to string($)
"30043376111"
  =$30043376111 / group(=) - return a mapping (dict) from unique chars to indices
"304761"!(0 4 5
 1 2
 ,3
 ,6
 ,7
 8 9 10)
  +/'=$30043376111 / sum(+/) each(') value in the dict
"304761"!9 3 3 6 7 27
  <+/'=$30043376111 / grade(<) ascending values - return keys from the dict
"047631"
  .<+/'=$30043376111 / execute(.) the string - convert it to a number
47631

函数的并置是组合,因此不需要显式的参数或输入。


3

Haskell,69个字节

import Data.List
f x=0+read(nub$sortOn(\d->(sum$elemIndices d x,d))x)

取一个字符串,返回一个数字。用法示例:f "30043376111"-> 47631在线尝试!

非常简单:将输入字符串的数字首先按其索引的总和与数字本身(->(sum ...,d)对)进行排序,删除重复项并转换为数字以删除前导0。将0+需要得到的各类权利。


3

堆叠式,59位元组

:@q uniq[:q\eq q size:>*sum,]map[-1#]sortby[0#]map''#`'^0'-

在线尝试!

$'1231231'将从堆栈顶部输入一个字符串(如)作为输入,并将字符串留在堆栈上。

说明

:@q uniq[:q\eq q size:>*sum,]map        stack: (str)
:                                       stack: (str str)
 @q                                     stack: (str)        ; store as `q`
    uniq                                stack: (str')       ; de-duplicate
        [                   ]map        map the inner over each element
         :                              stack: (chr chr)
          q\eq                          stack: (chr q')     ; `q'` is where equality occurs
               q size:>                 stack: (chr, q', k) ; `k` is range from 0, size(q')
                       *sum             stack: (chr, k')    ; `k'` is sum of indices
                           ,            stack: ((chr, k'))

现在我们剩下(chr,索引和)对。

[-1#]sortby[0#]map''#`'^0'-
[   ]sortby                    sort by the inner function
 -                             vectorized subtraction of two pairs
  1#                           use the second element as the comparison
           [0#]map             get the first element of each row
                  ''#`         join by the empty string
                      '^0'-    remove all leading zeroes

3

05AB1E29 28字节

-1感谢赖利

TFN¹SQDg<ÝsÏON‚}){vyD0å_i1è,

在线尝试!

TFN            }             # Loop from 0 to 9.
   ¹SQ                       # Push 1 if index is same as `y`.
      Dg<ÝsÏ                 # Push index of the number instead of 1.
            ON‚              # Sum, combine with current `y`.
                ){           # Collect, sort 'em.
                  vyD0å_i1è, # Only print the ones with a count above 0.

1
您也可以替换TFN9Ývy
莱利

2
@Riley 05AB1E是一种奇怪的语言...似乎您使用它的时间越长,您尝试使一切复杂化的次数就越多...谢谢,是的,这似乎工作正常。
Magic Octopus Urn'Mar

3

JavaScript(ES6),98个字节

n=>+[...new Set(n)].sort().sort((a,b)=>(s=d=>[...n].reduce((S,D,i)=>S+i*(d==D),0))(a)-s(b)).join``

接收一个字符串n,然后将其转换为Set,然后转换为不同数字的数组。将这些数字按数字顺序排序,然后根据索引总和再次排序。将排序后的数组连接为字符串,最后转换为数字以删除前导零。

f=
n=>+[...new Set(n)].sort().sort((a,b)=>(s=d=>[...n].reduce((S,D,i)=>S+i*(d==D),0))(a)-s(b)).join``

console.log(f('30043376111'))


重复排序是否必要?
科纳·奥布莱恩

是的,“如果多个数字产生相同的总和,则较小的数字将出现在较大的数字之前”。没有第一.sort(),1332个产率132,而不是123的输入
darrylyeo

嗯,好吧,我见
康纳尔奥布莱恩

2

PowerShell,88字节

$a=@{};[char[]]"$args"|%{$a[$_]+=$i++};+-join(($a.GetEnumerator()|Sort value,name).Name)

在线尝试!

设置一个空的哈希表$a,然后将输入转换$argschar数组,并遍历每个元素|%{...}。我们将“当前元素”的值设置为,$a以递增$i++,以计算输入的索引。例如,对于输入300433766111,第一环路$a[3]得到+=0; 下一个循环,$a[0]获取+=1;等等

接下来,我们需要Sort我们的哈希表。不幸的是,由于内部语言的怪异,这意味着我们需要$a.GetEnumerator()先进行实际排序。我们先按排序value,然后按排序name,以满足较小数字的要求。我们将其.Names(按排序顺序)拉出,将-join它们在一起成为一个字符串,并将该字符串转换为int +以删除前导零。剩下的就在管道上,输出是隐式的。


2

果冻,10 字节

Ġ’S$ÞịDFQḌ

在线尝试!

接受并返回一个整数。

怎么样?

Ġ’S$ÞịDFQḌ - Main link: n            e.g. 30043376111
Ġ          - group indices of n by value  [[2,3],[9,10,11],[1,5,6],[4],[8],[7]] (implicitly treats the number as a decimal list)
    Þ      - sort that by:
   $       -     last two links as a monad:
 ’         -         decrement (since Jelly is 1-indexed)
  S        -         sum                  [[2,3],[4],[7],[8],[1,5,6],[9,10,11]] (this leaves those indices of lower value to the left as required)
      D    - decimal list of n            [3,0,0,4,3,3,7,6,1,1,1]
     ị     - index into                   [[0,0],[4],[7],[6],[3,3,3],[1,1,1]]
       F   - flatten                      [0,0,4,7,6,3,3,3,1,1,1]
        Q  - unique                       [0,4,7,6,3,1]
         Ḍ - cast to a decimal number     47631

1

PHP,103字节

for(;$i<strlen($a="$argv[1]");)$r[$a[$i]]+=$i++;ksort($r);asort($r);echo ltrim(join(array_keys($r)),0);

1

Python 2,102 92字节

感谢Ben Frankel节省了10个字节!

a={}
for i,j in enumerate(input()):a[j]=a.get(j,0)+i
print int(''.join(sorted(a,key=a.get)))

在线尝试!

将输入作为字符串并输出整数。使用字典存储索引总和,然后按值对索引进行排序。转换为整数以去除前导零,因为int它比短.lsplit('0')


a[j]=a.get(j,0)+i节省10个字节。
本·弗兰克尔

1

Python 3.5、86 85字节

感谢@Ben Frankel保存了一个字节:

f=lambda s:int(''.join(sorted({*s},key=lambda d:sum(i*(c==d)for i,c in enumerate(s)))))

旧代码:

lambda s:int(''.join(sorted({*s},key=lambda d:sum(i for i,c in enumerate(s)if c==d))))

匿名函数,接受一串数字并返回整数


sum(i*(c==d)for保存1个字节。
本·弗兰克尔

1

,18字节

+J:$+(a@*_)SKSNUQa

将数字作为命令行参数。在线尝试!

说明

                    a is 1st cmdline arg (implicit)
               UQa  Get unique digits in a
             SN     Sort (numerically)
           SK       Then sort with this key function:
      a@*_           Find all indices of argument in a
   $+(    )          and sum them
 J:                 Join the resulting list back into a string (: is used to lower the
                    precedence of J)
+                   Convert to number (eliminates leading 0)
                    Print (implicit)

0

C#,245个字节

using System.Linq;s=>{var a=new int[10];for(int i=0,l=0;i<10;i++){a[i]=-1;while((l=s.IndexOf(i+"",l+1))!=-1)a[i]+=l;}return string.Concat(a.Select((c,i)=>new{c,i}).OrderBy(o=>o.c).ThenBy(o=>o.i).Where(o=>o.c>-1).Select(o=>o.i)).TrimStart('0');};

它对最终存在的时间不满意,它可能会更短,但这就是我最终得到的结果。


0

Perl 6的 65个61  52字节

{+[~] {}.push(.comb.map:{$_=>$++}).sort({.value.sum,.key})».key}

尝试一下

{+[~] {}.push(.comb.antipairs).sort({.value.sum,.key})».key}

尝试一下

{+[~] .comb.antipairs.Bag.sort({.value,.key})».key}

尝试一下

展开式

{      # bare block lambda with implicit parameter 「$_」

  +    # turn the following into a Numeric
  [~]  # reduce the following using &infix:<~> (join)

    .comb              # list of digits from 「$_」 (implicit method call)
    .antipairs         # get a list of 「value => index」 pairs from above list
    .Bag               # combine them together (does the sum)
    .sort(
      { .value, .key } # sort it by the sum of indexes, then by the digit
    )».key             # get the list of digits from that
}

0

Scala,123104字节

(_:String).zipWithIndex.groupBy(_._1).toSeq.sortBy(c=>c._2.map(_._2).sum->c._1).map(_._1).mkString.toInt

示例(使用Scala REPL):

scala> (_:String).zipWithIndex.groupBy(_._1).toSeq.sortBy(c=>c._2.map(_._2).sum->c._1).map(_._1).mkString.toInt
res0: String => Int = <function1>

scala> res0("30043376111")
res1: Int = 47631

非常简单明了,使用元组作为辅助排序的排序谓词。


0

Pyth,9个字节

sosxNcQ1{

在线尝试

以一串数字作为输入。

sosxNcQ1{
sosxNcQ1{Q    Implicit variable introduction
        {Q    Unique digits
 o            Order by
     cQ1      Chop input into list of individual characters.
   xN         Find all indexes of the digit in question in the list.
  s           Sum
s             Convert string to integer.
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.