शब्दों को संतुलित करना


33

यह चुनौती डेलीप्रोग्रामर सब्रेडिट पर पोस्ट की गई थी, और मुझे लगा कि यह एक कोड गोल्फ चुनौती के लिए एक महान उम्मीदवार होगा। यह निर्धारित करना कि क्या कोई अक्षर संतुलन के बिंदु से दूरी और पत्र के मूल्य पर आधारित है। एक अक्षर का मूल्य वर्णमाला में इसकी एक-अनुक्रमित स्थिति को लेने से या इसके ASCII मूल्य से 64 को घटाकर निर्धारित किया जा सकता है। इसके अलावा, एक पत्र का मूल्य संतुलन बिंदु से इसकी दूरी से गुणा किया जाता है। आइए एक उदाहरण देखें STEAD:

STEAD   -> 19, 20, 5, 1, 4 ASCII values
           This balances at T, and I'll show you why!
S T EAD -> 1*19 = 1*5 + 2*1 + 3*4
           Each set of letters on either side sums to the same value, so
           T is the anchor.

हालांकि, यह ध्यान दिया जाना चाहिए कि सभी शब्द संतुलन नहीं रखते हैं। उदाहरण के लिए, शब्द WRONGकिसी भी विन्यास में संतुलन नहीं रखता है। इसके अलावा, शब्दों को एक अक्षर पर संतुलित होना चाहिए, दो अक्षरों के बीच नहीं। उदाहरण के लिए, SAASयदि दो Aएस के बीच में एक पत्र था , तो संतुलन होगा , लेकिन चूंकि ऐसा नहीं है, इसलिए यह संतुलन नहीं है।

काम

आपको एक प्रोग्राम या फ़ंक्शन बनाना चाहिए जो एक बड़े शब्द में इनपुट या फ़ंक्शन तर्क के रूप में लेता है , और फिर दो आउटपुट में से एक का उत्पादन करता है:

  1. यदि शब्द संतुलित होता है, तो शब्द को बाईं ओर, एक स्पेस, एंकर लेटर, दूसरे स्पेस और राइट साइड से प्रिंट किया जाना चाहिए।

    function (STEAD) -> S T EAD

  2. यदि शब्द संतुलन नहीं रखता है, तो आपको शब्द को प्रिंट करना चाहिए, उसके बाद DOES NOT BALANCE

    function (WRONG) -> WRONG DOES NOT BALANCE

आप मान सकते हैं कि सभी इनपुट अपरकेस होंगे और केवल अल्फा वर्ण होंगे।

उदाहरण I / O

function (CONSUBSTANTIATION) -> CONSUBST A NTIATION
function (WRONGHEADED)       -> WRO N GHEADED
function (UNINTELLIGIBILITY) -> UNINTELL I GIBILITY
function (SUPERGLUE)         -> SUPERGLUE DOES NOT BALANCE

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


हम एकल अक्षर शब्द, जैसे के उत्पादन में रिक्त स्थान को छोड़ सकते हैं function (A)> - Aके बजाय -> `` एक?
नीमी

1
@ निम्मी हां, आप रिक्त स्थान छोड़ सकते हैं।
काडे

क्या एकल चरित्र इनपुट को संतुलित माना जाना चाहिए?
कुछ उपयोगकर्ता

1
@someuser हां, क्योंकि दोनों तरफ का "वजन" 0. है
केड

14
BALANCE DOES NOT BALANCE
ऑप्टिमाइज़र

जवाबों:


6

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

jd.xcz,Jhf!s*Vm-Cd64zr_TlzUzhJ,z"DOES NOT BALANCE

प्रदर्शन।

स्पष्टीकरण:

