Cân bằng từ


33

Thử thách này đã được đăng trên subreddit DailyProgrammer và tôi đoán rằng nó sẽ là một ứng cử viên tuyệt vời cho một thử thách golf mã. Xác định xem số dư của chữ cái có dựa trên khoảng cách của nó so với điểm cân bằng và giá trị của chữ cái không. Giá trị của một chữ cái có thể được xác định bằng cách lấy vị trí một chỉ mục của nó trong bảng chữ cái hoặc bằng cách trừ 64 từ giá trị ASCII của nó. Hơn nữa, giá trị của một chữ cái được nhân với khoảng cách của nó từ điểm cân bằng. Hãy xem một ví dụ 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.

Tuy nhiên, cần lưu ý rằng không phải tất cả các từ cân bằng. Ví dụ, từ WRONGkhông cân bằng trong bất kỳ cấu hình. Ngoài ra, các từ phải cân bằng trên một chữ cái, không phải giữa hai chữ cái. Ví dụ, SAASsẽ cân bằng nếu có một chữ cái ở giữa hai chữ số A, nhưng vì không có chữ nào nên nó không cân bằng.

Nhiệm vụ

Bạn nên tạo một chương trình hoặc hàm lấy từ viết hoa làm đối số đầu vào hoặc hàm , sau đó tạo một trong hai đầu ra:

  1. Nếu từ cân bằng, thì từ đó nên được in với bên trái, một khoảng trắng, ký tự neo, một khoảng trắng khác và phía bên phải.

    function (STEAD) -> S T EAD

  2. Nếu từ không cân bằng, bạn nên in ra từ, theo sau là DOES NOT BALANCE

    function (WRONG) -> WRONG DOES NOT BALANCE

Bạn có thể cho rằng tất cả đầu vào sẽ là chữ hoa và sẽ chỉ có các ký tự alpha.

Ví dụ I / O

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

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.


Chúng ta có thể bỏ qua khoảng trắng trong đầu ra của các từ đơn, ví dụ function (A)-> Athay vì -> `A` không?
nimi

1
@nimi Có, bạn có thể bỏ qua khoảng trắng.
Kade

Đầu vào ký tự đơn có nên được cân bằng ở tất cả?
một số người dùng

1
@someuser Có, vì "trọng lượng" ở hai bên là 0.
Kade

14
BALANCE DOES NOT BALANCE
Tối ưu hóa

Câu trả lời:


6

Bình thường, 49 byte

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

Trình diễn.

Giải trình:

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

Bash tinh khiết (không có coreutils hoặc các tiện ích khác), 125

Trung tâm tiêu chuẩn tính toán khối lượng sử dụng các khoảnh khắc về nguồn gốc:

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}

Đầu ra thử nghiệ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

Con trăn 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])

Mã này không kiểm tra các điểm tựa tiềm năng, mà là tìm "trung tâm khối lượng" và kiểm tra xem đó có phải là số nguyên không. Nó làm như vậy bằng cách tính tổng khối lượng avà khối lượng theo vị trí b, để tìm tâm khối lượng m=b/a. Sau đó, nó in chuỗi phân tách tại vị trí mhoặc chuỗi cộng "DOES NOT BALANCE", được chọn bởi [_::2]thủ thuật cắt danh sách.



7

JavaScript (ES6), 211 200 160 byte

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`}

Lần thử trước, 200 byte

Cảm ơn edc56 và nderscore đã giúp tôi chơi golf này

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`}

Bản giới thiệu

Hiện tại Firefox và Edge chỉ là 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
Hãy thử hiểu mảng [cho (v của w) v.charCode ....], nó thường ngắn hơn 1 byte so với .map cho chuỗi
edc65

@ edc65 Cảm ơn! Học một cái gì đó mới mỗi ngày
rink.attguard.6 7/07/2015

1
Hiểu mảng @ edc65 về mặt kỹ thuật được đẩy lên dự thảo ES7 ngay bây giờ :(
nderscore 7/07/2015

1
-1 byte: di chuyển j=0bên trong cuộc gọi đến charCodeAt:)
nderscore 7/07/2015

6

C, 236 198 192 188 180 173 byte

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

Mở rộng với hàm 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");
}

Xác minh:

$ ./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
Giải pháp của tôi quá giống với giải pháp của bạn để gửi câu trả lời, nhưng tôi đã có thể xuống tới 146 ký tự: 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);}Lưu ý: sử dụng hành vi không xác định :)
Cole Cameron

Tôi nghĩ bạn vẫn nên đăng nó. Tôi cũng nhận ra rằng tôi nên thoát khỏi #define của mình vì nó đang lãng phí byte.
một số người dùng

