Buat indeks suatu angka

15

Diberikan string angka atau integer sebagai input, Anda harus mengindeksnya.

Ini adalah bagaimana Anda memodifikasi input. Kami akan gunakan 30043376111sebagai contoh:

Pertama, temukan jumlah indeks dari setiap kemunculan digit masing-masing:

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

Kemudian, buat integer atau string baru di mana digit di atas sesuai dengan urutan jumlah indeksnya. Jika beberapa digit menghasilkan jumlah yang sama, digit yang lebih kecil muncul sebelum yang lebih besar:

047631

Terakhir, hapus semua nol terkemuka, dan kembalikan atau cetak hasilnya:

47631

Anda harus menulis program atau fungsi yang mengembalikan atau mencetak input yang diindeks.

Ini adalah , jadi kode terpendek dalam byte menang!

Lebih banyak kasus uji dapat ditambahkan jika diminta.

Daniel
sumber
Untuk fungsi, apakah mengembalikan string tidak apa-apa? Bagaimana kalau mengambil string sebagai argumen?
Conor O'Brien
@ ConorO'Brien Diberikan string angka atau bilangan bulat
AdmBorkBork
@ AdmBorkBork Baiklah, itu menjawab pertanyaan masukan> _>
Conor O'Brien
@ ConorO'Brien Juga, buat integer atau string baru , yang kedengarannya seperti mengembalikan string juga OK.
AdmBorkBork

Jawaban:

1

k, 7 byte

.<+/'=$

balasan online

  $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

Menyandingkan fungsi adalah komposisi, jadi tidak ada parameter atau input eksplisit yang diperlukan.

ngn
sumber
3

Haskell, 69 byte

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

Mengambil string, mengembalikan nomor. Contoh penggunaan: f "30043376111"-> 47631. Cobalah online!

Cukup lurus ke depan: urutkan digit dari string input terlebih dahulu pada jumlah indeks mereka dan oleh digit itu sendiri (-> pasang (jumlah ..., d)), hapus duplikat dan konversi ke nomor untuk menghapus memimpin 0. The 0+diperlukan untuk mendapatkan jenis yang tepat.

nimi
sumber
3

Ditumpuk , 59 byte

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

Cobalah online!

Ini membutuhkan string karakter (seperti $'1231231' ) sebagai input dari atas tumpukan, dan meninggalkan string di tumpukan.

Penjelasan

:@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'))

Sekarang kita dibiarkan dengan pasangan (chr, jumlah indeks).

[-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
Conor O'Brien
sumber
3

05AB1E , 29 28 byte

-1 Terima kasih kepada Riley

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

Cobalah online!

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.
Guci Gurita Ajaib
sumber
1
Dapatkah Anda mengganti TFNuntuk9Ývy
Riley
2
@Riley 05AB1E adalah bahasa yang aneh ... Sepertinya semakin lama Anda menggunakannya semakin Anda berusaha untuk terlalu menyulitkan SEGALA SESUATU ... Terima kasih, ya, itu sepertinya berfungsi dengan baik.
Magic Octopus Urn
3

JavaScript (ES6), 98 byte

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

Mengambil string n, lalu mengubahnya menjadi Set dan kemudian ke array angka yang berbeda. Urutkan digit-digit ini dalam urutan numerik, lalu urutkan kembali sesuai dengan jumlah indeks. Menggabungkan Array yang diurutkan ke sebuah String, dan akhirnya mengkonversi ke Nomor untuk menghapus nol terkemuka.

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

Darrylyeo
sumber
Apakah pengulangan diperlukan?
Conor O'Brien
Ya, "Jika beberapa digit menghasilkan jumlah yang sama, digit yang lebih kecil muncul sebelum yang lebih besar". Tanpa yang pertama .sort(), input 1332 menghasilkan 132 bukannya 123.
darrylyeo
Ah, baiklah, saya mengerti
Conor O'Brien
2

PowerShell , 88 byte

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

Cobalah online!

Atur hashtable kosong $a, lalu masukkan input $argssebagai chararray, dan loop melalui setiap elemen |%{...}. Kami menetapkan nilai pada "elemen saat ini" $auntuk ditambahkan oleh $i++, untuk menghitung indeks input kami. Misalnya, untuk input 300433766111, loop pertama $a[3]didapat +=0; loop berikutnya, $a[0]mendapat +=1; dll.

Selanjutnya, kita perlu Sorthashtable kita. Sayangnya, karena kekhasan bahasa internal, ini berarti kita perlu $a.GetEnumerator()sebelum kita bisa melakukan penyortiran yang sebenarnya. Kami urutkan berdasarkan value, kemudian dengan name, untuk memenuhi persyaratan digit yang lebih kecil, disortir terlebih dahulu. Kami menariknya .Name(dalam urutan diurutkan), -joinmereka bersama-sama menjadi string, dan melemparkan string itu sebagai int +untuk menghapus nol terkemuka. Yang tersisa pada pipa dan output tersirat.

AdmBorkBork
sumber
2

Jelly , 10 byte

Ġ’S$ÞịDFQḌ

Cobalah online!

Mengambil dan mengembalikan bilangan bulat.

Bagaimana?

Ġ’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
Jonathan Allan
sumber
1

PHP, 103 Bytes

for(;$i<strlen($a="$argv[1]");)$r[$a[$i]]+=$i++;ksort($r);asort($r);echo ltrim(join(array_keys($r)),0);
Jörg Hülsermann
sumber
1

Python 2, 102 92 byte

Terima kasih kepada Ben Frankel karena telah menghemat 10 byte!

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

Cobalah secara Online!

Mengambil input sebagai string dan menghasilkan integer. Menggunakan kamus untuk menyimpan jumlah indeks, lalu mengurutkannya berdasarkan nilai. Konversi ke integer untuk menghapus nol terkemuka karena intlebih pendek dari .lsplit('0').

pecandu matematika
sumber
a[j]=a.get(j,0)+imenghemat 10 byte.
Ben Frankel
1

Python 3.5, 86 85 byte

Terima kasih @Ben Frankel karena telah menyimpan byte:

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

Kode lama:

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

Fungsi anonim mengambil string angka dan mengembalikan integer

RootTwo
sumber
sum(i*(c==d)formenghemat 1 byte.
Ben Frankel
1

Pip , 18 byte

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

Mengambil nomor sebagai argumen baris perintah. Cobalah online!

Penjelasan

                    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)
DLosc
sumber
0

C #, 245 byte

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');};

Tidak senang dengan berapa lama itu berakhir dan mungkin bisa lebih pendek tapi inilah yang akhirnya saya lakukan.

TheLethalCoder
sumber
0

Perl 6 ,  65 61  52 byte

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

Cobalah

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

Cobalah

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

Cobalah

Diperluas

{      # 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
}
Brad Gilbert b2gills
sumber
0

Scala, 123 104 byte

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

Contoh (menggunakan 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

Cukup mudah, menggunakan tuple sebagai predikat pengurutan untuk jenis sekunder.

Yakub
sumber
0

Pyth, 9 byte

sosxNcQ1{

Cobalah online

Mengambil serangkaian digit sebagai input.

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.
isaacg
sumber