เรียงตามตัวอักษรที่กำหนดเอง


9

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

โปรแกรมของคุณจะยอมรับสตริงของคำที่คั่นด้วยเครื่องหมายจุลภาคและตัวอักษรใหม่
โปรแกรมของคุณจะแสดงผลทุกคำด้วยวิธีเดียวกันในลำดับที่เรียงลำดับใหม่

ตัวอย่าง:

การป้อนข้อมูล:

home,oval,cat,egg,network,green bcdfghijklmnpqrstvwxzaeiouy

เอาท์พุท:

cat,green,home,network,egg,oval

มันคือ ดังนั้นผู้ชนะคือบุคคลที่มีโปรแกรมสั้นที่สุด

นี่เป็นความท้าทายครั้งแรกของฉันดังนั้นการปรับปรุงคำถาม / ความท้าทายจะได้รับการชื่นชม


1. ฉันใช้ตัวอย่างของคุณว่าตัวอักษรจะถูกแยกออกจากคำด้วยการเว้นวรรค ถูกต้องไหม 2. คำจะเป็นตัวพิมพ์เล็กเสมอหรือไม่
Dennis

@Dennis ใช่ทั้งคู่
Mathetic

1
นั่นคือความผิดพลาด ฉันจะแก้ไขมัน
Mathetic

+1 คำถามที่ตกลง (สำหรับการลองครั้งแรก ;-)) แต่ฉันไม่เห็นความเกี่ยวข้องของชื่อ - บางทีคุณสามารถเปลี่ยนชื่อเป็นSort by custom alphabetหรืออะไรที่สร้างสรรค์มากขึ้น?
Digital Trauma

@DigitalTrauma ใช่นั่นน่าจะดีกว่า ฉันพยายามเล่นด้วยคำพูดเล็กน้อย ฉันเล็งสำหรับการอ้างอิงถึง ascii และ utf-8 และชอบถามว่ามันคืออะไร แต่สิ่งนั้นล้มเหลว ฉันจะเปลี่ยนเป็นคำแนะนำของคุณซึ่งดีกว่า
Mathetic

คำตอบ:


2

CJam, 26 19 17 ไบต์

rr:A;',/{Af#}$',*

ลองออนไลน์

กรณีทดสอบ

$ cjam sort.cjam <<< 'home,oval,cat,egg,network,green bcdfghjklmnpqrstvwxzaeiouy'
cat,green,home,network,egg,oval

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