Tôi đang rất cố gắng để đánh bại C bằng PHP nhưng tôi vẫn bị mất một byte
rink.attguard.6

6

CJam, 50 byte

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

Sử dụng trình thông dịch Java, điều này thoát với lỗi STDERR cho các từ không cân bằng.

Nếu bạn thử mã trong trình thông dịch CJam , chỉ cần bỏ qua mọi thứ trừ dòng đầu ra cuối cùng.

Ý kiến

"Ý tưởng ban đầu" của tôi hóa ra là cách tiếp cận tương tự @xnor đã đăng vài giờ trước tôi. Tuy nhiên, ở đây nó đi:

Cho một danh sách các giá trị (v 0 , v ... n ) , chúng tôi đã có v_t là neo danh sách nếu và chỉ nếu có những điều sau đây, điều kiện tương đương nắm giữ:

  • tv 0 + Khác + 1v t-1 == 1v t + 1 + tv tv n

  • (0 - t) v 0 + Nhìn + (n - t) v n == 0

  • 0v 0 + Vay + nv n == t (v 0 + Rọ + v n )

  • t: = (0v 0 + Khác + nv n ) / (v 0 + Khác + v n ) là một số nguyê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.

Trong phần này, chúng tôi bắt đầu có một niềm vui nhỏ với các nhà khai thác quá tải.

Đối với thương số, điều này xảy ra:

)     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.

Đối với chuỗi, điều này xảy ra:

)     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.

Tại thời điểm này, một lỗi thời gian chạy xảy ra, vì ""không có char cuối cùng. Ngăn xếp được in và thực thi bị hủy bỏ ngay lập tức.


Mã bạn liên kết có vẻ khác nhau (và tốt hơn?)
aditsu

@aditsu: Ồ, liên kết sai. Nó ngắn hơn và sạch hơn, vâng, nhưng nó có dấu cách ...
Dennis

5

Julia, 122 byte

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")

Điều này tạo ra một hàm không tên, chấp nhận một chuỗi làm đầu vào và trả về một chuỗi. Để gọi nó, đặt tên cho nó, vd f=s->....

Chúng ta coi từ này giống như một hệ thống một chiều mà chúng ta cần tìm trung tâm của khối lượng. Trung tâm khối lượng được tính là sản phẩm chấm của quần chúng với vị trí của chúng, chia cho tổng khối lượng của hệ thống. Nếu trung tâm tính là một số nguyên, nó tương ứng với một trong các chữ cái trong từ. Nếu không, từ không cân bằng.

Ungolfed + giải thích:

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

Ví dụ:

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

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

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

5

PHP, 249 174 byte

Có một đối số dòng lệnh.

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

Nỗ lực ban đầu:

<?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 byte

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=([]!)

Ví dụ sử dụng:

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

Cách thức hoạt động: fgọi hàm trợ giúp !có hai tham số, phần bên trái và bên phải của từ tại một vị trí nhất định. Nó dừng lại nếu cả hai phần có trọng lượng bằng nhau (chức năng v) hoặc tự gọi đệ quy với chữ cái đầu tiên của phần bên phải di chuyển sang bên trái. Nó kết thúc bằng DOES NOT BALANCEtin nhắn nếu phần bên phải trống.


4

C, 183 134 byte

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

Giải thích phiên bản mới:

Giống như hai mục còn lại, nó sử dụng phép cộng liên tục ở một bên và phép trừ ở bên kia để hy vọng đạt đến 0, đó là dấu hiệu của sự cân bằng. Đầu ra ban đầu của tôi được sử dụng lại từ câu trả lời đầu tiên, mặc dù đã được sửa đổi một chút.

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

Giải thích phiên bản cũ:

Vòng lặp đầu tiên (h) là vòng lặp chính cho độ dài của chuỗi. Vòng lặp thứ hai (i) tích lũy (b) cho đến khi h == i. Khi điều đó xảy ra, (b) được lưu trữ trong (a), đặt lại về 0 và sau đó tiếp tục cho đến khi kết thúc chuỗi trong đó (a) được so sánh với (b). Nếu có một trận đấu, vòng lặp chính của vòng lặp chính bị hỏng và đầu ra được in.


3

Ruby 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}

Kiểm tra trực tuyến: http://ideone.com/G403Fv

Đây là một triển khai Ruby khá đơn giản. Đây là chương trình có thể đọc được:

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 byte

Là một chức năng không tên. Tôi nghĩ rằng tôi có thể có thêm một vài thứ nữa, nhưng điều đó sẽ phải chờ.

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 một chút với lời giải thích ngắn gọn

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
}

Nó không đặt một dòng mới ở cuối.

Chạy thử nghiệm

> 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 byte

Tín dụng cho một số người dùng đã đánh bại tôi với nó :)

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 byte

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";}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.