จัดทำดัชนีตัวเลข


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

ค่อนข้างตรงไปข้างหน้า: เรียงลำดับตัวเลขของสตริงอินพุตก่อนจากผลรวมของดัชนีของพวกเขาและตัวหลัก (-> คู่ของ (ผลรวม ... , 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 ต้องขอบคุณ Riley

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 เป็นภาษาแปลก ๆ ... ดูเหมือนว่ายิ่งคุณใช้อีกต่อไปนานเท่าไหร่คุณก็ยิ่งพยายามซับซ้อนทุกอย่างมากขึ้น ... ขอบคุณใช่แล้วดูเหมือนว่าจะทำงานได้ดี
Magic Octopus Urn

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)

ลองออนไลน์!

ตั้งค่า hashtable ที่ว่างเปล่า$aจากนั้นจึงแปลงค่าอินพุต$argsเป็นcharอาร์เรย์แล้ววน|%{...}ซ้ำแต่ละองค์ประกอบ เราตั้งค่าที่ "องค์ประกอบปัจจุบัน" $aที่จะเพิ่มขึ้นโดย$i++นับดัชนีของท่าน ตัวอย่างเช่นสำหรับการป้อนข้อมูล300433766111, วงแรกที่$a[3]ได้รับ+=0; วนรอบต่อไป$a[0]ได้รับ+=1 ; เป็นต้น

ต่อไปเราต้องSortแฮชเทดของเรา น่าเสียดายเนื่องจากการเล่นโวหารในภาษาซึ่งหมายความว่าเราต้อง$a.GetEnumerator()ก่อนที่จะทำการเรียงลำดับจริง เราเรียงลำดับตามvalueแล้วตามnameเพื่อตอบสนองความต้องการของตัวเลขที่น้อยกว่าให้เรียงลำดับก่อน เราดึง.Names ออกมา(เรียงตามลำดับ) -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 ไบต์

ขอบคุณ Ben Frankel ที่ช่วยประหยัด 10 ไบต์!

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

ลองออนไลน์!

รับอินพุตเป็นสตริงและส่งออกจำนวนเต็ม ใช้พจนานุกรมเพื่อเก็บผลรวมของดัชนีจากนั้นเรียงลำดับตามค่า แปลงเป็นจำนวนเต็มเปลื้องผ้า zeroes ชั้นนำเพราะสั้นกว่าint.lsplit('0')


a[j]=a.get(j,0)+iบันทึก 10 ไบต์
Ben Frankel

1

Python 3.5, 86 85 bytes

ขอบคุณ @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 ไบต์
Ben Frankel

1

Pip , 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

สกาลา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

ตรงไปตรงมาสวยใช้ tuple เป็นกริยาการเรียงลำดับสำหรับการจัดเรียงรอง


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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.