कस्टम वर्णमाला के आधार पर छाँटें


9

चुनौती एक कार्यक्रम बनाना है जो शब्दों की एक सूची को सॉर्ट करता है, केवल यह कि शब्दों को एक यादृच्छिक रूप से दिए गए वर्णमाला के क्रम में होना चाहिए।

आपका कार्यक्रम अल्पविराम से अलग किए गए शब्दों की एक स्ट्रिंग और एक नई वर्णमाला को स्वीकार करेगा।
आपका प्रोग्राम हर शब्द को नए क्रमबद्ध क्रम में उसी तरह आउटपुट करेगा।

उदाहरण:

इनपुट:

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

आउटपुट:

cat,green,home,network,egg,oval

यह है एक , इसलिए विजेता सबसे छोटा कार्यक्रम वाला व्यक्ति है।

यह मेरी पहली चुनौती है इसलिए प्रश्न / चुनौती के किसी भी सुधार की सराहना की जाती है।


1. मैं आपके उदाहरण से लेता हूं कि वर्णमाला एक स्थान से शब्दों से अलग हो जाएगी। क्या वो सही है? 2. क्या शब्द हमेशा लोअरकेस में होंगे?
डेनिस

@ डेनिस दोनों के लिए
मैट्रिक

1
वह गलती है। मैं उसे संपादित करूंगा।
मैटिक

+1 ओके प्रश्न (पहली कोशिश के लिए; ;-))। लेकिन मैं शीर्षक की प्रासंगिकता नहीं देख रहा हूं - शायद आप इसका नाम बदल सकते हैं Sort by custom alphabetया कुछ और रचनात्मक कर सकते हैं?
डिजिटल ट्रामा

@DigitalTrauma हाँ जो बेहतर हो सकता है। मैंने शब्दों के साथ थोड़ा खेलने की कोशिश की। मैंने ascii और utf-8 के संदर्भ के लिए और यह पूछने के लिए कि यह कौन सा है। लेकिन वह असफल रहा। मैं इसे आपके सुझाव में बदल दूंगा जो बेहतर था।
मैट्रिक

जवाबों:


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.                      ";

खैर, चूंकि यू ने भी इसी दृष्टिकोण का उपयोग किया है, मेरा वास्तव में अब कोई मतलब नहीं है।
ऑप्टिमाइज़र

@ ऑप्टिमाइज़र: आपने मुझे आठ सेकंड से हराया। यदि आप अपना उत्तर रद्द करते हैं, तो मैं अपना रोल वापस लूंगा।
डेनिस

नहीं, मुझे लगता है कि यह एक तुच्छ और बहुत अधिक परिवर्तन है। मुझे अपना उत्तर पहली जगह में पोस्ट करने से पहले आपके अपडेट को देखना चाहिए था :)
ऑप्टिमाइज़र

4

बैश + कोरुटिल्स, 37 बाइट्स

tr ,$2 \\na-z<<<$1|sort|tr \\na-z ,$2

आउटपुट:

$ ./alphasort.sh home,oval,cat,egg,network,green bcdfghijklmnpqrstvwxyzaeiouy
cat,green,home,network,egg,oval, $ 

1
अल्पविराम से निपटने का अच्छा तरीका है!
डेनिस

2

पायथ , 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\,
डेनिस

@ बहुत चालाक, धन्यवाद।
isaacg

1

रूबी, 53 50 बाइट्स

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

मैं रूबी का उपयोग कर रहा हूँ छँटाई से पहले trकस्टम वर्णमाला को बदलने के लिए a-z। इनपुट कमांड-लाइन तर्क के माध्यम से है।


यदि आप $><<स्क्रीन पर प्रिंट करने के लिए उपयोग करते हैं तो आप एक बाइट को शेव कर सकते हैं (आप तब स्पेस हटा सकते हैं)। आप इसके $*जैसे चर: a,b=$*और के #sort_byबजाय का उपयोग करके एक और दो बाइट्स दाढ़ी कर सकते हैं #sort_by!
ब्रिटिश

@britishtea धन्यवाद। मुझे लगा कि मुझे इसकी आवश्यकता होगी *$*(जो मेरे पास पहले थी और जो समान लंबाई है)।
मार्टिन एंडर

0

अजगर, 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

जावास्क्रिप्ट (ई 6) 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))
)

फायरफॉक्स / फायरबग कंसोल में टेस्ट

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

यदि आप इनपुट और आउटपुट के लिए प्रॉम्प्ट का पुनः उपयोग करते हैं और इसे अलग करते हैं तो आप अलग से इनपुट लेकर विभाजन कॉल से बच सकते हैं। मुझे लगता है कि कुछ पात्रों को बचाना चाहिए।
इंगो बुर्क

इसके अलावा, मैं अभी अपने फोन पर हूं लेकिन एम इतना जटिल क्यों है? यह उपयोग करने के लिए काम नहीं करेगा M=w=>[...a].indexOf(w)? मैं दुर्भाग्य से अभी इसका परीक्षण नहीं कर सकता।
इंगो बुर्क

@ IngoBürk w एक शब्द है, एक चरित्र नहीं। M प्रत्येक वर्ण को अपनी स्थिति के साथ बदल देता है।
edc65

0

क्लोजर, 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कि तार के समान तरीके से सॉर्ट नहीं किया जाता है, और उन कॉमा को इंटरलेइंग करने से कोड की महत्वपूर्ण मात्रा भी होती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.