Індексуйте число


15

Враховуючи рядок цифр або ціле число як вхід, вам доведеться його індексувати.

Так ви змінюєте вхід. Ми будемо використовувати 30043376111як приклад:

Спочатку знайдіть суму індексів кожного виникнення відповідних цифр:

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

Потім побудуйте нове ціле число або рядок, де цифри вище входять у порядку сум їх індексів. У випадку, якщо кілька цифр дають однакову суму, менша цифра надходить до більшої:

047631

Нарешті, видаліть будь-які провідні нулі та поверніть або надрукуйте результат:

47631

Ви повинні написати програму або функцію, яка повертає або роздруковує вхід, індексований.

Це , тому найкоротший код у байтах виграє!

За запитом можна додати більше тестових випадків.


Що стосується функцій, повернення рядка добре? Як щодо прийому рядка як аргументу?
Conor O'Brien

@ ConorO'Brien Дано рядок цифр або ціле число
AdmBorkBork

@AdmBorkBork Добре, що відповідає на вхідне запитання> _>
Conor O'Brien

@ ConorO'Brien Також побудуйте нове ціле число або рядок , який здається, що повернення рядка теж добре.
AdmBorkBork

Відповіді:


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. Спробуйте в Інтернеті!

Досить прямо: сортуйте цифри вхідного рядка спочатку за сумою їх індексів і за самою цифрою (-> пари (сума ..., г)), видаліть дублікати та перетворіть у число, щоб видалити ведучі 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

05AB1E , 29 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 - дивна мова ... Здається, чим довше ти її використовуєш, тим більше намагаєшся надмірно ускладнити ВСЕ ... Дякую, так, це, здається, працює добре.
Чарівний восьминога Урна

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, потім перетворює його в набір, а потім у масив різних цифр. Сортуйте ці цифри у цифровому порядку, а потім відсортуйте знову за сумами індексів. Об'єднує відсортований масив до рядка і, нарешті, перетворюється на число, щоб видалити ведучі нулі.

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


чи потрібен повторний сорт?
Conor O'Brien

Так, "У випадку, якщо кілька цифр дають однакову суму, менша цифра виходить перед більшою". Без перших .sort(), введення 1332 виходів 132 замість 123.
darrylyeo

О, гаразд, я бачу
Conor O'Brien

2

PowerShell , 88 байт

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

Спробуйте в Інтернеті!

Встановлює порожній хештел $a, потім передає вхід $argsяк charмасив і проходить цикл через кожен елемент |%{...}. Ми встановлюємо значення на "поточний елемент", $aякий слід наростити $i++, підраховуючи індекси нашого введення. Наприклад, для введення отримується 300433766111перший цикл ; наступна петля, отримує ; тощо.$a[3]+=0$a[0]+=1

Далі нам потрібно Sortнаш хештель. На жаль, через внутрішню мовну вигадку, це означає, що нам потрібно до того, $a.GetEnumerator()як ми зможемо зробити власне сортування. Ми відсортуємо value, а потім name, щоб задовольнити вимогу менших цифр, сортуємо спочатку. Ми витягуємо .Nameїх (у відсортованому порядку), -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 байт!

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, 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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.