सही क्रम में कैंडी खाना


36

जब कैंडी खाने की बात आती है, तो मैं अपने आप को विशिष्ट लेपर्सन की तुलना में उच्च मानकों पर रखता हूं। "इसे मिश्रण करना" और "अंतिम के लिए सर्वश्रेष्ठ बचत" के बीच एक नाजुक संतुलन है।

इस चुनौती में, आपको पात्रों का एक स्ट्रिंग दिया जाएगा जिसमें प्रत्येक चरित्र कैंडी के एक टुकड़े का प्रतिनिधित्व करता है। विभिन्न वर्ण (केस-संवेदी) विभिन्न प्रकार के कैंडी का प्रतिनिधित्व करते हैं। फिर आपके कार्यक्रम को नीचे दी गई प्रक्रिया के आधार पर कैंडी की खपत का सही क्रम निर्धारित करना होगा। आप इस कार्य को पूरा करने के लिए एक पूरा कार्यक्रम (STDIN / STDOUT) या एक नामांकित फ़ंक्शन लिख सकते हैं।

मान लीजिए कि मेरा कैंडी स्टैश है oroybgrbbyrorypoprr। सबसे पहले, मैं एक ही प्रकार के ढेर में कैंडी को छांटता हूं, शीर्ष पर बड़ी मात्रा के साथ, टाई-ब्रेकर के रूप में कम ASCII वर्ण मूल्यों का उपयोग करता है।

rrrrrr
oooo
bbb
yyy
pp
g

फिर, मैं कैंडी की प्रत्येक पंक्ति लेता हूं और समान रूप से एक अंतराल के साथ उन्हें अंतरिक्ष देता हूं। उदाहरण के लिए, यदि कैंडी के 3 टुकड़े हैं, तो एक को 1/3 तरीके से रखा जाता है, 2/3 तरीके से, और अंत में।

.r.r.r.r.r.r
..o..o..o..o
...b...b...b
...y...y...y
.....p.....p
...........g

फिर, मैं अपना अंतिम कैंडी ऑर्डर बनाने के लिए प्रत्येक कॉलम को नीचे जाता हूं rorbyroprbyorrobypg,।

इनपुट

एक स्ट्रिंग जिसमें कैंडी की लकीर होती है। उपरोक्त उदाहरण के लिए इनपुट हो सकता है:

oroybgrbbyrorypoprr

उत्पादन

कैंडी युक्त एक स्ट्रिंग खपत के सही क्रम में पुनर्गठित होती है।

rorbyroprbyorrobypg

स्कोरिंग

यह कोड गोल्फ है। बाइट्स जीत में सबसे छोटा जवाब। मानक कोड-गोल्फ नियम लागू होते हैं।


यदि आप कैंडी नंबर असमान हैं तो क्या आप एक बड़ा स्थान जोड़ते हैं? चलो इस मामले में कहते हैं कि अगर आपके पास एक और आर कैंडी था तो ग्रिड कैसा दिखेगा?
वजुरा

38
अंत में किसी को पता है कि कैंडी खाने के लिए कैसे।
माइकल एम।

12
तो ... मूल रूप से कैंडी dithering।
COTO

9
यह वास्तव में मेरे कैंडी खाने के तरीके के बहुत करीब आता है। :)
एमिल

3
बस एक व्यक्ति कितना लालची हो सकता है? क्या खाने के लिए कैंडी की संख्या पर कोई सीमा है?
अल्काइमर

जवाबों:


12

CJam, 78 68 61 45 42 39 31 30 बाइट्स

l$:L{L\/,~}${:DM+:MD/,LD/,d/}$

STDIN के माध्यम से इनपुट स्ट्रिंग लेता है

पुनरावर्ती के दृष्टिकोण से प्रेरित, लेकिन थोड़ा अलग। संक्रमण या आयत की कोई ज़रूरत नहीं है !.