jd.xcz,Jhf!s*Vm-Cd64zr_TlzUzhJ,z"DOES NOT BALANCE

                                    Implicit: z = input(), d = ' '
         f                Uz        Filter T over range(len(z)).
              m     z               Map the characters in z to
               -Cd64                their ASCII values - 64.
            *V                      Vectorized multiplication by
                     r_Tlz          range(-T, len(z)).
                                    This is equivalent to putting the fulcrum at T.
           s                        Sum the weights.
          !                         Logical not - filter on sum = 0.
        h                           Take the first result.
                                    This throws an error if there were no results.
       J                            Save it to J.
      ,J                    hJ      Form the list [J, J+1].
    cz                              Chop z at those indices, 
                                    before and after the fulcrum.
  .x                                If no error was thrown, return the above.
                              ,z".. If an error was thrown, return [z, "DOES N..."]
jd                                  Join the result on spaces and print.

12

शुद्ध बैश (कोई कोरयूटिल्स या अन्य उपयोगिताओं), 125

उत्पत्ति के बारे में क्षणों का उपयोग करते हुए जन गणना का मानक केंद्र:

for((;i<${#1};w=36#${1:i:1}-9,m+=w,M+=w*++i)){ :;}
((M%m))&&echo $1 DOES NOT BALANCE||echo ${1:0:M/m-1} ${1:M/m-1:1} ${1:M/m}

परीक्षण उत्पादन:

$ for t in \
> STEAD \
> CONSUBSTANTIATION \
> WRONGHEADED \
> UNINTELLIGIBILITY \
> SUPERGLUE
> do ./wordbal.sh $t; done
S T EAD
CONSUBST A NTIATION
WRO N GHEADED
UNINTELL I GIBILITY
SUPERGLUE DOES NOT BALANCE
$ 

10

पायथन 3, 124

w=input()
i=a=b=0
for c in w:n=ord(c)-64;a+=n;b+=n*i;i+=1
m=b//a
print(*[w[:m],w,w[m],"DOES NOT BALANCE",w[m+1:]][b%a>0::2])

यह कोड संभावित फुलक्रम्स का परीक्षण नहीं करता है, बल्कि "जन का केंद्र" पाता है और जांचता है कि क्या यह पूर्णांक है। यह aद्रव्यमान bके केंद्र को खोजने के लिए कुल द्रव्यमान और स्थिति भारित द्रव्यमान को जोड़कर ऐसा करता है m=b/a। यह तब स्थिति mमें या तो स्ट्रिंग विभाजन को प्रिंट करता है , या स्ट्रिंग-प्लस "DOES NOT BALANCE", [_::2]सूची-स्लाइसिंग ट्रिक द्वारा चुना जाता है ।


8

सीजेएम, 57 बाइट्स

l_,,_f{f-W$'@fm.*:+}0#:I){ISIW$=S++t}" DOES NOT BALANCE"?

यह अभी भी थोड़ा गोल्फ हो सकता है।

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


जो इसे ठीक करता है। '@fmसे छोटा है 64f-:i
डेनिस

हाँ .. भूल गए कि CJam चार घटाव के मामले में अजीब काम करता है ..
ऑप्टिमाइज़र

7

जावास्क्रिप्ट (ईएस 6), 211 200 160 बाइट्स

f=w=>{for(j=-w.length;j++;)if(![...w].reduce((p,v,i)=>p+(parseInt(v,36)-9)*(j+i),0))return w.slice(0,-j)+` ${w[-j]} `+w.slice(1-j);return w+` DOES NOT BALANCE`}

पिछला प्रयास, 200 बाइट्स

Edc56 के लिए धन्यवाद और मुझे इस गोल्फ में मदद करने के लिए nderscore

f=w=>{for(j=0,r=(a,z)=>[...a][z||`reverse`]().reduce((p,v,i)=>p+(parseInt(v,36)-9)*++i,0);j++<w.length;)if(r(a=w[s=`slice`](0,j))==r(b=w[s](j+1),s))return a+` ${w[j]} `+b;return w+` DOES NOT BALANCE`}

डेमो

फ़ायरफ़ॉक्स और एज केवल अब के लिए, क्योंकि यह ईएस 6 है

f=w=>{for(j=1-w.length;j++;)if(!([...w].reduce((p,v,i)=>p+(parseInt(v,36)-9)*(j+i),0)))return w.slice(0,-j)+` ${w[-j]} `+w.slice(1-j);return w+` DOES NOT BALANCE`}

// DEMO
console.log = function(a) {
  document.body.innerHTML += a + "<br>";
}

console.log(f('STEAD'));
console.log(f('CONSUBSTANTIATION'));
console.log(f('WRONGHEADED'));
console.log(f('UNINTELLIGIBILITY'));
console.log(f('SUPERGLUE'));


3
सरणी समझ की कोशिश करें (w के लिए) v.charCode ....], यह आमतौर पर
बाइट्स के

@ edc65 धन्यवाद! हर दिन कुछ नया सीखें
rink.attenders.6

1
@ edc65 सरणी की समझ तकनीकी रूप से अब ES7 ड्राफ्ट पर धकेल दी गई है :(
nderscore

1
-1 बाइट: j=0कॉल के अंदर charCodeAt
चलें

6

सी, 236 198 192 188 180 173 बाइट्स

a,i,j,k,L;f(char*s){L=strlen(s);for(;i<L;i++){for(a=j=0;j<L;j++)a+=(s[j]-64)*(i-j);if(!a)break;}for(;k<L;k++)printf(k-i?"%c":" %c ",s[k]);if(a)printf(" DOES NOT BALANCE");}

मुख्य के साथ विस्तारित ():

#define p printf    
a,i,j,k,L;
f(char*s)
{
    L=strlen(s);
    for(;i<L;i++){
        for(a=j=0;j<L;j++)
            a+=(s[j]-64)*(i-j);
        if(!a)
            break;
    }
    for(;k<L;k++)
        printf(k-i?"%c":" %c ",s[k]);
    if(a)
        printf(" DOES NOT BALANCE");
}
// 83 bytes below
int main(int argc, char **argv)
{
    f(argv[1]);
    printf("\n");
}

सत्यापन:

$ ./a.out CONSUBSTANTIATION
CONSUBST A NTIATION
$ ./a.out WRONGHEADED
WRO N GHEADED
$ ./a.out A
 A 
$ ./a.out WRONG
WRONG DOES NOT BALANCE
$ ./a.out SUPERGLUE
SUPERGLUE DOES NOT BALANCE

1
मेरा समाधान आपके लिए एक उत्तर पोस्ट करने के समान था, लेकिन मैं 146 वर्णों तक नीचे जाने में सक्षम था: i,l=1,j;g(char*v){for(;v[i]&&l;++i)for(j=l=0;v[j];++j)l+=(i-j)*(v[j]-64);l?printf("%s DOES NOT BALANCE",v):printf("%.*s %c %s",--i,v,v[i],v+i+1);}नोट: अपरिभाषित व्यवहार का उपयोग करता है :)
कोल कैमरून

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

मैं वास्तव में सी के साथ पीएचपी को हराने की कोशिश कर रहा हूं, लेकिन मैं अभी भी बाइट कर रहा हूं
rink.attenders.6

6

सीजेएम, 50 बाइट्स

r_'@f-_ee::*:+\:+md"X DOES NOT BALANCEX"@?)/()@]S*

जावा दुभाषिया का उपयोग करना, यह गैर-संतुलन शब्दों के लिए STDERR के लिए एक त्रुटि के साथ बाहर निकलता है।

यदि आप सीजेएम दुभाषिया में कोड की कोशिश करते हैं , तो बस सब कुछ अनदेखा करें लेकिन आउटपुट की अंतिम पंक्ति।

विचार

मेरा "मूल विचार" वही दृष्टिकोण निकला जो @xnor ने मुझसे कई घंटे पहले पोस्ट किया था। फिर भी, यहाँ यह जाता है:

मूल्यों की एक सूची (v 0 ,… v n ) को देखते हुए , हमारे पास यह है कि v_t सूची का एंकर है यदि और केवल यदि निम्न में से कोई भी, समान स्थिति रखता है:

  • टीवी 0 +… + 1 वी टी -1 == 1 वी टी + 1 +… टीवी एन

  • (0 - t) v 0 +… + (n - t) v n == 0

  • 0v 0 +… + nv n == t (v 0 +… + v n )

  • t: = (0v 0 +… + nv n ) / (v 0 +… + v n ) एक पूर्णांक है।

कोड

r     e# Read a whitespace separated token from STDIN.
_'@f- e# Push a copy and subtract '@' from each char (pushes code point - 64). 
_ee   e# Push a copy of the array of values and enumerate them.
::*   e# Multiply each value by its index.
:+    e# Add all results.
\:+   e# Add the unmodified values.
md    e# Perform modular division. Pushes quotient and residue.

"X DOES NOT BALANCEX"

@     e# Rotate the quotient on top of the string.
?     e# If the residue is 0, select the quotient. Otherwise, select the string.

इस भाग में, हम अतिभारित ऑपरेटरों के साथ थोड़ा मज़ा करना शुरू करते हैं।

भागफल के लिए, यह होता है:

)     e# Add 1 to the quotient.
/     e# Split the input string into chunks of that length.
(     e# Shift out the first chunk.
)     e# Pop the last character of the first chunk.
@     e# Rotate the rest of the string on top of the stack.
]S*   e# Wrap all three parts in an array and join them, separating by spaces.

स्ट्रिंग के लिए, यह होता है:

)     e# Pop out the last char: "X DOES NOT BALANCE" 'X'
/     e# Split the remainder at X's: ["" " DOES NOT BALANCE"]
(     e# Shift out the first chunk: [" DOES NOT BALANCE"] ""
)     e# Pop out the last char.

