จัดเรียงตามสิ่งที่คู่หลักอธิบาย


17

ด้วยจำนวนเต็มบวกเราสามารถสร้างตัวเลขใหม่ที่อธิบายโดยตัวเลขที่ถูกจับเป็นคู่ (โดยนำ 0 เพิ่มสำหรับตัวเลขที่มีจำนวนหลักคี่)

สำหรับเช่น:

  • 1234 สามารถอ่านได้หนึ่ง 2, สาม 4s - ดังนั้นเอาต์พุตสำหรับ 1234 คือ 2444

  • 643 มีจำนวนเลขคี่ดังนั้นศูนย์นำหน้าจึงถูกเพิ่มเพื่อทำให้เป็นเลขคู่ จากนั้นสามารถอ่าน 0643 เป็น: ศูนย์ 6s, สี่ 3s ดังนั้นผลลัพธ์จะเป็น 3333

(นี่คือOEIS A056967 )

ภารกิจ:กำหนดอาร์เรย์ของจำนวนเต็มบวกเรียงลำดับตามค่าที่อธิบายคู่หลักในลำดับจากน้อยไปหามาก การสั่งซื้อไม่สำคัญระหว่างหมายเลขอินพุตที่นำไปสู่ค่าเดียวกัน

อินพุต : อาร์เรย์ / รายการ / ชุดของจำนวนเต็มบวก ไม่อนุญาตให้นำหน้าศูนย์ในอินพุตและป้อนเป็นสตริง / รายการของตัวเลข / ฯลฯ ไม่ได้รับอนุญาต - อินพุตควรใกล้เคียงกับจำนวนเต็ม / ตัวเลขเนื่องจากภาษาของคุณสามารถใช้งานได้

เอาท์พุท : อาเรย์ที่เรียงลำดับตามวิธีที่กล่าวมาข้างต้นคืนค่าด้วยวิธีใด ๆ ตามปกติ (ฟังก์ชันส่งคืนค่า / STDOUT / ตะโกนไปที่โมฆะ / ฯลฯ ) คุณสามารถพิมพ์แต่ละรายการส่งคืนเป็นตัวเลขสตริงหรือรายการของ ตัวเลข

กรณีทดสอบ

Input 
Output

[19, 91, 2345, 2023]
[19, 2023, 2345, 91]

[25257, 725, 91, 5219, 146125, 14620512]
[725, 5219, 14620512, 91, 146125, 25257]

[123130415 3335 91 111111111 528 88]
[528, 111111111, 123130415, 3335, 88, 91]

[1 21 33 4 5]
[1 4 5 21 33]

[3725, 10, 2537, 1, 1225, 2512]
[10, 1, 1225, 2512, 2537, 3725]

[125, 26, 1115, 1024] 
[1115, 1024, 125, 26]

(ในกรณีทดสอบครั้งที่ 4, 1, 4 และ 5 ทั้งหมดประเมินเป็น 0 และสามารถจัดเรียงกันเองได้ในลำดับใด ๆ เช่นเดียวกันในกรณีทดสอบที่ห้าทั้ง 10 และ 1 ประเมินเป็น 0 และสามารถเรียงลำดับได้ ลำดับใดก็ได้)

(ที่เกี่ยวข้อง: พูดในสิ่งที่คุณเห็น , หนึ่ง 1 สอง 1, One 2 One 1

ขอบคุณ Kevin Cruijssen ที่ช่วยชี้แจงคำถามในกล่องทราย


2
เราสามารถใส่รายการตัวเลขเป็นอินพุตได้หรือไม่ เราสามารถส่งออกรายการของตัวเลขหรือไม่
Mr. Xcoder

@ Mr.Xcoder Input ควรเป็นรายการจำนวนเต็มไม่ใช่รายการหลัก เอาท์พุทอาจเป็นรายการของตัวเลขหลัก แต่ถ้ามันสะดวกกว่า
sundar - Reinstate Monica

ตามที่ระบุโดย @mnel คำตอบของฉันจะไม่ทำงานกับตัวเลขที่มากกว่า 10 หลัก เป็นเรื่องถูกต้องหรือไม่ที่จะต้องรักษาไว้ตามที่ควรจะเป็นหรือฉันควรแก้ไขด้วยราคา 32 ไบต์
JayCe

@JayCe ถ้าฉันเข้าใจถูกต้องข้อ จำกัด นั้นเป็นเพราะนั่นเป็นข้อ จำกัด ของประเภทจำนวนเต็มใน R - - เพราะstrtoiส่งคืนจำนวนเต็ม - ถูกต้องหรือไม่ ถ้าเป็นเช่นนั้นก็ไม่เป็นไรมันถูกต้องตามกฎหมาย
sundar - Reinstate Monica

คุณถูก! จะเก็บไว้ตามที่เป็นอยู่
JayCe

คำตอบ:


5

APL (Dyalog) 26 ไบต์

ขอบคุณ ngn สำหรับการบันทึก 1 ไบต์ :)