यह काम किस प्रकार करता है:

l$:L                              "Sort the input line and store it in L";
    {     }$                      "Sort the string based on this code block output";
     L\/,~                        "Sort based on number of occurrences of each";
                                  "character in the full string";
            {               }$    "Sort the sorted string again";
             :DM+:M               "Store each character in D, add to M and update M";
                   D/,            "Count occurrences of D in M";
                      LD/,        "Count occurrences of D in L";
                          d/      "Sort string based on the ratio of two occurrences";

(दुःख है कि सिंटैक्स के रूप में इतनी ब्लोट की आवश्यकता के कारण CJam अब Pyth के साथ पूर्ण नहीं हो सकता है)

इसे यहाँ आज़माएँ


4
मुझे नहीं लगता कि आपको LCM की आवश्यकता है; किसी भी एकाधिक को काम करना चाहिए। यह आपको बदलने के लिए अनुमति चाहिए {_@_@{_@\%}h;/*}साथ :
डेनिस

<facepalm> ने ऐसा नहीं सोचा था।
अनुकूलक

आपकी लंबाई को कम करने के लिए बधाई!
इसहाक

मुझे लगता है कि इसमें व्यंग्य है: D
ऑप्टिमाइज़र

11

अजगर , २५

shCoc/NhN/zhNm>o_/zZSzdUz

इस उत्तर से प्रेरित सभी नए एल्गोरिथ्म का उपयोग करता है ।

(implicit)          z = input()
(implicit)          print
s                   combine list of strings into one string
 h                  first list in
  C                 matrix transpose of (e.g. first characters in first list, etc.)
   o                order_by(lambda N:
    c                        float_div(
     /NhN                              N.count(N[0]),
     /zhN                              z.count(N[0])),
    m                        map(lambda d:
     >                           slice_head(
      o                                     order_by(lambda Z:
       _/zZ                                          -1*z.count(Z),
       Sz                                            sorted(z)),
      d                                     d),
     Uz                          range(len(z))

क्रमशः:

  1. सबसे पहले, हमने वर्णों को उनकी समानता के आधार पर क्रमबद्ध किया, संबंधों को वर्णानुक्रम से तोड़ा। यह वह जगह है o_/zZSzoपाइथन के समान है sorted(<stuff>,key=<stuff>), कुंजी के लिए एक लैम्ब्डा अभिव्यक्ति के साथ, सिवाय इसके कि यह एक स्ट्रिंग के रूप में रखता है।

  2. फिर हम उस स्ट्रिंग के उपसर्गों की एक सूची तैयार करते हैं, len(z)लंबाई 1 से लंबाई 1. >अजगर के बराबर है <stuff>[<int>:]

  3. फिर, हम भिन्नात्मक स्थान द्वारा उपसर्गों की इस सूची को फिर से व्यवस्थित करते हैं, 0 बाएं किनारे पर और 1 दाएं होने के कारण, प्रश्न में देखे गए आयताकार लेआउट पर उपसर्ग के पहले चरित्र का। /NhNगिनती करता है कि उपसर्ग में पहला वर्ण कितनी बार उपसर्ग में होता है, जबकि /zhNस्ट्रिंग में एक छेद के रूप में उपसर्ग में पहले वर्ण की घटनाओं की संख्या देता है। यह प्रत्येक उपसर्ग को एक समूह में प्रत्येक वर्ण द्वारा अलग-अलग अंश के लिए, 1/kउस वर्ण की दाईं सबसे अधिक घटना से बाईं ओर के लिए निर्दिष्ट करता है k/k। इस संख्या द्वारा उपसर्ग सूची को फिर से व्यवस्थित करना लेआउट में उपयुक्त स्थिति देता है। पूर्व आदेश के उपयोग से संबंध टूट जाते हैं, जो पहले गणना के बाद वर्णमाला के अनुसार वांछित था।

  4. अंत में, हमें प्रत्येक उपसर्ग स्ट्रिंग से पहले चरित्र को निकालने की जरूरत है, उन्हें एक स्ट्रिंग में संयोजित करें, और उन्हें प्रिंट करें। पहला अक्षर निकालना है hCCसूची में मैट्रिक्स ट्रांसपोज़ करता है, वास्तव zip(*x)में पायथन 3. hपरिणामी मैट्रिक्स की पहली पंक्ति को निकालता है। यह वास्तव में एकमात्र पंक्ति है, क्योंकि 1 वर्ण उपसर्ग की उपस्थिति किसी भी अन्य पूर्ण पंक्तियों को बनने से रोकती है। sइस टपल में पात्रों को एक ही तार में गाता है। मुद्रण निहित है।

परीक्षा:

$ pyth -c 'shCoc/NhN/zhNm>o_/zZSzdUz' <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg

वृद्धिशील कार्यक्रम के टुकड़े पर oroybgrbbyrorypoprr:

Sub-Piece                  Output

Sz                         bbbgoooopprrrrrryyy
o_/zNSz                    rrrrrroooobbbyyyppg      (uses N because o uses N on first use.)
m>o_/zNSzdUz               ['rrrrrroooobbbyyyppg', 'rrrrroooobbbyyyppg', 'rrrroooobbbyyyppg', 'rrroooobbbyyyppg', 'rroooobbbyyyppg', 'roooobbbyyyppg', 'oooobbbyyyppg', 'ooobbbyyyppg', 'oobbbyyyppg', 'obbbyyyppg', 'bbbyyyppg', 'bbyyyppg', 'byyyppg', 'yyyppg', 'yyppg', 'yppg', 'ppg', 'pg', 'g']
oc/NhN/zhNm>o_/zZSzdUz     ['roooobbbyyyppg', 'obbbyyyppg', 'rroooobbbyyyppg', 'byyyppg', 'yppg', 'rrroooobbbyyyppg', 'oobbbyyyppg', 'pg', 'rrrroooobbbyyyppg', 'bbyyyppg', 'yyppg', 'ooobbbyyyppg', 'rrrrroooobbbyyyppg', 'rrrrrroooobbbyyyppg', 'oooobbbyyyppg', 'bbbyyyppg', 'yyyppg', 'ppg', 'g']
Coc/NhN/zhNm>o_/zZSzdUz    [('r', 'o', 'r', 'b', 'y', 'r', 'o', 'p', 'r', 'b', 'y', 'o', 'r', 'r', 'o', 'b', 'y', 'p', 'g')]
shCoc/NhN/zhNm>o_/zZSzdUz  rorbyroprbyorrobypg

पुराना उत्तर:

अजगर , ३४

ssCm*+t*u*G/zHS{-zd1]kd/zdo_/zNS{z

यह प्रोग्राम एक निश्चित सबलिस्ट को दोहराने के लिए कितनी बार गणना करके काम करता है। उप-सूची जैसा दिखता है ['', '', '', '', ... , 'r']। इस उप-सूची की कुल लंबाई अन्य कैंडीज की घटनाओं की संख्या का उत्पाद है, जो है u*G/zHS{-zd1। पूर्ण स्ट्रिंग को खाली स्ट्रिंग की सूची का निर्माण करके बनाया गया है ]k, जो कि कई बार, फिर हटाने और तत्व के साथ tऔर कैंडी नाम को अंत तक जोड़ते हैं +d

फिर, इस उप-सूची को कई बार दोहराया जाता है क्योंकि इनपुट में कैंडी पाई जाती है /zd, यह सुनिश्चित करते हुए कि प्रत्येक कैंडी की सूची समान लंबाई की है।

अब, इस फ़ंक्शन के साथ उचित क्रमबद्ध क्रम ( o_/zNS{z) में सभी अद्वितीय कैंडीज पर मैप किया गया है , हमारे पास प्रश्न कथन में एक के समान एक आयत है, लेकिन अवधि के बजाय खाली तार के साथ। मैट्रिक्स हस्तांतरण ( C) दो योगों ( ss) के बाद अंतिम स्ट्रिंग देता है।

सत्यापन:

$ pyth programs/candy.pyth <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg

4
ऐसा लगता है कि भाषा वाक्य रचना में ही Pyth एन्क्रिप्शन का समर्थन करता है!
ऑप्टिमाइज़र

@Optimizer एन्क्रिप्शन? तुम्हारी किस बारे में बोलने की इच्छा थी?
इसहाक

अच्छा! मैंने शायद लूप को मैप में बदलने के बारे में कभी नहीं सोचा होगा। बहुत सफाई वाला।
FryAmTheEggman

स्रोत कोड को देखें। यह एक एन्क्रिप्टेड संदेश की तरह दिखता है।
ऑप्टिमाइज़र

2
क्या आप नवीनतम एल्गोरिथ्म के एक कदम से कदम उदाहरण दे सकते हैं? प्रिटी प्लीज़ :)
ऑप्टिमाइज़र

6

पर्ल 5 - 62

61 कोड + 1 ध्वज।

#!perl -n
print map/(.$)/,sort map/(.$)/*$_/$$1.~$_.$1,map++$$_.$_,/./g

पहले इनपुट को कैरेक्टर ऐरे में विभाजित करें - /./g

चर के साथ गिनती छोड़ने वाले प्रत्येक अक्षर में घटना सूचकांक जोड़ें $a.. के $zसाथ map++$$_.$_। अब सरणी है:

1o
1r
2o
1y
1b
1g
2r
2b
3b
2y
3r
3o
4r
3y
1p
4o
2p
5r
6r

फिर इसे एक प्रमुख कुंजी के रूप में परिवर्तित करें: अनुपात $_/$$1, गिनती टाई ब्रेकर ~$_और ASCII मूल्य टाई ब्रेकर $_। यह (यहाँ स्पष्टता के लिए जोड़ा रिक्त स्थान के साथ) में परिणाम होगा।

0.25 18446744073709551614 o
0.166666666666667 18446744073709551614 r
0.5 18446744073709551613 o
0.333333333333333 18446744073709551614 y
0.333333333333333 18446744073709551614 b
1 18446744073709551614 g
0.333333333333333 18446744073709551613 r
0.666666666666667 18446744073709551613 b
1 18446744073709551612 b
0.666666666666667 18446744073709551613 y
0.5 18446744073709551612 r
0.75 18446744073709551612 o
0.666666666666667 18446744073709551611 r
1 18446744073709551612 y
0.5 18446744073709551614 p
1 18446744073709551611 o
1 18446744073709551613 p
0.833333333333333 18446744073709551610 r
1 18446744073709551609 r

इसे lexicographic (डिफ़ॉल्ट) क्रम से हल किया जा सकता है। अंतिम वर्ण और प्रिंट निकालने में:print map/(.$)/


5

पायथन 3.x - 124 बाइट्स

C=input()
print("".join(s[1]for s in sorted(enumerate(C),key=lambda
t:((C[:t[0]].count(t[1])+1+1e-10)/C.count(t[1]),t[1]))))

यह आयत विधि की तुलना में एल्गोरिथ्म का इतना ठंडा है!
isaacg

4

गणितज्ञ, 123 119 118 बाइट्स

f=FromCharacterCode[s=SortBy;#&@@@s[Join@@(s[Tally@ToCharacterCode@#,-Last@#&]/.{x_,n_}:>({x,#/n}&~Array~n)),{Last}]]&

एक नामित फ़ंक्शन को परिभाषित करता है f। Ungolfed:

f = FromCharacterCode[
   s = SortBy;
   # & @@@ s[
     Join @@ (
       s[
         Tally@ToCharacterCode@#,
         -Last@# &
         ] /. {x_, n_} :> ({x, #/n} &~Array~n)
       ),
     {Last}
     ]
   ] &

अंतर्निहित तर्कसंगत प्रकारों का उपयोग करना इसके लिए एक अच्छा विचार था। बेशक, यह सीजेएम के पास कहीं नहीं है। मूल रूप से, मैं चुनौती में दिखाए गए ग्रिड को जोड़े की सूची के रूप में प्रस्तुत कर रहा हूं। जोड़ी में पहली चीज चरित्र कोड है, दूसरी यह है कि यह 1 से कम या 1 के बराबर अंश के रूप में स्थिति है (अंतिम स्तंभ 1 है)। यह सुनिश्चित करने के बाद कि व्यक्तिगत वर्ण पहले से ही सही क्रम में हैं, मुझे केवल वांछित परिणाम प्राप्त करने के लिए उक्त अंश के आधार पर इसे हल करने की आवश्यकता है।


3

पायथ 45 47 48 51

यह भी लगभग निश्चित रूप से आगे गोल्फ हो सकता है;)

Ko_/zNS{zFGK~Y]*+*t/u*GHm/zdK1/zG]k]G/zG)ssCY

सूचियों की सूची बनाकर काम करता है, जहां प्रत्येक आंतरिक सूची खाली तारों की एक पंक्ति और कैंडी का नाम है। इस सूची को स्थानांतरित कर दिया जाता है और फिर इन सूचियों में शामिल होने के बाद इनर सूचियों को जोड़ दिया जाता है।

@ राशि के बारे में मुझे याद दिलाने के लिए धन्यवाद @isaacg!


2
sतार की एक सूची के रूप में काम करता है j""
18

3

एपीएल: 38

v⌷⍨⊂⍋⌽(n/-n),⍪∊+\¨n⍴¨÷n←{≢⍵}⌸v←{⍵[⍋⍵]}

स्पष्टीकरण:

v←{⍵[⍋⍵]}    orders input string
n←{≢⍵}⌸v     counts how many times each element appears in v
∊+\¨n⍴¨÷n     makes incremental sums in each letter "group" 
⍋⌽(n/-n),⍪   appends number of elements in letter group and orders the obtained matrix
v⌷⍨⊂         orders vector v with computed indices

Tryapl.org पर परीक्षण किया जा सकता है


2

आर - 166 वर्ण

library("plyr");s=function(a){l=table(strsplit(a,s="")[[1]]);l=ldply(l[order(-l,names(l))],function(n)data.frame(seq_len(n)/n));paste(l[order(l[[2]]),1],collapse="")}

ungolfed संस्करण

library("plyr")
s <- function(a) {
    tbl <- table(strsplit(a, split = "")[[1]])
    tbl <- tbl[order(-tbl, names(tbl))]
    tbl <- ldply(tbl, function(n) {data.frame(seq_len(n)/n)})
    paste(tbl[order(tbl[[2]]),1], collapse = "")
}

स्पष्टीकरण:

  • व्यक्तिगत पात्रों में विभाजित
  • प्रत्येक वर्ण की संख्या की सारणीबद्ध करें
  • तालिका को क्रमिक रूप से और फिर लेक्सिकल क्रम से क्रमबद्ध करें
  • 1 / n, 2 / n, 3 / n, ... n-1 / n, 1 पर चयन के लिए अनुक्रमणिका स्थिति
  • इंडेक्स द्वारा कैंडी के नामों को क्रमबद्ध करें ( orderछँटाई में स्थिर है, इसलिए इंडेक्स में एक टाई, जब विशेष रूप से अंतिम कैंडीज के साथ महत्वपूर्ण है) सबसे अधिक / लेक्सिकल नामकरण क्रम बनाए रखेगा।
  • आउटपुट स्ट्रिंग बनाने के लिए कैंडी नामों को एक साथ मिलाएं

समस्या की मैट्रिक्स प्रकृति ने मुझे लगता है कि आर इस पर एक शॉट हो सकता है, लेकिन एल्गोरिथ्म की सबसे अच्छी शाब्दिक व्याख्या जो मैं कर सकता था वह था १११ अक्षर:

l=function(a){l=table(strsplit(a,s="")[[1]]);l=l[order(-l,names(l))];o=Reduce(`*`,l);m=matrix("",nc=o,nr=length(l));for(r in seq_along(l)){x=l[r];for(c in seq_len(x)*o/x){m[r,c]<-names(x)}};paste(m,collapse="")}

ungolfed:

l <- function(a) {
    tbl <- table(strsplit(a, split = "")[[1]])
    tbl <- tbl[order(-tbl, names(tbl))]
    o <- Reduce(`*`, tbl)
    m <- matrix("", ncol = o, nrow = length(tbl))
    for (r in seq_along(tbl)) {
        for (c in seq_len(tbl[r])*o/tbl[r]) {
            m[r,c] <- names(tbl[r])
        }
    }
    paste(m, collapse="")
}

2

पायथ, 29 बाइट्स

यह Pyth में मेरे CJam answe r का सीधा अनुवाद है

oc/|$Y.append(N)$YN/zNo_/zZSz

इसे यहाँ ऑनलाइन आज़माएँ


इस समाधान के पीछे एक लंबी कहानी है और @isaacg ने मुझे इस नई भाषा को समझने में बहुत मदद की।

आदर्श रूप से यह मेरे सीजम कोड ( 17 बाइट्स ) के शब्द अनुवाद का सटीक शब्द है :

oc/~kNN/zNo_/zZSz

जिसका मतलब है:

o         order_by(lambda N:
 c                 div(
  /                    count(
   ~kN                       k+=N,                #Update k (initially ""), add N
   N                         N),                  #Count N in updated k
  /zN                  count(z, N)),
 o                 order_by(lambda Z:
  _                         neg(
   /zZ                          count(z, Z)),
  Sz                        sorted(z)))

लेकिन दुख की बात है कि अजगर एक +=कॉल में कुछ भी नहीं लौटाता है , इसलिए यह एक वैध पायथन कोड नहीं था, इस प्रकार एक अवैध पायथ कोड भी पायथ के रूप में, एक लैम्ब्डा केवल एक वापसी बयान हो सकता है।

फिर मैंने विभिन्न तरीकों पर ध्यान दिया और अंत में पाया कि पायथन ने list.appendएक Noneमूल्य लौटाया , जिसका मैं उपयोग कर सकता हूं। कोड बनाने के लिए ( 19 बाइट्स ):

oc/|aYNYN/zNo_/zZSz

जिसका मतलब है:

o         order_by(lambda N:
 c                 div(
  /                    count(
   |aYN                      (Y.append(N) or
    Y                         Y)                 #Update Y (initially []), append N
   N                         N),                 #Count N in updated Y
  /zN                  count(z, N)),
 o                 order_by(lambda Z:
  _                         neg(
   /zZ                          count(z, Z)),
  Sz                        sorted(z)))

लेकिन दुख की बात aहै कि पायथ से (अपेंड) का समर्थन हटा दिया गया और जिस संस्करण का समर्थन है, उसके पास समर्थन नहीं है o

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

इसलिए मुझे उस मामले में कच्चे अजगर पर भरोसा करना पड़ा, जिससे कोड हो गया

o         order_by(lambda N:
 c                 div(
  /                    count(
   |$Y.append(N)$            (Y.append(N) or
    Y                         Y)                 #Update Y (initially []), append N
   N                         N),                 #Count N in updated Y
  /zN                  count(z, N)),
 o                 order_by(lambda Z:
  _                         neg(
   /zZ                          count(z, Z)),
  Sz                        sorted(z)))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.