इस बिंदु पर, एक रनटाइम त्रुटि होती है, क्योंकि ""अंतिम चार्ट नहीं है। स्टैक मुद्रित हो जाता है और निष्पादन तुरंत समाप्त हो जाता है।


आपके द्वारा जोड़ा गया कोड अलग-अलग (और बेहतर?) लगता है
aditsu

@aditsu: ओह, गलत लिंक। यह छोटा और साफ-सुथरा है, हां, लेकिन इसमें पीछे की तरफ जगह है ...
डेनिस

5

जूलिया, 122 बाइट्स

s->(v=[int(i)-64for i=s];m=dot(v,1:length(s))/sum(v);m==int(m)?join([s[1:m-1],s[m],s[m+1:end]]," "):s*" DOES NOT BALANCE")

यह एक अनाम फ़ंक्शन बनाता है जो एक स्ट्रिंग को इनपुट के रूप में स्वीकार करता है और एक स्ट्रिंग लौटाता है। इसे कॉल करने के लिए, इसे एक नाम दें, उदा f=s->...

हम शब्द को एक आयामी प्रणाली की तरह मानते हैं जिसके लिए हमें द्रव्यमान का केंद्र खोजने की आवश्यकता होती है। द्रव्यमान का केंद्र प्रणाली के कुल द्रव्यमान से विभाजित अपने स्थानों के साथ द्रव्यमान के डॉट उत्पाद के रूप में गणना की जाती है। यदि गणना केंद्र एक पूर्णांक है, तो यह शब्द के अक्षरों में से एक से मेल खाता है। अन्यथा शब्द संतुलन नहीं रखता है।

