Indeksuj liczbę

15

Biorąc pod uwagę ciąg cyfr lub liczbę całkowitą jako dane wejściowe, musisz go zindeksować.

W ten sposób modyfikujesz dane wejściowe. Użyjemy 30043376111jako przykładu:

Najpierw znajdź sumę wskaźników każdego wystąpienia odpowiednich cyfr:

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

Następnie skonstruuj nową liczbę całkowitą lub ciąg znaków w miejscu, w którym cyfry powyżej idą w kolejności sum ich indeksów. W przypadku, gdy wiele cyfr daje tę samą sumę, mniejsza cyfra pojawia się przed większą:

047631

Na koniec usuń wszystkie początkowe zera i zwróć lub wydrukuj wynik:

47631

Musisz napisać program lub funkcję, która zwraca lub drukuje zindeksowane dane wejściowe.

To jest , więc wygrywa najkrótszy kod w bajtach!

Na żądanie można dodać więcej przypadków testowych.

Daniel
źródło
Czy w przypadku funkcji zwracanie ciągu jest w porządku? A co powiesz na ciąg znaków jako argument?
Conor O'Brien
@ ConorO'Brien Podany ciąg cyfr lub liczba całkowita
AdmBorkBork
@AdmBorkBork Cóż, to odpowiada na pytanie wejściowe> _>
Conor O'Brien
@ ConorO'Brien Zbuduj także nową liczbę całkowitą lub ciąg znaków , co brzmi, jakby zwracanie ciągu również było OK.
AdmBorkBork

Odpowiedzi:

1

k, 7 bajtów

.<+/'=$

repl. 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

Zestawienie funkcji jest kompozycją, więc nie jest wymagany żaden wyraźny parametr ani dane wejściowe.

ngn
źródło
3

Haskell, 69 bajtów

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

Bierze ciąg, zwraca liczbę. Przykład użycia: f "30043376111"-> 47631. Wypróbuj online!

Całkiem prosto: najpierw posortuj cyfry ciągu wejściowego według sumy ich indeksów i według samej cyfry (-> pary (suma ..., d)), usuń duplikaty i przekonwertuj na liczbę, aby usunąć wiodące 0. Jest 0+to konieczne, aby uzyskać prawidłowe typy.

nimi
źródło
3

Skumulowane , 59 bajtów

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

Wypróbuj online!

Pobiera ciąg znaków (podobny $'1231231') jako dane wejściowe z góry stosu i pozostawia ciąg znaków na stosie.

Wyjaśnienie

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

Teraz pozostały nam pary (chr, suma indeksów).

[-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
źródło
3

05AB1E , 29 28 bajtów

-1 dzięki Riley

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

Wypróbuj 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.
Urna Magicznej Ośmiornicy
źródło
1
Można podstawić TFNza9Ývy
Riley
2
@ Riley 05AB1E to dziwny język ... Wydaje się, że im dłużej go używasz, tym bardziej próbujesz nadmiernie skomplikować WSZYSTKO ... Dzięki, tak, to wydaje się działać dobrze.
Magic Octopus Urn
3

JavaScript (ES6), 98 bajtów

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

Bierze ciąg n, a następnie konwertuje go na zestaw, a następnie na tablicę wyraźnych cyfr. Sortuje te cyfry w kolejności numerycznej, a następnie sortuje ponownie według sum wskaźników. Łączy posortowaną tablicę z ciągiem, a na koniec konwertuje na liczbę, aby usunąć zera wiodące.

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
źródło
czy konieczne jest powtórzenie?
Conor O'Brien
Tak, „W przypadku, gdy wiele cyfr daje tę samą sumę, mniejsza cyfra pojawia się przed większą”. Bez pierwszego.sort() wejścia 1332 daje 132 zamiast 123.
darrylyeo
Ach, dobra, rozumiem
Conor O'Brien
2

PowerShell , 88 bajtów

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

Wypróbuj online!

Ustawia pustą tabelę skrótów $a, a następnie rzutuje dane wejściowe $argsjako chartablicę i zapętla każdy element |%{...}. Ustawiamy wartość na „bieżącym elemencie”, $aktóry ma być zwiększany $i++, aby policzyć wskaźniki wejściowe. Na przykład, do wprowadzania 300433766111, pierwsza pętla $a[3]staje +=0; następna pętla $a[0]dostaje +=1; itp.

Następnie musimy przejść do Sortnaszego hashtable. Niestety z powodu dziwactwa języka wewnętrznego oznacza to, że $a.GetEnumerator()musimy to zrobić, zanim będziemy mogli dokonać właściwego sortowania. Sortujemy według value, a następnie name, aby spełnić wymóg mniejszych cyfr, najpierw sortujemy . Wyciągamy .Nameich (w posortowanej kolejności), -joinrazem w ciąg i rzutujemy ten ciąg jako int, +aby usunąć wiodące zera. Pozostaje to w potoku, a dane wyjściowe są niejawne.

AdmBorkBork
źródło
2

Galareta , 10 bajtów

Ġ’S$ÞịDFQḌ

Wypróbuj online!

Bierze i zwraca liczbę całkowitą.

W jaki sposób?

Ġ’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
źródło
1

PHP, 103 bajtów

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
źródło
1

Python 2, 102 92 bajty

Dzięki Ben Frankel za uratowanie 10 bajtów!

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

Wypróbuj online!

Pobiera dane wejściowe jako ciąg znaków i wypisuje liczbę całkowitą. Używa słownika do przechowywania sumy indeksów, a następnie sortuje je według wartości. Konwertuje na liczbę całkowitą, aby usunąć wiodące zera, ponieważ intjest krótsza niż .lsplit('0').

ćpun matematyki
źródło
a[j]=a.get(j,0)+ioszczędza 10 bajtów.
Ben Frankel
1

Python 3.5, 86 85 bajtów

Dzięki @Ben Frankel za uratowanie bajtu:

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

Stary kod:

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

Anonimowa funkcja pobierająca ciąg cyfr i zwracająca liczbę całkowitą

RootTwo
źródło
sum(i*(c==d)foroszczędza 1 bajt.
Ben Frankel
1

Pip , 18 bajtów

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

Pobiera liczbę jako argument wiersza polecenia. Wypróbuj online!

Wyjaśnienie

                    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
źródło
0

C #, 245 bajtów

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

Nie jestem zadowolony z tego, jak długo to trwało i prawdopodobnie może być krótsze, ale z tym skończyłem.

TheLethalCoder
źródło
0

Perl 6 ,  65 61  52 bajtów

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

Spróbuj

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

Spróbuj

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

Spróbuj

Rozszerzony

{      # 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
źródło
0

Scala, 123 104 bajty

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

Przykład (przy użyciu 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

Całkiem proste, używając krotki jako predykatu sortowania dla sortowania wtórnego.

Jakub
źródło
0

Pyth, 9 bajtów

sosxNcQ1{

Wypróbuj online

Pobiera ciąg cyfr jako dane wejściowe.

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
źródło