Индексировать число

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 Кроме того, создайте новое целое число или строку , которая звучит так же, как и возвращение строки.
AdmBorkBork

Ответы:

1

к 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

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

darrylyeo
источник
повторная сортировка необходима?
Конор О'Брайен,
Да, «В случае, когда несколько цифр дают одинаковую сумму, меньшая цифра предшествует большей». Без первого .sort(), вход 1332 дает 132 вместо 123.
Даррильо
Ах, хорошо, я вижу
Конор О'Брайен
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, чтобы удовлетворить требование меньших цифр сортируются в первую очередь. Мы извлекаем их .Names (в отсортированном порядке), -joinих вместе в строку, и приводим эту строку как int +для удаления начальных нулей. Это осталось на конвейере и вывод неявный.

AdmBorkBork
источник
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 байта

Спасибо Бену Франкелю за сохранение 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))))

Анонимная функция, принимающая строку цифр и возвращающая целое число

RootTwo
источник
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)
DLosc
источник
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');};

Не в восторге от того, как долго это закончилось, и, вероятно, оно может быть короче, но это то, чем я закончил.

TheLethalCoder
источник
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
}
Брэд Гилберт b2gills
источник
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.
isaacg
источник