असंगठित + स्पष्टीकरण:

function f(s)
    # Create a vector of ASCII code points -- these are the "masses"
    v = [int(i)-64 for i in s]

    # Compute the center of mass, taking the locations to be the indices
    m = dot(v, 1:length(s)) / sum(v)

    # Check whether the center corresponds to a letter's position
    if m == int(m)
        join([s[1:m-1], s[m], s[m+1:end]], " ")
    else
        m * " DOES NOT BALANCE"
    end
end

उदाहरण:

julia> f("WRONG")
"WRONG DOES NOT BALANCE"

julia> f("STEAD")
"S T EAD"

julia> f("CONSUBSTANTIATION")
"CONSUBST A NTIATION"

5

PHP, 249 174 बाइट्स

एक कमांड-लाइन तर्क लेता है।

<?for($i=-$l=strlen($w=$argv[1]);$i++;){for($k=$q=0;$l>$k;)$q+=($i+$k)*(ord($w[$k++])-64);$q?:exit(substr($w,0,-$i)." {$w[-$i]} ".substr($w,1-$i));}echo"$w DOES NOT BALANCE";

प्रारंभिक प्रयास:

<?function r($a){for($i=$q=0;strlen($a)>$i;){$q+=(ord($a[$i])-64)*++$i;}return$q;}for($i=0;$i++<strlen($w=$argv[1]);)(strlen($w)<2?exit($w):(r(strrev($a=substr($w,0,$i)))==r($b=substr($w,$i+1)))?exit("$a {$w[$i++]} $b"):0);echo"$w DOES NOT BALANCE";

