คำศัพท์ที่สมดุล


33

ความท้าทายนี้ถูกโพสต์ลงบน subreddit ของ DailyProgrammer และฉันคิดว่ามันจะเป็นตัวเลือกที่ยอดเยี่ยมสำหรับการแข่งขันกอล์ฟรหัส การพิจารณาว่ายอดคงเหลือจดหมายจะขึ้นอยู่กับระยะทางจากจุดสมดุลและมูลค่าของจดหมาย ค่าของตัวอักษรสามารถกำหนดได้โดยรับตำแหน่งหนึ่งดัชนีในตัวอักษรหรือโดยการลบ 64 จากค่า ASCII นอกจากนี้ค่าของตัวอักษรจะถูกคูณด้วยระยะทางจากจุดสมดุล ลองมาดูตัวอย่าง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แทน -> `A 'ได้หรือไม่?
nimi

1
@nimi ใช่คุณอาจเว้นช่องว่าง
Kade

การป้อนอักขระเดี่ยวควรพิจารณาว่ามีความสมดุลหรือไม่?
ผู้ใช้บางคน

1
@someuser ใช่เพราะ "น้ำหนัก" ที่ด้านใดด้านหนึ่งคือ 0
Kade

คำตอบ:


6

Pyth, 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

ทุบตีบริสุทธิ์ (ไม่มี coreutils หรือสาธารณูปโภคอื่น ๆ ), 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

Python 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])

รหัสนี้ไม่ได้ทดสอบ fulcrums ที่เป็นไปได้ แต่จะหา "จุดศูนย์กลางมวล" และตรวจสอบว่าเป็นจำนวนเต็มหรือไม่ มันไม่ได้จากข้อสรุปมวลรวมaและมวลตำแหน่งถ่วงน้ำหนักเพื่อหาจุดศูนย์กลางมวลb m=b/aจากนั้นพิมพ์ทั้งการแบ่งสตริงที่ตำแหน่งmหรือสตริงบวกที่"DOES NOT BALANCE"เลือกโดย[_::2]เคล็ดลับการแบ่งรายการ


8

CJam, 57 ไบต์

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

สิ่งนี้ยังคงสามารถเล่นกอล์ฟได้เล็กน้อย

ลองออนไลน์ได้ที่นี่


ที่แก้ไขมัน จะสั้นกว่า'@fm 64f-:i
Dennis

ใช่ .. ลืมไปว่า CJam ทำตัวแปลก ๆ ในกรณีลบ char ..
เครื่องมือเพิ่มประสิทธิภาพ

7

JavaScript (ES6), 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`}

การสาธิต

Firefox และ Edge สำหรับตอนนี้เท่านั้นเนื่องจากเป็น ES6

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
ลองใช้ array comprehension [for (v of w) v.charCode .... ] โดยปกติแล้วจะสั้นกว่า.
map

@ edc65 ขอบคุณ! เรียนรู้สิ่งใหม่ทุกวัน
rink.attendant.6

1
@ edc65 เข้าใจอาร์เรย์เป็นเทคนิคผลักร่าง ES7 ตอนนี้: (
nderscore

1
-1 ไบต์: ย้ายj=0ภายในการเรียกไปยังcharCodeAt:)
nderscore

6

C, 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");}

ขยายด้วย main ():

#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);}หมายเหตุ: ใช้ไม่ได้กำหนดพฤติกรรม :)
โคลคาเมรอน

ฉันคิดว่าคุณควรโพสต์มันต่อไป ฉันยังตระหนักว่าฉันควรกำจัด #define ของฉันเนื่องจากเป็นการสูญเสียไบต์
ผู้ใช้บางคน

ฉันพยายามอย่างหนักเพื่อเอาชนะ C ด้วย PHP แต่ฉันยังคงเป็น byte off อยู่
rink.attendant.6

6

CJam, 50 ไบต์

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

การใช้ล่าม Java สิ่งนี้จบลงด้วยข้อผิดพลาดไปยัง STDERR สำหรับคำที่ไม่สมดุล

หากคุณลองใช้รหัสในล่าม CJamให้เพิกเฉยทุกอย่างยกเว้นบรรทัดสุดท้ายของผลลัพธ์

ความคิด

"แนวคิดดั้งเดิม" ของฉันกลายเป็นวิธีเดียวกันกับ@xnor โพสต์หลายชั่วโมงก่อนฉัน อย่างไรก็ตามที่นี่มันไป:

รับรายการค่า(v 0 , … v n )เรามีv_t ที่เป็นจุดยึดของรายการถ้าหากเงื่อนไขข้อใดข้อหนึ่งดังต่อไปนี้ถือเป็นเงื่อนไขที่เทียบเท่า:

  • tv 0 + … + 1v t-1 == 1v t + 1 + … tv n

  • (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

Julia, 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->...เรียกว่าให้มันชื่อเช่น

เราปฏิบัติต่อคำเช่นระบบหนึ่งมิติซึ่งเราต้องหาจุดศูนย์กลางมวล จุดศูนย์กลางมวลถูกคำนวณเป็นผลคูณแบบจุดของมวลที่มีตำแหน่งของมันหารด้วยมวลรวมของระบบ หากศูนย์กลางที่คำนวณเป็นจำนวนเต็มมันจะสอดคล้องกับหนึ่งในตัวอักษรในคำว่า มิฉะนั้นคำไม่สมดุล

คำอธิบาย Ungolfed +:

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

Haskell, 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

C, 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);}

เวอร์ชั่นเก่าอธิบาย:

loop แรก (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

นี่เป็นการนำ Ruby ไปใช้อย่างตรงไปตรงมา นี่คือโปรแกรมที่อ่านได้:

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

R, 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)))}

Ungolfed เล็กน้อยพร้อมคำอธิบายสั้น ๆ

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

C, 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

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