Indexiere eine Zahl


15

Wenn Sie eine Ziffernfolge oder eine Ganzzahl als Eingabe angeben, müssen Sie diese indizieren.

So ändern Sie die Eingabe. Wir werden 30043376111als Beispiel verwenden:

Ermitteln Sie zunächst die Summe der Indizes jedes Vorkommens der entsprechenden Ziffern:

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

Konstruieren Sie dann eine neue Ganzzahl oder Zeichenfolge, wobei die obigen Ziffern in der Reihenfolge der Summen ihrer Indizes angeordnet sind. Für den Fall, dass mehrere Ziffern dieselbe Summe ergeben, steht die kleinere Ziffer vor der größeren:

047631

Entfernen Sie abschließend alle führenden Nullen und geben Sie das Ergebnis zurück oder drucken Sie es aus:

47631

Sie müssen ein Programm oder eine Funktion schreiben, die die Eingabe indexiert zurückgibt oder druckt.

Das ist , also gewinnt der kürzeste Code in Bytes!

Weitere Testfälle können auf Anfrage hinzugefügt werden.


Ist die Rückgabe einer Zeichenfolge für Funktionen in Ordnung? Wie wäre es mit einem String als Argument?
Conor O'Brien

@ ConorO'Brien Angesichts einer Zeichenfolge oder einer ganzen Zahl
AdmBorkBork

@AdmBorkBork Nun, das beantwortet die Eingabefrage> _>
Conor O'Brien

@ ConorO'Brien Konstruieren Sie auch eine neue Ganzzahl oder Zeichenfolge , was so klingt, als wäre die Rückgabe einer Zeichenfolge ebenfalls in Ordnung.
AdmBorkBork

Antworten:


1

k, 7 Bytes

.<+/'=$

Online-Antwort

  $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

Das Nebeneinander von Funktionen ist die Komposition, daher sind keine expliziten Parameter oder Eingaben erforderlich.


3

Haskell, 69 Bytes

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

Nimmt einen String und gibt eine Zahl zurück. Anwendungsbeispiel: f "30043376111"-> 47631. Probieren Sie es online!

Ganz einfach: Sortieren Sie die Ziffern der Eingabezeichenfolge zuerst nach der Summe ihrer Indizes und nach der Ziffer selbst (-> Paare von (Summe ..., d)), entfernen Sie Duplikate und konvertieren Sie sie in eine Zahl, um die führenden zu entfernen 0. Das 0+wird benötigt, um die richtigen Typen zu finden.


3

Gestapelt , 59 Bytes

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

Probieren Sie es online!

Dabei wird eine Zeichenfolge (wie $'1231231') als Eingabe vom oberen Rand des Stapels verwendet und eine Zeichenfolge auf dem Stapel belassen.

Erläuterung

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

Jetzt haben wir noch Paare von (chr, Summe der Indizes).

[-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 Bytes

-1 danke an Riley

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

Probieren Sie es 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.

1
Können Sie ersetzen TFNfür9Ývy
Riley

2
@Riley 05AB1E ist eine seltsame Sprache ... Je länger Sie sie verwenden, desto mehr versuchen Sie, ALLES zu komplizieren ... Danke, ja, das scheint in Ordnung zu sein.
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``

Nimmt eine Zeichenfolge nund konvertiert sie dann in ein Set und dann in ein Array mit verschiedenen Ziffern. Sortiert diese Ziffern in numerischer Reihenfolge und sortiert sie dann erneut nach Indexsummen. Verkettet das sortierte Array zu einem String und wandelt es schließlich in eine Zahl um, um führende Nullen zu entfernen.

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


ist die wiederholte Sortierung notwendig?
Conor O'Brien

Ja, "Für den Fall, dass mehrere Ziffern dieselbe Summe ergeben, steht die kleinere Ziffer vor der größeren". Ohne den ersten .sort()
Wert

Ah, okay, ich verstehe
Conor O'Brien

2

PowerShell , 88 Byte

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

Probieren Sie es online!

Setzt eine leere Hashtabelle $a, wandelt die Eingabe $argsals charArray um und durchläuft jedes Element in einer Schleife |%{...}. Wir setzen den Wert auf "das aktuelle Element" $a, um das inkrementiert werden soll $i++, um die Indizes unserer Eingabe zu zählen. Für die Eingabe 300433766111wird beispielsweise die erste Schleife $a[3]abgerufen +=0. die nächste Schleife $a[0]bekommt +=1; etc.

Als nächstes müssen wir zu Sortunserer Hash-Tabelle. Aufgrund einer internen Sprachanomalie müssen $a.GetEnumerator()wir dies leider tun , bevor wir die eigentliche Sortierung durchführen können. Wir sortieren nach valueund sortieren nach , nameum die Anforderung zu erfüllen, dass kleinere Ziffern zuerst sortiert werden. Wir ziehen die .Names davon (in sortierter Reihenfolge) -joinzu einer Zeichenkette zusammen und wandeln diese Zeichenkette als int +um, um führende Nullen zu entfernen. Das bleibt in der Pipeline und die Ausgabe ist implizit.


2

Gelee , 10 Bytes

Ġ’S$ÞịDFQḌ

Probieren Sie es online!

Nimmt und gibt eine ganze Zahl zurück.

Wie?

Ġ’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 Bytes

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 Bytes

Vielen Dank an Ben Frankel für das Speichern von 10 Bytes!

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

Probieren Sie es online!

Nimmt Eingaben als Zeichenfolge und gibt eine Ganzzahl aus. Verwendet ein Wörterbuch, um die Summe der Indizes zu speichern, und sortiert sie dann nach Wert. Konvertiert in eine Ganzzahl, um führende Nullen zu entfernen, da intkürzer als .lsplit('0').


a[j]=a.get(j,0)+iSpart 10 Bytes.
Ben Frankel

1

Python 3.5, 86 85 Bytes

Danke @Ben Frankel für das Speichern eines Bytes:

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

Alter Code:

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

Anonyme Funktion, die eine Ziffernfolge verwendet und eine Ganzzahl zurückgibt


sum(i*(c==d)forSpart 1 Byte.
Ben Frankel

1

Pip , 18 Bytes

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

Nimmt die Zahl als Befehlszeilenargument. Probieren Sie es online!

Erläuterung

                    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 Bytes

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

Ich bin nicht glücklich darüber, wie lange es gedauert hat und es kann wahrscheinlich kürzer sein, aber das ist es, womit ich gelandet bin.


0

Perl 6 ,  65 61  52 Bytes

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

Versuch es

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

Versuch es

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

Versuch es

Erweitert

{      # 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 Bytes

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

Beispiel (mit 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

Ziemlich einfach, Tupel als Sortierprädikat für die sekundäre Sortierung zu verwenden.


0

Pyth, 9 Bytes

sosxNcQ1{

Probieren Sie es online aus

Nimmt eine Ziffernfolge als Eingabe.

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.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.