{⍵[⍋⌽↑,⍨⌿⍴⌿0 10⊤⍵⊤⍨⍴⍨100]}

ลองออนไลน์!

แรงบันดาลใจมาจากdzaima & ngn


100⊥⍣¯1⊢⍵-> ใช้⍵⊤⍨⍵/100งานได้ 26
jslip

ฉันไม่ต้องการ WSFULLs จากกรณีทดสอบที่ให้มาจริงๆ
H.PWiz

26 เป็นไปได้ด้วย MAXWS = 1M
ngn

100⊥⍣¯1⊢⍵->⍵⊤⍨⍴⍨100
ngn

1
@ H.PWiz และนี่คือโซลูชันที่แตกต่างกันสำหรับ 26 ไบต์:{⍵[⍋⌽↑,⍨⌿⍴⌿⊃⊥⍣¯1/10 100⍵]}
ngn

3

R , 141 ไบต์

(s<-scan(,""))[order(strtoi(sapply(s,function(x)paste(strrep((m=matrix(c(if(nchar(x)%%2)0,el(strsplit(x,""))),2))[2,],m[1,]),collapse=""))))]

ลองออนไลน์!

ค่อนข้างคำตอบที่ลำบาก - แต่มันใช้ได้กับทุกกรณีทดสอบ สร้างเอาต์พุตคู่หลักและเรียงลำดับอินพุตตามสิ่งนี้


ฉันโพสต์แนวทางของฉันสำหรับคำตอบอื่นตั้งแต่ฉันทำงานในบ่ายวันนี้ แต่ฉันถูกขัดจังหวะ เพียงเพื่อให้มั่นใจว่าคุณไม่ได้รับแรงบันดาลใจจากคุณโดยไม่มีเครดิต;)
digEmAll

@digEmA ไม่ต้องกังวล :) - ที่จริงฉันคิดว่าฉันใช้ชื่อvตัวแปรจากคำตอบอื่น ๆ ของคุณ - ฉันไม่เคยใช้มาvก่อน และใช้งานได้ดี intToUtf8!
JayCe

อ่าฉันอิจฉาชื่อตัวแปรตัวอักษรเดียวของฉันจริงๆ! ไม่อย่างจริงจัง ... มาจาก StackOverflow ทุกครั้งที่ฉันโพสต์ตัวเลือก "ที่คล้ายกัน" มันให้ความรู้สึกเหมือนการขโมย;)
digEmAll

strtoi จะส่งคืน NA สำหรับจำนวนเต็มมากกว่า 10 หลัก (เช่นตัวเลขจะไม่)
mnel

@mnel ขอบคุณสำหรับการชี้ให้เห็น! ฉันจะตรวจสอบกับ Sundar และเนื่องจากมันเป็นข้อ จำกัด ของชนิดจำนวนเต็มผมสามารถปล่อยให้มันเป็น :)
Jayce

3

R , 120 ไบต์

(v=scan())[order(sapply(v,function(n,e=nchar(n))sum((a=rep((x=n%/%10^(0:(e-1-e%%2))%%10)[!0:1],x[!1:0]))*10^seq(a=a))))]

ลองออนไลน์!

  • -11 ไบต์ขอบคุณคำแนะนำของ @sundar "arithmetical"!

โค้ดที่ไม่ได้ถูกฟอล์กพร้อมคำอธิบาย:

