数値をインデックス化する


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それは、入力の質問に答えます> _>
コナーオブライエン

@ ConorO'Brienまた、新しい整数または文字列を作成します。これは、文字列を返すこともOKのように聞こえます。
-AdmBorkBork

回答:


1

k、7バイト

.<+/'=$

オンラインrepl

  $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
代わりTFNにできますか9Ývy
ライリー

2
@Riley 05AB1Eは奇妙な言語です...長く使用すればするほど、すべてを過度に複雑にしようとするようです...ありがとう、はい、それはうまくいくようです。
魔法のタコUr

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の入力は123ではなく132になります。
darrylyeo17年

ああ、わかりました
コナーオブライエン

2

PowerShell、88バイト

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

オンラインでお試しください!

空のハッシュテーブルを設定し$a、入力$argschar配列としてキャストし、各要素をループします|%{...}。入力のインデックスをカウントアップするために、$aによってインクリメントされる「現在の要素」の値を設定します$i++。たとえば、inputの300433766111場合、最初のループ$a[3]は次を取得し+=0ます。次のループ、$a[0]gets +=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

Python 2、102 92バイト

10バイトを節約してくれたBen Frankelに感謝します!

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)+i10バイト節約します。
ベンフランケル

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)for1バイト節約します。
ベンフランケル

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、123 104バイト

(_: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.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.