rr                    " Read two whitespace-separated tokens from STDIN. ";
  :A;                 " Save the second token (the alphabet) in A.       ";
     ',/              " Split the remaining token at commas.             ";
        {Af#}$        " Sort by the chunks' characters' indexes in A.    ";
               ',*    " Join, separating by commas.                      ";

ทีนี้เนื่องจากคุณใช้วิธีเดียวกันฉันก็ไม่เข้าใจเลยตอนนี้
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer: คุณชนะฉันแปดวินาที หากคุณยกเลิกการลบคำตอบฉันจะย้อนกลับ
Dennis

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


2

Pyth , 19 ตัวละคร

j\,o_mx_zdNchczd\,

ทดสอบ:

$ pyth -c "j\,o_mx_zdNchczd\," <<< 'home,oval,cat,egg,network,green bcdfghjklmnpqrstvwxzaeiouy'
cat,green,home,network,egg,oval

คำอธิบาย:

                            Implicit: d=" "
                            Implicit: z=input()
j\,                         ",".join(
   o                                 order_by(lambda N:
    _                                                  rev(
     m                                                     map(lambda d:
      x_zd                                                              rev(z).index(d),
      N                                                                 N),
    chczd\,                                            z.split(" "[0].split(",")

โดยพื้นฐานแล้วมันจะเรียงลำดับชิ้นด้วยคีย์ของรายการดัชนีของอักขระในสตริงจากนั้นรวมเข้ากับคอมมา ธุรกิจการกลับรายการสั้นกว่าการแยกสตริงอีกครั้ง


18 ไบต์:j\,_omx_zdNchczd\,
Dennis

@Dennis ฉลาดมาก ๆ ขอบคุณ
isaacg

1

Ruby, 53 50 ไบต์

a,b=$*
$><<a.split(?,).sort_by{|w|w.tr b,'a-z'}*?,

ฉันใช้ Ruby's trเพื่อแทนที่ตัวอักษรที่กำหนดเองด้วยa-zก่อนการเรียงลำดับ การป้อนข้อมูลผ่านอาร์กิวเมนต์บรรทัดคำสั่ง


คุณสามารถโกนไบต์ได้หากคุณใช้$><<พิมพ์หน้าจอ (คุณสามารถลบพื้นที่ว่างออก) คุณสามารถโกนอีกสองไบต์โดยการกำหนด$*ตัวแปรเช่นดังนั้น: a,b=$*และการใช้แทน#sort_by #sort_by!
britishtea

@ britishtea ขอบคุณ ฉันคิดว่าฉันต้องการ*$*(ซึ่งฉันมีในตอนแรกและมีความยาวเท่ากัน)
Martin Ender

0

Python, 131

w,a=input().split()
print(",".join(sorted(w.split(","),key=lambda s:"".join(["abcdefghijklmnopqrstuvwxyz"[a.find(c)]for c in s]))))

ควรมีพื้นที่เหลือเฟือสำหรับการปรับปรุง


คุณไม่จำเป็นต้องใช้ปุ่มเป็นฟังก์ชั่นการจัดเรียงเพียงใช้รายการa.find(c)โดยตรง
isaacg

0

JavaScript (E6) 102 119

จัดเรียงด้วยฟังก์ชันการแมป 'M' ตามตัวอักษรในตัวแปร 'a'
ด้วย IO โดยใช้ป๊อปอัพ (พร้อมท์ + การแจ้งเตือน)

x=prompt().split(/[ ,]/),
a=x.pop(),
M=w=>[10+a.search(c)for(c of w)]+'',
alert(x.sort((a,b)=>M(a)>M(b)))

ในฐานะที่เป็นฟังก์ชั่น (ทดสอบได้) กับพารามิเตอร์สตริง 1 ส่งคืนอาร์เรย์สตริง (92)

F=x=>(
  M=w=>[10+a.search(c)for(c of w)],
  x=x.split(/[ ,]/),
  a=x.pop(),
  x.sort((a,b)=>M(a)>M(b))
)

ทดสอบในคอนโซล FireFox / FireBug

F('home,oval,cat,egg,network,green zyxwvtsrqpnmlkjhgfdcbaeiou')

เอาท์พุต

["network", "home", "green", "cat", "egg", "oval"]

1
-4 ถ้าคุณแทนที่ฟังก์ชันการเรียงลำดับของคุณด้วย(M(a)>M(b))-(M(a)<M(b))
DocMax

@DocMax ดีมาก ปรากฎว่ามันง่ายกว่านั้น ( stackoverflow.com/a/7232172/3640407 )
edc65

หากคุณใช้พรอมต์สำหรับอินพุตและเอาต์พุตและนามแฝงอีกครั้งคุณสามารถหลีกเลี่ยงการแบ่งสายได้โดยแยกอินพุต ฉันคิดว่าควรบันทึกตัวละครสองสามตัว
Ingo Bürk

ตอนนี้ฉันเพิ่งใช้โทรศัพท์ แต่ทำไม M ถึงซับซ้อนมาก ใช้งานM=w=>[...a].indexOf(w)ไม่ได้ใช่ไหม ฉันไม่สามารถทดสอบได้ในตอนนี้โชคไม่ดี
Ingo Bürk

@ IngoBürk w เป็นคำไม่ใช่ตัวละคร M แทนอักขระแต่ละตัวด้วย w ด้วยตำแหน่งใน a
edc65

0

Clojure 115 ไบต์

#(apply str(butlast(interleave(sort-by(fn[w](apply str(map(zipmap(sort %2)%2)w)))(re-seq #"[a-z]+"%))(repeat \,))))

ว้าวนี่เริ่มต้นได้ดีด้วย(sort-by(fn[w](mapv(zipmap(sort %2)%2)w)))แต่แล้วฉันก็รู้vecว่าไม่ได้เรียงแบบเดียวกับสตริงและการคอมไพล์การคอมไพล์เหล่านั้นก็ใช้โค้ดจำนวนมาก

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