ตัวเลขเพิ่มขึ้นขณะที่ตัวอักษรลดลง


23

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

คุณควรใช้รายการของวัตถุที่เป็น input ที่มีตัวอักษร (รูปแบบที่เหมาะสมใด ๆ : string, charฯลฯ ) และตัวเลข คุณควรเรียงลำดับตัวเลขจากมากไปหาน้อยและเรียงตามลำดับจากมากไปน้อย อย่างไรก็ตามคุณควรเก็บตัวอักษรไว้ในตำแหน่งตัวอักษรและตัวเลขในตำแหน่งตัวเลข ตัวอย่างเช่นหากรายการคือ:

[L, D, L, L, D, L]

รายการเอาท์พุทควรอยู่ในรูปแบบของ:

[L, D, L, L, D, L]

Workthrough

การป้อนข้อมูล: ['a', 2, 'b', 1, 'c', 3]

  • เรียงลำดับตัวเลขจากน้อยไปหามาก: [1, 2, 3]
  • เรียงตัวอักษรตามลำดับจากมากไปน้อย: ['c', 'b', 'a']
  • เข้าร่วมพวกเขากลับ แต่รักษาลำดับเดิม: ['c', 1', 'b', 2, 'a', 3]

กฎระเบียบ

  • รายการจะประกอบด้วยตัวอักษรและตัวเลขเท่านั้น
  • รายการอาจว่างเปล่า
  • รายการอาจประกอบด้วยตัวอักษรหรือตัวเลขเท่านั้น
  • หากภาษาของคุณไม่รองรับอาเรย์แบบผสมคุณสามารถใช้ตัวอักษรแทนตัวเลขได้ โปรดทราบว่าหากภาษาของคุณรองรับสิ่งนี้คุณต้องใช้ประเภทผสม
  • ตัวอักษรจะเป็น[a-z]หรือ[A-Z]คุณอาจเลือกที่หนึ่ง
  • ตัวอักษรจะถูกจัดเรียงเป็นaถูกต่ำสุดเป็นที่สูงที่สุดคือza = 1, z = 26
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • I / O อาจเป็นวิธีมาตรฐานรวมถึงเป็นสายอักขระ

กรณีทดสอบ

[5, 'a', 'x', 3, 6, 'b'] -> [3, 'x', 'b', 5, 6, 'a']

[ 3, 2, 1] -> [ 1, 2, 3 ]

[ 'a', 'b', 'c' ] -> [ 'c', 'b', 'a' ]

[] -> []

[ 2, 3, 2, 1 ] -> [1, 2, 2, 3]

นี่คือคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Martin Ender

คำตอบ:


7

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

O`\d
O^`\D

ลองออนไลน์!

Oเวที Retina โดยตรงสามารถดำเนินการชนิดของการเลือกการเรียงลำดับจำเป็นโดยความท้าทายนี้

นี่บรรทัดแรกเรียงลำดับตัวเลขในขณะที่บรรทัดที่สองเรียงลำดับตัวเลขที่ไม่ใช่แบบย้อนกลับ


13

Python 2 , 53 52 ไบต์

-2 ไบต์ขอบคุณ g.rocket
-1 ไบต์ขอบคุณ Jonathan Frech

def F(x):n=sorted(x);print[n.pop((e<x)-1)for e in x]

ลองออนไลน์!

sortedรายการจะมีตัวเลขก่อนแล้วตัวอักษรเช่น[3, 5, 6, 'a', 'b', 'x']จากนั้นใช้e<xตัวกรองสิ่งที่เป็นตัวเลขและสิ่งที่เป็นถ่านในหลามจำนวนใดน้อยกว่ารายการ (input) และรายการน้อยกว่าสตริง


นี้รุ่นIndexError: pop index out of rangeล้มเหลวด้วย วิธีแก้ปัญหาเดิมทำงานได้
Mr. Xcoder

วิธีนี้ใช้ได้ผลด้วยขนาด 55 ไบต์เช่นกัน ควรจะเป็น1-(e<'`') (e<'`')-1คุณเพียงแค่วางไว้ในลำดับที่ไม่ถูกต้อง BTW คุณ ninja'd ฉัน: / ฉันมีสิ่งนี้
Mr. Xcoder

@ Mr.Xcoder ขอบคุณสำหรับความช่วยเหลือ c:
Rod

2
ประหยัดสองด้วยe>x
g.rocket

1
@RootTwo ซึ่งตรงกันข้ามกับพฤติกรรมที่ตั้งใจไว้
LyricLy

9

APL (Dyalog) , 27 26 ไบต์

คาดว่าอักขระจะเป็นตัวพิมพ์ใหญ่

(⍋⊃¨⊂)@(~e)(⍒⊃¨⊂)@(e←∊∘⎕A)

ลองออนไลน์!

นี่เป็นเพียงสองโปรแกรมในรูปแบบf@gใช้ฟังก์ชั่นในรายการที่ระบุโดยfg

สำหรับการใช้งานแอพลิเคชันแรกที่เรา:
f:  ⍒⊃¨⊂ เกรดจากมากไปน้อย ( ) แต่ละเลือก ( ⊃¨) จากอาร์กิวเมนต์ทั้งหมด ( )
g:  (e←∊∘⎕A) สมาชิก ( ) ของ ( ) เดอะlphabet ( ) และการจัดเก็บ ( ) ฟังก์ชั่นนี้เป็น⎕Ae

เป็นครั้งที่สองที่เราใช้งาน:
f:  ⍋⊃¨⊂ เกรดจากน้อยไปมาก ( ) แต่ละเลือก ( ⊃¨) จากอาร์กิวเมนต์ทั้งหมด ( )
g:  (~e) ไม่ ( ~) สมาชิกของตัวอักษร ( e; ฟังก์ชั่นที่เราเก็บไว้ก่อนหน้านี้)


ฉันคิดว่าสิ่งนี้ต้องครอบคลุมจำนวนเต็มทั้งหมดดังนั้นให้แทนที่ตัวกรองที่สองด้วย83=⎕DR¨⍵
Uriel

@Uriel ดูเหมือนจะไม่ได้มีความต้องการ แต่ได้บันทึกไบต์ นอกจากนี้⎕DRไม่ครอบคลุม 83 สำหรับตัวเลขเท่านั้นสำหรับจำนวนเต็มขนาดเล็ก
2560

เป็น3=10|⎕DRจำนวนเต็มเสมอหรือไม่
Uriel

@Uriel ใช่: 0 = UnicodeChar, 1 = Boolean, 2 = ClassicChar, 3 = int, 5 = float, 6 = ตัวชี้, 7 = ทศนิยม, 9 = ซับซ้อน ⌊0.1×⎕DRช่วยให้คุณมีจำนวนบิตที่ใช้ในการแสดงแต่ละเกลายกเว้นตัวชี้ซึ่งขึ้นอยู่กับสถาปัตยกรรม แต่มักจะมี 326 2|⎕DRดังนั้นตัวเลขทั้งหมดเป็น
อดัม

8

JavaScript (ES6), 71 51 47 ไบต์

บันทึก 20 ไบต์เพียงใช้sort()ตามที่แนะนำโดย@JustinMariner
บันทึกอีก 4 ไบต์ขอบคุณ@CraigAyre

การใช้วิธีการคล้าย ๆ กันกับคำตอบของ Python ของ Rod :

a=>[...a].map(n=>a.sort()[1/n?'shift':'pop']())

กรณีทดสอบ


ฉันทำบางสิ่งหายไปหรือคุณไม่สามารถลบsortฟังก์ชันทั้งหมดและใช้sort()ด้วยตัวเองได้ ดูเหมือนว่าจะเรียงในลักษณะเดียวกันโดยไม่มีฟังก์ชั่น (ใน Chrome / FF / Edge)
Justin Mariner

@JustinMariner ในตอนแรกฉันคิดว่าค่าตัวเลขอาจเป็นตัวเลขได้ซึ่งในกรณีนี้sort()จะไม่ง่าย แต่เนื่องจากเรา จำกัด ตัวเลขคุณจึงถูกต้อง: มันใช้งานได้ ขอบคุณ!
Arnauld

1
วิธีแก้ปัญหาที่ดีคุณสามารถเปลี่ยน / ป๊อปในa.sort()แต่ละวงแทนที่จะกำหนดให้xหรือไม่:.map(n=>a.sort()[1/n?'shift':'pop']())
Craig Ayre

@ CraigAyre จับได้ดีมาก!
Arnauld

ฉันค่อนข้างมั่นใจว่า+nสามารถใช้แทน1/n
Conor O'Brien

5

R , 83 76 ไบต์

-7 ไบต์ขอบคุณ Miff

function(n){u=unlist
d=n%in%0:9
n[d]=sort(u(n[d]))
n[!d]=sort(u(n[!d]),T)
n}

นี่เป็นเหมือนด้านล่าง แต่อนุญาตให้ป้อนข้อมูลแบบผสมเป็นแบบเวกเตอร์listมากกว่าatomic(ซึ่งจะพิมพ์ทุกอย่างเป็นอักขระที่มีประเภทผสม)

ลองออนไลน์!

R , 68 61 ไบต์

-7 ไบต์ขอบคุณ Miff

function(n){d=n%in%0:9
n[d]=sort(n[d])
n[!d]=sort(n[!d],T)
n}

ฟังก์ชั่นไม่ระบุชื่อ ตัวเลขทั้งหมดถูกส่งไปยังอักขระในกรณีนี้ n[-d]คืออาร์เรย์ที่ไม่มีตัวเลข ส่งคืนNULL(รายการว่าง) จากอินพุตว่าง

ลองออนไลน์!


คุณสามารถกำจัดตัวละครด้วยd=n%in%0:9
Miff

4

Japté , 18 15 ไบต์

ขอบคุณ @Shaggy สำหรับ -3 ไบต์และสำหรับความช่วยเหลือในการแก้ไขสำหรับอาร์เรย์ด้วย0s


c ñc
®¤?Vv :Vo

บรรทัดแรกเว้นว่างโดยเจตนา

ลองออนไลน์! ใช้-Qเพื่อดูอาร์เรย์ที่จัดรูปแบบ

คำอธิบาย

บรรทัดแรกว่างเปล่าเพื่อหลีกเลี่ยงการเขียนทับอาร์เรย์อินพุต
[5, 'a', 'x', 3, 6, 'b']

c ñc

ทำสำเนาโดยการแบน ( c) อาร์เรย์อินพุตจากนั้นเรียงลำดับ ( ñ) ด้วยสตริงที่แสดงด้วยรหัสถ่าน ( c) Vนี้จะถูกเก็บไว้ใน
[3, 5, 6, 'a', 'b', 'x']

£

จากนั้นทำการแมปอาร์เรย์อินพุตตามฟังก์ชัน ...

¤?Vv :Vo

เปลี่ยนตัวเลขเป็นสตริงไบนารี่ (ความจริง) หรือสตริงเป็น""(เท็จ) ( ¤) หากความจริงลบออกจากจุดเริ่มต้นของV( v) มิฉะนั้นลบออกจากจุดสิ้นสุด ( o)



@Shaggy Nice นั่นฉลาดจริงๆ ขอบคุณ!
Justin Mariner

คุณลืมที่จะเปลี่ยนVoและVvรอบ ๆ ฉันเชื่อว่าจะต้องมีวิธีที่สั้นกว่าโดยไม่ต้องประกอบไปด้วย
ปุย

@ Shaggy โอ้โห และใช่เพียงแค่ถ้าoสามารถลบออกจากจุดเริ่มต้นที่มีค่าเชิงลบหรือบางสิ่งบางอย่าง ...
จัสตินนาวิน

4

JavaScript, 164 162 158 142 ไบต์

แก้ไข 1: 2 ไบต์น้อยลงหลังจากลบการมอบหมายที่ซ้ำซ้อนของ v

แก้ไข 2: 4 ไบต์น้อยลงขอบคุณ TheLethalCoder

แก้ไข 3: 16 ไบต์น้อยลงขอบคุณคำแนะนำที่ยอดเยี่ยมจาก Justin Mariner

x=>eval("n=v=>typeof(v)=='number';l=x.length;for(i=0;i<l;x[i++]=x[m],x[m]=w){for(v=w=x[j=m=i];++j<l;)n(e=x[j])==n(w)&&e<v==n(w)&&(m=j,v=e)}x")

นี่เป็นครั้งแรกของฉันในการเขียนโค้ดกอล์ฟดังนั้นจึงสามารถปรับปรุงได้อย่างแน่นอน ... แต่ก็คุ้มค่าที่จะลอง

โปรแกรมดำเนินการชุดตัวเลือกการเลือกซึ่งคำนึงถึงค่าประเภทเดียวกันกับรายการปัจจุบันเท่านั้น (การสลับเฉพาะตัวเลขและตัวเลขหรือตัวอักษรและตัวอักษร)

แบบฟอร์มที่อ่านได้:

x=>eval("
    n=v=>typeof(v)=='number';
    l=x.length;
    for(i=0;i<l;x[i++]=x[m],x[m]=w){
        for(v=w=x[j=m=i];++j<l;) 
            n(e=x[j])==n(w) && e<v==n(w) && (m=j,v=e)
    }
    x
")

for(j=i+1;j<l;j++)-> for(j=i++;++j<l;)และลบส่วนเพิ่มในลูปด้านนอก
TheLethalCoder

ยินดีต้อนรับ PPCG ด้วย!
TheLethalCoder

@TheLethalCoder ถ้าเราเพิ่มตัวนับเร็วเราจะต้องเปลี่ยนบรรทัดที่ใช้ i และ j ... แต่ความคิดนั้นฉลาดจริงๆฉันจะคิดวิธีใช้มันต่อไป
mackoo13

คุณสามารถเพิ่มขึ้นได้jตามที่ฉันแนะนำฉันไม่เห็นว่าคุณใช้งานได้iมากขึ้นเพียงแค่เปลี่ยนไปx[i]=x[m]เช่นกันx[i++]=x[m]
TheLethalCoder

อ่าแน่นอน ... ทำไมฉันไม่คิดถึงx[i++]=x[m]... ขอบคุณ!
mackoo13

3

C ++ 17 (gcc) , 219 ไบต์

#include <variant>
#include <set>
using V=std::variant<char,int>;void f(V*a,V*b){std::set<V>S[2];for(V*c=a;c<b;++c)S[c->index()].insert(*c);auto
C=S->rbegin();auto N=S[1].begin();for(;a<b;++a)*a=(a->index()?*N++:*C++);}

ลองออนไลน์!

การแข่งขันแทบจะไม่ แต่ฉันต้องสนับสนุนอาร์เรย์แบบผสมหรือไม่ ละเอียด.

ยอมรับอาเรย์ของตัวแปรในรูปแบบของช่วงและปรับเปลี่ยนให้เข้าที่ คัดลอกอินพุตเป็นชุดที่เรียงสองชุดจากนั้นกลับสู่อาร์เรย์อินพุต / เอาต์พุต


สิ่งนี้น่าสนใจ ฉันจะไม่ตีความ "การสนับสนุนอาร์เรย์ประเภทผสม" ด้วยวิธีนี้ มิฉะนั้นฉันจะต้องใช้อาร์เรย์ของvoid *ใน C;) แต่ใช่น่าสนใจเพื่อดูวิธีการแก้ปัญหาการกระโดดผ่านห่วงดังกล่าว
เฟลิกซ์ Palmen

คุณสามารถบันทึกสองไบต์ด้วยการลบช่องว่างใน#includes
Conor O'Brien



2

Pyth , 12 11 ไบต์

KSQm.(Kt>\@

ลองออนไลน์! หรือลองใช้ชุดทดสอบ


คำอธิบาย

KSQm.(Kt<d\@  - Full program with implicit input.

KSQ           - Assign a variable K to the lexicographically sorted input.
   m          - Map over the input (with a variable d).
    .(K       - Pop the sorted list at this location:
       >\@    - If d is lexicographically lower than '@', at 0 (the first element). Else, at -1 (the last element).

เดี๋ยวก่อนคุณไม่จำเป็นต้องสั่งอาเรย์ทั้งหมดเพียงแค่แบ่งเป็นสองอาเรย์ที่เป็นเนื้อเดียวกันซึ่งแต่ละอันควรเรียงลำดับได้ง่าย APL ไม่สามารถเรียงลำดับอาร์เรย์แบบผสมได้ (แต่) แต่ฉันเรียงลำดับแต่ละประเภทแยกกัน
2560

@ Adámคุณหมายถึงอะไรโดยแยกเป็นสองอาร์เรย์ที่เป็นเนื้อเดียวกันซึ่งแต่ละอันควรเรียงได้ง่าย ?
Mr. Xcoder

ตามที่อธิบายไว้ใน "Workthrough" ของ OP: 1. จดบันทึกองค์ประกอบที่เป็นตัวเลขและตัวอักษรใด 2. แยกตัวเลขทั้งหมดลงในอาร์เรย์ที่แยกต่างหากและเรียงลำดับนั้น ทำเช่นเดียวกันสำหรับตัวละคร 3. ใส่หมายเลขที่เรียงกลับเข้าไปในช่องหมายเลข ทำเช่นเดียวกันสำหรับตัวละคร
อดัม

@ Adámหาก OP พิจารณาว่าไม่ถูกต้องฉันจะทำสิ่งที่คุณพูด (จะส่งผลให้ใช้เวลานานกว่านี้มาก)
Mr. Xcoder

2

Python, 145 139 130 ไบต์

บันทึก 6 ไบต์ด้วย @officialaimm

บันทึกแล้ว 9 ไบต์ด้วย @Chris_Rands

g=lambda s,a:sorted(x for x in s if(type(x)==str)==a)
def f(s):l,n=g(s,1),g(s,0)[::-1];return[[n,l][type(x)==str].pop()for x in s]

ลองออนไลน์!



type(x)==strจะช่วยประหยัดบางไบต์ไปโดยใช้isinstance(...)ฉันคิดว่า
Chris_Rands

@Chris_Rands ขอบคุณ!
Uriel

2

05AB1E , 17 ไบต์

SaJ¹á{R¹þ{«vyay.;

ลองออนไลน์!


SaJ               # Push 1 if letter 0 else, for all letters in string.
   ¹á{R           # Reverse sort letters from input.
       ¹þ{        # Regular sort digits from input.
          «       # Concatenate those two things.
           v      # For each letter in the sorted string...
            ya    # 0 if digit, 1 if letter.
              y.; # Replace first instance of 0/1 with digit/letter.

การใช้การเรียงลำดับโดยปิดจริง ๆ แล้วแย่กว่า: Σ©Ç®ai0<*}}¹SaJsvyay.;


2

Python 3, 77 ไบต์

คำตอบนี้ขึ้นอยู่กับความคิดเห็นที่ระบุว่าคุณสามารถใช้ '1', '2' ฯลฯ หากตัวอักษรและตัวเลขไม่สามารถเปรียบเทียบได้ในภาษา 'a' และ 1 ไม่สามารถเทียบเคียงได้ใน Python 3

def f(s):x=sorted(s,key=lambda c:ord(c)-95);return[x.pop(-(c>'.'))for c in s]

2

Q / kdb + 54 53 ไบต์

วิธีการแก้:

{x[w,q]:asc[x w:(&)d],desc x q:(&)(~)d:-7=type@/:x;x}

ตัวอย่าง:

q){x[w,q]:asc[x w:(&)d],desc x q:(&)(~)d:-7=type@/:x;x}(5;"a";"x";3;6;"b") / mixed list
3
"x"
"b"
5
6
"a"
q){x[w,q]:asc[x w:(&)d],desc x q:(&)(~)d:-7=type@/:x;x}3 2 1   / simple list
1 2 3
q){x[w,q]:asc[x w:(&)d],desc x q:(&)(~)d:-7=type@/:x;x}"abc"   / simple list
"cba"
q){x[w,q]:asc[x w:(&)d],desc x q:(&)(~)d:-7=type@/:x;x}2 3 2 1 / simple list
1 2 2 3

คำอธิบาย:

ค้นหาตัวอักษรในรายการเรียงจากมากไปหาน้อยในรายการเรียงจากน้อยไปมากเข้าร่วมเพื่อรับรายการเช่น ("x";"b";"a";3;5;6)จากนั้นกำหนดค่าที่เรียงกลับไปยังตำแหน่งเดิมในรายการเช่นที่0 3 4 1 2 5นั้นกำหนดค่าเรียงกลับไปยังตำแหน่งเดิมของพวกเขาในรายการเช่นที่

กอล์ฟเป็นเพียงการเปลี่ยนคำหลัก Q ( each, whereและnot) สำหรับพวกเขาkเทียบเท่า (ซึ่งพวกเขาต้องการที่จะห่อในวงเล็บ)

{x[w,q]:asc[x w:where d],desc x q:where not d:-7=type each x;x} / ungolfed
{                                                           ; } / lambda function with 2 statements
                                                 type each x    / return types of elements in mixed list
                                              -7=               / true where item is a long
                                            d:                  / save this bool array in d
                                        not                     / invert
                                  where                         / indices where true (we have chars)
                                q:                              / save these indices in q
                              x                                 / values of x at these indices
                         desc                                   / sort them descending
                        ,                                       / join/contatenate
                where d                                         / indices where we have digits
              w:                                                / save this in w
            x                                                   / values of x at these indices
        asc[           ]                                        / sort them ascending
 x[w,q]:                                                        / assign this list to x at indices w,q
                                                             x  / return x

การแก้ไข

  • -1 ไบต์เนื่องจากไม่ต้องการวงเล็บเหลี่ยม desc

2

C (gcc) , 125 113 110 ไบต์

main(i){char*b,*c,s[99];for(gets(c=b=s);*++c||*(c=++b);)i=*b&64,i^*c&64||*c>*b^!i&&(i=*c,*c=*b,*b=i);puts(s);}

ลองออนไลน์!

อธิบาย:

main(i)
{
    char*b,*c,s[99];

    // slightly modified stupid bubblesort, this line in fact
    // does nested looping with a single for statement
    for(gets(c=b=s);*++c||*(c=++b);)
    // (undefined behavior here, there's no sequence point between accesses to c,
    // so this could go wrong. Works with the gcc version on tio.)

        // determine whether the current b is a letter:
        i=*b&64,

        // for doing anything, b and c must be the same "type":
        i^*c&64

            // when c > b for letter or c <= b for digit
            || *c>*b^!i

            // then swap
            && (i=*c,*c=*b,*b=i);

    puts(s);
}

คาดว่าจะมีตัวอักษรเป็นตัวพิมพ์ใหญ่


2

PHP, 66 ไบต์:

for($a=$argv,sort($a);a&$c=$argv[++$i];)echo$a[$c<A?++$k:--$argc];

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่งพิมพ์สตริง ทำงานด้วย-nrหรือลองออนไลน์ลองออนไลน์

ให้คำเตือนใน PHP 7.1; แทนที่a&ด้วย""<เพื่อแก้ไข



1

C # (. NET Core) , 171 ไบต์

a=>{var b=a.Where(x=>x is int).ToList();b.Sort();int i=0,j=0;return a.Select(x=>b.Contains(x)?b[i++]:a.Except(b).OrderByDescending(y=>y).ToList()[j++]);}

จำนวนไบต์ยังรวมถึง:

using System.Linq;

ลองออนไลน์!

คำอธิบาย:

a =>
{
    var b = a.Where(x => x is int).ToList(); // Filter to only ints and transform to list
    b.Sort();                                // Sort the list
    int i = 0, j = 0;                        // Create index counters
    return a.Select(x =>                     // Replace each input element with
                    b.Contains(x) ?          // If it is in list b:
                    b[i++] :                 // Get the next element from b
                    a.Except(b)              // Otherwise take input and filter out those in b
                     .OrderByDescending(x=>x)// Order them z to a
                     .ToList()[j++]);        // Get the next element


1

Ruby , 265 ไบต์

x.sort_by(&:to_s).select{|a| a.is_a?(String)}.zip(x.map.with_index {|a, i| a.is_a?(String) ? i : nil}.compact).each{|a,i| x[i] = a}
x.sort_by(&:to_s).select{|a| a.is_a?(Integer)}.zip(x.map.with_index {|a, i| a.is_a?(Integer) ? i : nil}.compact).each{|a,i| x[i] = a}

ลองออนไลน์!

จับเวลาครั้งแรกที่นี่ทางออกของฉันไม่ได้ดีที่สุดแน่นอน แต่เนื่องจากนี่เป็นคำตอบแรกของฉันฉันคิดว่าการโพสต์เพื่อความสนุกสนานของมัน

มองหาคำตอบที่ดีกว่าสำหรับ Ruby เพื่อดูว่าอะไรคือแนวทางที่ดีที่สุด ฉันหวังว่าฉันจะปรับปรุงในคำตอบในอนาคต =)

อ่านง่าย

x = ["c", 1, "a", 3, "b", 2]

b = x.map.with_index {|a, i| a.is_a?(Integer) ? i : nil}.compact
s = x.map.with_index {|a, i| a.is_a?(String) ? i : nil}.compact

o = x.sort_by(&:to_s).select{|a| a.is_a?(Integer)}
d = x.sort_by(&:to_s).select{|a| a.is_a?(String)}

d.zip s
d.zip(s).each {|a, i| x[i] = a}

o.zip b
o.zip(b).each {|a, i| x[i] = a }

p x

1

Haskell, 108 ไบต์

อาจมีวิธีที่สั้นกว่านี้ แต่ฉันต้องลองกับLensห้องสมุด

import Control.Lens
import Data.List
i(!)f=partsOf(traverse.filtered(!'='))%~f.sort
f x=x&i(<)id&i(>)reverse

ฉันสามารถกำหนดfให้เป็นองค์ประกอบของการiเรียกร้องทั้งสองแต่ฉันยังต้องใช้xกับมันเพื่อหลีกเลี่ยงข้อผิดพลาดประเภทจากข้อ จำกัด monomorphism โปรดทราบว่าชนิดของfคือTraversable t => t Char -> t Charเพื่อให้สามารถใช้กับStrings ซึ่งเป็นรายการของChars เช่นเดียวกับอาร์เรย์ของChar s

นี่คือกรณีทดสอบ:

*Main> map f ["5ax36b","321","abc","","2321"]
["3xb56a","123","cba","","1223"]


1

Clojure 151 ไบต์

#(map(fn[t c](nth((if(=(type 1)t)vec reverse)(sort((group-by type %)t)))(-(c t)1)))(map type %)(reductions(partial merge-with +)(for[i %]{(type i)1})))

ตัวอย่าง:

(def f #( ... ))
(f [5 \a \x 3 6 \b])
; (3 \x \b 5 6 \a)

สิ่งนี้จะคำนวณจำนวนผลรวมสะสมของจำนวนเต็มและตัวอักษรและใช้เพื่อค้นหาองค์ประกอบที่ถูกต้องจากรายการที่เรียงลำดับขององค์ประกอบประเภทที่สอดคล้องกัน


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