# define a function G which takes a number 'n' and uncompress it multiplied by 10
# e.g. 2735 -> 775550, 61345 -> 355550 etc.
G=function(n){
  e = nchar(n)                   # get the n.of digits in the compressed number

  x = n%/%10^(0:(e-1-e%%2))%%10  # split 'n' into vector of digits reversed adding 
                                 # trailing zero if 'e' is odd (e.g. 123 -> c(0,3,2,1))

  even = x[!0:1]                 # take only the odd elements of 'x' (= even digits)
  odd  = x[!1:0]                 # take only the even elements of 'x' (= odd digits)
                                 # N.B. :
                                 # these tricks work because !0:1 is c(TRUE,FALSE)
                                 # and V[c(TRUE,FALSE)] exploits the fact that R 
                                 # automatically recycles the logical indexes up to the
                                 # length of the vector V

  a = rep(even,odd)              # repeat each value in 'even' 'odd' times obtaining the
                                 # uncompressed number as digits vector. Note that in
                                 #  case of single digit 'n', 'a' will be an empty vector

  sum(a*10^seq(a=a))             # multiplies 'a' * 10^(1:length(a)) and sum 
                                 # obtaining the uncompressed number multiplied by 10
                                 # N.B. in case of empty 'a', we get 0
}

v = scan()                       # take vector v from stdin

w = sapply(v,G(n))               # apply G to all numbers of 'v'

v[order(w)]                      # use the uncompressed values as weights to sort 'v'

[!1:0]เคล็ดลับคือความสุขที่แท้จริง - ไม่เคยเห็นมันมาก่อน
JayCe

@sundar: เพิ่มคำอธิบาย;)
digEmAll

1
ดี ฉันรู้ว่าคนพวกนั้น[!1:0]ซ่อนอะไรบางอย่างเรียบร้อย ฉันเล่นรอบกับสิ่งนี้และเคล็ดลับในการเล่นกอล์ฟ R พยายามรับหมายเลขจากเลขคณิต (ไม่รวมas.double) แต่มากับรุ่น 132 ไบต์: TIO
sundar - Reinstate Monica

@sundar: ฉันไม่คิดว่าวิธีการเกี่ยวกับคณิตศาสตร์ ... ฉันบันทึก 11 ไบต์ขอบคุณ!
digEmAll

2

Pyth , 14 ไบต์