4

हास्केल, 161 135 बाइट्स

a#b=a*(fromEnum b-64)
v=sum.zipWith(#)[1..]
h![]=h++" DOES NOT BALANCE"
h!(x:y)|v(reverse h)==v y=h++' ':x:' ':y|1<2=(h++[x])!y
f=([]!)

उपयोग उदाहरण:

*Main> putStr $ unlines $ map f ["CONSUBSTANTIATION","WRONGHEADED","UNINTELLIGIBILITY","SUPERGLUE"]
CONSUBST A NTIATION
WRO N GHEADED
UNINTELL I GIBILITY
SUPERGLUE DOES NOT BALANCE

यह कैसे काम करता है: fहेल्पर फ़ंक्शन को कॉल करता है !जो दो पैरामीटर लेता है, शब्द के बाएं और दाएं हिस्से को दिए गए स्थान पर। यह रुक जाता है अगर दोनों हिस्सों का वजन समान (फंक्शन v) हो या खुद को बायीं ओर ले गए दाहिने हिस्से के पहले अक्षर के साथ पुनरावर्ती रूप से कॉल करें। यह DOES NOT BALANCEसंदेश के साथ समाप्त होता है यदि दाहिना भाग खाली है।


4

सी, 183 134 बाइट्स

h,i,a=1;c(char*s){for(;s[i++]&&a;)for(a=h=0;s[h];)a+=(s[h]-64)*(h++-i);printf(a?"%.*s DOES NOT BALANCE":"%.*s %c %s",i,s,s[--i],s+i);}

नया संस्करण समझाया गया:

अन्य दो प्रविष्टियों की तरह, यह एक तरफ लगातार जोड़ का उपयोग करता है और दूसरे पर घटाव उम्मीद के शून्य तक पहुंचने के लिए होता है जो संतुलन का संकेत है। मेरा मूल आउटपुट पहले उत्तर से पुन: उपयोग किया जाता है, भले ही थोड़ा संशोधित हो।

l,h,i,a,b;c(char*s){for(l=strlen(s);h++<l&&(a^b|!a);)for(i=a=b=0;i<l;i++)i==h?a=b,b=0:(b+=(s[i]-64)*abs(i-h));printf(a==b?"%.*s %c %s":"%.*s DOES NOT BALANCE",a==b?h:l,s,s[--h],s+h);}

पुराने संस्करण की व्याख्या:

पहला लूप (एच) स्ट्रिंग की लंबाई के लिए मुख्य पुनरावृत्ति है। दूसरा लूप (i) जमा होता है (b) h == i तक। एक बार ऐसा होने पर, (b) में संग्रहीत किया जाता है (a), 0 पर रीसेट किया जाता है, और तब तक जारी रहता है जब तक कि स्ट्रिंग के अंत तक नहीं पहुंच जाता है जहां (a) की तुलना (b) से की जाती है। यदि कोई मेल है, तो मुख्य पुनरावृत्त का लूप टूट गया है और आउटपुट प्रिंट हो गया है।


3

रूबी 175

F=->s{v=->s{(0...s.size).map{|i|(i+1)*(s[i].ord-64)}.inject :+}
r="#{s} DOES NOT BALANCE"
(0...s.size).map{|i|b,a=s[0...i],s[i+1..-1]
v[b.reverse]==v[a]&&r=b+" #{s[i]} "+a}
r}

इसे ऑनलाइन टेस्ट करें: http://ideone.com/G403Fv

यह एक बहुत ही सरल रूबी कार्यान्वयन है। यहाँ पठनीय कार्यक्रम है:

F=-> word {
  string_value = -> str {
    (0...str.size).map{|i|(i+1) * (str[i].ord - 64)}.inject :+
  }

  result = "#{word} DOES NOT BALANCE"

  (0...word.size).map {|i|
    prefix, suffix = word[0...i], word[i+1..-1]
    if string_value[prefix.reverse] == string_value[suffix]
      result = prefix + " #{word[i]} " + suffix
    end
  }

  result
}

3

आर, 190 बाइट्स

एक अनाम फ़ंक्शन के रूप में। मुझे लगता है कि मुझे कुछ और मिल सकता है, लेकिन मुझे इंतजार करना होगा।

function(A){D=colSums(B<-(as.integer(charToRaw(A))-64)*outer(1:(C=nchar(A)),1:C,'-'));if(!length(E<-which(B[,D==0]==0)))cat(A,'DOES NOT BALANCE')else cat(substring(A,c(1,E,E+1),c(E-1,E,C)))}

थोड़े अनौपचारिक स्पष्टीकरण के साथ थोड़ा असंगत

function(A){
D=colSums(  #column sums of the outer function * character values
    B<-(
       as.integer(charToRaw(A))-64)    # character values
       * outer(1:(C=nchar(A)),1:C,'-') # matrix of ranges eg -3:2, -1:4, etc
       )
if(!length(
    E<-which(B[,D==0]==0) # where the colsum = 0, get the index of the zero
    ))
    cat(A,'DOES NOT BALANCE')
else 
    cat(substring(A,c(1,E,E+1),c(E-1,E,C)))  #cat the substrings
}

यह अंत में एक नई पंक्ति नहीं डालता है।

परीक्षण चालन

> f=
+ function(A){D=colSums(B<-(as.integer(charToRaw(A))-64)*outer(1:(C=nchar(A)),1:C,'-'));if(!length(E<-which(B[,D==0]==0)))cat(A,'DOES NOT BALANCE')else cat(substring(A,c(1,E,E+1),c(E-1,E,C)))}
> 
> f('CONSUBSTANTIATION')
CONSUBST A NTIATION
> f('WRONGHEADED')
WRO N GHEADED
> f('UNINTELLIGIBILITY')
UNINTELL I GIBILITY
> f('SUPERGLUE')
SUPERGLUE DOES NOT BALANCE
> 

2

सी, 142 बाइट्स

कुछ उपयोगकर्ताओं के लिए इसका श्रेय मुझे देने के लिए है :)

i,l=1,j;g(char*v){for(;v[i]&&l;++i)for(j=l=0;v[j];++j)l+=(i-j)*(v[j]-64);printf(l?"%.*s DOES NOT BALANCE":"%.*s %c %s",l?i:--i,v,v[i],v+i+1);}

1

जावा, 240 बाइट्स

String b(String s){for(int i=-1,a=s.length(),l=0,r,m;++i<a;){for(r=i;--r>=0;l+=(s.charAt(r)-64));for(m=r=0;++m+i<a;r+=(s.charAt(m+i)-64)*m);if(l==r)return s.substring(0,i)+" "+s.charAt(i)+" "+s.substring(i+1);}return s+" DOES NOT BALANCE";}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.