oir9c.[Z2jNT2T

ลองที่นี่! | ชุดทดสอบ! | 12 ไบต์พร้อมรายการหลัก I / O

มันทำงานอย่างไร?

oir9c.[Z2jNT2T – Full program.
o              – Sort the input list by the results of the following code (variable: N).
         jNT   – Cast the current element to a list of digits.
     .[Z2      – Pad it on the left with 0s to the nearest multiple of 2.
    c       2  – Split in pieces of length 2.
  r9           – Run length decode.
 i           T – Cast the list of digits to a base 10 integer.

2

เยลลี่ 10 ไบต์

ṚẋƝm2ṚFḌµÞ

ลองออนไลน์!

ลองชุดทดสอบ!

มันทำงานอย่างไร

ṚẋƝm2ṚFḌµÞ Monadic link / โปรแกรมเต็มรูปแบบ | ตัวอย่าง: [25257, 725, 91, 5219, 146125, 14620512]
        µÞ เรียงลำดับรายการอินพุตตามผลลัพธ์ของลิงค์ monadic: | ตัวอย่าง: 725
Ṛเลื่อน N ไปยังอาร์เรย์หลักและย้อนกลับ | [5, 2, 7]
 ẋƝสำหรับตัวเลขสองหลักติดต่อกัน x, y, ให้ทำซ้ำ xy คูณ | [[5, 5], [2, 2, 2, 2, 2, 2, 2]]
   m2 Modular 2. รับทุก ๆ องค์ประกอบของอาเรย์นี้ | [[5, 5]]
     Ṛย้อนกลับ | [[5, 5]]
      ฉแบน | [5, 5]
       Ḍแปลงจากทศนิยมเป็นจำนวนเต็ม | 55

มันเป็นเรื่องบังเอิญอย่างแน่นอน: 2537และ3725ไม่แสดงหมายเลขเดียวกัน
Erik the Outgolfer

คุณช่วยให้ฉันทดสอบกรณีที่จะจับได้ว่าและฉันจะเพิ่มที่คำถาม?
sundar - Reinstate Monica

@sundar [2537, 3725]ขณะที่เอริคกล่าวว่า ฉันไม่เคยสงสัยเลยว่านี่เป็นเรื่องบังเอิญดังนั้นฉันจึงรวมหมายเหตุนั้นไว้กับคำตอบ
Mr. Xcoder

@ Mr.Xcoder Testcase ได้เพิ่มขอบคุณ
sundar - Reinstate Monica

2

Perl 6 , 53 ไบต์

*.sort(+*.flip.comb.rotor(2).map({[x] $_}).join.flip)

ลองออนไลน์!

ไม่ระบุชื่อแลมบ์ดาใดก็ตามที่รับรายการค่าและเรียงลำดับตามจำนวนคู่ที่อธิบาย

ในกรณีนี้ฉันจะกลับจำนวนจากนั้นrotorส่งรายการสองรายการเพื่อรับตัวเลขแต่ละคู่ นี่จะยกเว้นตัวเลขแรกสำหรับจำนวนความยาวคี่ แต่เนื่องจากที่แปลเป็น0ครั้งที่ตัวเลขนั้นก็ไม่เป็นไร นอกจากนี้ยังจัดเรียงค่าที่จะใช้[x]อย่างถูกต้อง



2

Haskell , 89 88 ไบต์

บันทึกเป็นไบต์ขอบคุณ ovs

import Data.List
(%)=mod
m?n|n<1=0|n%100<10=m?div n 100|w<-n-10=m*10?w+m*n%10
sortOn(1?)

บรรทัดสุดท้ายกำหนดฟังก์ชั่นที่ไม่ระบุชื่อที่สามารถใช้เช่น:

> sortOn(1?)[19, 91, 2345, 2023]
[19,2023,2345,91]

ฟังก์ชั่นหลักที่ให้บริการโดยผู้ประกอบการมัด(?)ซึ่งติดตามคูณ, และการป้อนข้อมูลm RLE เหลือ ลบ 10 อย่างต่อเนื่องจากขณะที่มีจำนวนสิบหลักเพื่อลบออกและเช่นนั้นมันจะผลักสำเนาอีกชุดของตัวเลขสุดท้ายที่ด้านหน้าของเอาท์พุท (ผ่านตัวคูณซึ่งเพิ่มขึ้น 10 ในแต่ละครั้ง) เมื่อหลักสิบถูกใช้จนหมดเลขสองหลักสุดท้ายจะถูกยกเลิกและกระบวนการจะทำซ้ำจนกว่าตัวเลขจะลดลงเหลือ 0 ในที่สุดเราใช้โอเปอเรเตอร์ (ที่มีตัวคูณเริ่มต้น 1) เป็นคีย์เรียงลำดับn(?)nm


1
m?n|n<1=0|n%100<10=m?div n 100|w<-n-10=m*10?w+m*n%10เป็นไบต์ที่สั้นกว่า
ovs

2

Huskขนาด 10 ไบต์

ÖödṁΓ*C_2d

ลองออนไลน์!

คำอธิบาย

ÖödṁΓ*C_2d    Full function
Ö             Sort the input list by the result of...
 ö            The composition of these four functions:
         d      Convert to a list of digits
      C_2       Split into length-2 sublists starting at the end
   ṁ            Map the following function and concatenate the results:
    Γ*            Repeat the list tail X times, where X is the list head
  d             Convert back to an integer

2

Dyalog APL, 41 39 36 35 31 30 29 ไบต์

f←⊂⌷¨⍨∘⍋{10⊥∊⍴⌿0 10100⊥⍣¯1⊢⍵}¨

ลองออนไลน์!

-2 ขอบคุณCack quack
-4 (บวก -4 สำหรับแนวคิดการแปลงพื้นฐาน) ขอบคุณngn
-2 ขอบคุณH.PWiz


⊃,/สามารถเป็น
Kritixi Lithos

@Cockquack ฉันรู้ว่าฉันลืมในตัว: p
dzaima

{⍺⍴⍨⍎⍵}->⍴⍨∘⍎
ngn

@ngn แน่นอนฉันไม่สามารถจำสิ่งที่ jot / ฝึกทั้งหมดได้
dzaima

นี่คือเคล็ดลับสำหรับ -1 ไบต์อื่น - trainify {⍵[⍋F ⍵]}เป็น⊂⌷¨⍨∘⍋F
NGN

2

C (gcc) (ระบบ 32 บิต), 188 177 176 ไบต์

char*p,*q,c[99],b[99]="0";i;d(x){for(p=b+!(sprintf(b+1,"%d",x)&1),q=c;i=*p++;++p)for(i-=48;i--;*q++=*p);*q=0;atoi(c);}m(int*a,int*b){return d(*a)-d(*b);}s(l,c){qsort(l,c,4,m);}

ลองออนไลน์!

บนamd64เพิ่มธง-m32สำหรับการรวบรวม

การใช้ : s(x,n);โดยที่xชี้ไปที่อาร์เรย์ของจำนวนเต็มเพื่อเรียงลำดับและnเป็นความยาวของอาร์เรย์นั้น

กรณีทดสอบที่สองให้ผลที่ไม่ถูกต้องเนื่องจากการแปลง25257ให้2222277777จำนวนเต็ม 32 บิตมากเกินไป - เพิ่มกรณีทดสอบที่ 5 โดยไม่มีหมายเลขนั้น

คำอธิบาย:

char*p,                                     // d(): input pointer
    *q,                                     // d(): output pointer
    c[99],                                  // d(): output buffer
    b[99]="0";                              // d(): input buffer
                                            //      (fixed first char 0)
i;                                          // d(): repeat counter

d(x){                                       // conversion function
    for(
            p=b+!(sprintf(b+1,"%d",x)&1),   // print number in decimal to
                                            // input buffer, starting at second
                                            // character, initialize input
                                            // pointer to first or second char
                                            // depending on the length of the
                                            // number
            q=c;                            // initialize output pointer
            i=*p++;                         // set repeat counter to digit and
                                            // point to next digit, stop when
                                            // NUL character is found
            ++p)                            // point to next digit after loop
        for(i-=48;i--;*q++=*p);             // inner loop, append current digit
                                            // i-48 ('0') times to output buffer
    *q=0;                                   // terminate output with NUL
    atoi(c);                                // convert to number, 'return' not
                                            // needed as atoi() leaves result
                                            // on the stack
}

m(int*a,int*b){                             // comparison function for qsort
    return d(*a)-d(*b);                     // return difference of converted
}                                           // values

s(l,c){                                     // sorting function
    qsort(l,c,4,m);                         // only "wrap" qsort, assuming
}                                           // sizeof(int) is 4

ฟังก์ชั่นของคุณd()เป็นเวลานานเพราะสตริงและฟังก์ชั่นที่เกี่ยวข้องกับพวกเขาคุณสามารถบันทึกจำนวนไบต์เพียงโดยการอ่านตัวเลข 2 ตัวสุดท้ายและการสร้างการส่งออกเช่นนี้o;u;i;d(x){for(u=1,o=0;x;x/=100)for(i=0;i++<x%100/10;o+=x%10*u,u*=10);x=o;}m(int*a,int*b){u=d(*a)-d(*b);}s(l,c){qsort(l,c,4,m);}คุณจะยังประหยัดไบต์โดยการหลีกเลี่ยงการประกาศและการเริ่มต้นcharของ
Annyo

แนวคิดที่ดี - ฉันคิดว่าการทำงานกับค่าจำนวนเต็มทำให้วิธีนี้แตกต่างอย่างสิ้นเชิงดังนั้นคุณควรพิจารณาการโพสต์คำตอบหรือไม่ :)
เฟลิกซ์ Palmen

แนะนำb-~sprintf(b+1,"%d",x)%2แทนb+!(sprintf(b+1,"%d",x)&1)
Ceilingcat

@ Annyo แนะนำx/10%10แทนx%100/10
ceilingcat


1

Brachylogขนาด 18 ไบต์

{↔ġ₂ẹ{Ċj₎|Ȯt}ˢ↔c}ᵒ

ลองออนไลน์!

คำอธิบาย

จำนวนของสิ่งเล็ก ๆ น้อย ๆ ที่จำเป็นต่อการพิจารณาคดีทั้งสามกรณี: จำนวนหลักคี่คู่ 0 ครั้งต่อจำนวนและคู่ปกติ

{               }ᵒ     Order the Input according to the output of this predicate
 ↔                       Reverse the number
  ġ₂                     Group into pairs; the last digit is alone if there are
                           an odd number of them
    ẹ{      }ˢ           For each group:
      Ċ                    If there are two elements
       j₎                  Juxtapose the first one as many times as the second
                             element (won't work if the second element is 0)
         |                 Else
          Ȯ                If there is one element (odd number of digits)
           t               just take that element
                           (Else don't select anything, i.e. 0 repetitions)
              ↔c         Reverse and concatenate back into an integer

ฉันคิดว่า|Ȯtมันไม่จำเป็นและที่จริงแล้วมันผิด: มันเทียบเท่ากับ padding ด้วย 1 แทนที่จะเป็น 0 ดังนั้น [125, 26, 1] จึงให้เรียงเป็น [1, 26, 125] แทนที่จะเป็น [1] , 125, 26]
sundar - Reinstate Monica

1

Perl 5 , 76 ไบต์

ฟังก์ชั่นแทนหนึ่งซับสำหรับหนึ่งครั้ง

ค่อนข้างตรงไปข้างหน้า: gเรียงลำดับอินพุตเป็นตัวเลขโดยใช้hเพื่อแปลงตัวเลข hทำสิ่งนี้โดยใช้ regex s/(.)(.)/$2x$1/gre(ซึ่งน่าจะอ่านได้มากพอ) และ0ซ้าย padding จะทำด้วย0 x("@_"=~y///c%2)."@_"(ซึ่งy///cเป็นวิธีที่ shorted ของการเขียนlength, xเป็นผู้ประกอบการทำซ้ำและ.การ concatenation)

sub h{(0 x("@_"=~y///c%2)."@_")=~s/(.)(.)/$2x$1/gre}sub g{sort{h($a)-h$b}@_}

ลองออนไลน์!

ฉันคาดว่าจะเห็นคำตอบ Perl สั้น ๆ ว่า!


1

เรติน่า 44 ไบต์

^.?((..)*)$
$1 $&
%)`\G(\d)(.)
$1*$2
N`
.+ 

ลองออนไลน์! การสร้างคีย์การเรียงลำดับที่จุดเริ่มต้นของบรรทัดนั้นยากขึ้น แต่การเรียงลำดับแบบสั้นจะส่งผลให้ประหยัด 3 ไบต์โดยรวม คำอธิบาย:

%)`

ใช้สองขั้นตอนแรกในแต่ละบรรทัดทีละรายการ

^.?((..)*)$
$1 $&

จับคู่และคัดลอกจำนวนหลักท้าย

\G(\d)(.)
$1*$2

แทนที่แต่ละคู่หลักด้วยค่าที่อธิบายไว้ \G\dทำให้เกิดการแข่งขันที่จะหยุดที่พื้นที่

N`

จัดเรียงตัวเลข

.+ 

ลบคีย์การเรียงลำดับ


นั่นเป็นเคล็ดลับที่ฉลาดในการจัดเรียงโดยใช้กุญแจ สิ่งที่ดี.
sundar - Reinstate Monica

1

05AB1E , 20 19 ไบต์

ΣDgÉi¦}2ôε`sиJ}J0ìï

ข้อผิดพลาดคงที่สำหรับ 1 ไบต์และจากนั้นแข็งแรงเล่นกอล์ฟโดย -2 ไบต์ขอบคุณที่@sundar

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

สามารถเล่นกอล์ฟได้แน่นอน .. ไม่พอใจกับมันมาก

คำอธิบาย:

Σ                    # Sort by:
 Dg                  #  Duplicate the current number, and take it's length
                     #   i.e. 25257 → 5
                     #   i.e. 4 → 1
   Éi }              #  If this length is odd:
     ¦               #   Remove the first digit
                     #    i.e. 25257 → '5257'
                     #    i.e. 4 → ''
       2ô            #  Then split the number in pieces of 2
                     #   i.e. '5257' → ['52','57']
                     #   i.e. '' → []
         ε    }      #  And map each to:
          `          #   Push both digits to the stack
                     #    i.e. '52' → '5' and '2'
           s         #   Swap them
            и        #   Repeat the first digit the second digit amount of times
                     #    i.e. '2' and '5' → ['2','2','2','2','2']
             J       #   Join the list of digits together
                     #    i.e. ['2','2','2','2','2'] → '22222'
               J     #  Join all numbers back together again
                     #   i.e. ['','22222','77777'] → '2222277777'
                     #   i.e. [] → ''
                0ì   #  Prepend a 0 (because `Σ` will put all '' at the back)
                     #   i.e. 2222277777 → '02222277777'
                     #   i.e. '' → '0'
                  ï  #  Cast it to an integer, because sorting is done string-wise by
                     #  default despite 05AB1E's interchangeability of strings and numbers;
                     #  and it's also to remove all leading zeros
                     #   i.e. '02222277777' → 2222277777
                     #   i.e. '0' → 0

1

ทูต 50 ไบต์

SortBy!N@Flip##~`&&>PadRight&0&2=>Chop&2@Flip@List

ลองออนไลน์!

คำอธิบาย

SortBy!N@Flip##~`&&>PadRight&0&2=>Chop&2@Flip@List      anonymous function, argument: [a1..aN]
SortBy!                                                 sort the given array by grading f[ai]
                                                        e.g. 42513
                                              List      digits of ai
                                                        e.g. [4, 2, 5, 1, 3]
                                         Flip@          flip the digits around
                                                        e.g. [3, 1, 5, 2, 4]
                                  Chop&2@               chop into groups of 2
                                                        e.g. [[3, 1], [5, 2], [4]]
                    PadRight&0&2=>                      pad each group to size 2 with 0's
                                                        e.g. [[3, 1], [5, 2], [0, 4]]
                  &>                                    using each sub array as arguments...
               ~`&                                      ...repeat the 2nd the 1st amount of times
                                                        e.g. [[1, 1, 1], [2, 2, 2, 2, 2], []]
             ##                                         then:
         Flip                                           reverse the groups
                                                        e.g. [[2, 2, 2, 2, 2], [1, 1, 1]]
       N@                                               then convert it to an number
                                                        e.g. 22222111


1

Japt, 13 ไบต์

ñ_ì_ò2n)®rçì

ลองใช้หรือเรียกใช้กรณีทดสอบทั้งหมด


คำอธิบาย

ñ_                :Sort by passing each integer through a function
  ì_              :  Split to an array of digits, pass it through the following function and implicitly convert back to an integer
    ò2n)          :    Starting from the end of the array, split at every second element
        ®         :    Map
         rç       :      Reduce X & Y by repeating X Y times
           Ã      :    End mapping
            ¬     :    Join



0

Java 11, 204 189 ไบต์

L->{L.sort((a,b)->Long.compare(s(a+""),s(b+"")));}long s(String s){var r="";for(int l=s.length(),i=l%2;i<l;)r+=s.split("")[++i].repeat(s.charAt(i++-1)-48);return r.isEmpty()?0:new Long(r);}

รับ List of Longs เป็นพารามิเตอร์และเรียงลำดับรายการอินพุตนี้ (โดยไม่ส่งคืนรายการใหม่)

ลองออนไลน์ (หมายเหตุ: String.repeat(int)จำลองขึ้นrepeat(String,int)เนื่องจาก Java 11 ยังไม่ได้อยู่ใน TIO เลยไบต์นับยังคงเหมือนเดิม)

คำอธิบาย:

L->{                     // Method with ArrayList<Long> parameter and no return-type
  L.sort(                //  Sort the list by:
   (a,b)->Long.compare(  //   Using a builtin Long-comparator with:
     s(a+""),s(b+"")));} //   The correctly formatted values as described in the challenge

long s(String s){        // Separated method with String parameter and long return-type
  var r="";              //  Temp-String, starting empty
  for(int l=s.length(),  //  The length of the input-String
      i=l%2;i<l;)        //   If the length is even:
                         //    Loop `i` in the range [0,`l`) (in steps of 2)
                         //   Else (the length is odd):
                         //    Loop `i` in the range [1,`l`) (in steps of 2) instead
    r+=                  //   Append the result-String with:
      s.split("")[++i].  //    The digit at index `i+1`
      .repeat(s.charAt(i++-1)-48);
                         //    Repeated the digit at index `i` amount of times
  return r.isEmpty()?    //  If the temp-String is empty:
          0              //   Return 0
         :               //  Else:
          new Long(r);}  //   Convert the temp-String to a long and return it

สวัสดีความท้าทายปิดการป้อนสตริงขออภัยอย่างชัดเจน! (ฉันอยากจะอนุญาตให้ใช้กับ Java แต่จะไม่ยุติธรรมกับคำตอบอื่น ๆ )
sundar - Reinstate Monica

@Sundar Ah พลาดความต้องการนั้นไป ไม่ดีของฉันโชคดีที่มันเป็นเรื่องง่ายเพียงเพิ่ม 2x +""เพื่อแปลงจำนวนเป็น String ควรได้รับการแก้ไขแล้ว :)
Kevin Cruijssen

1
ดี ฉันไม่ได้คาดหวังว่าจากจาวา :)
sundar - Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.