Menyeimbangkan Kata

33

Tantangan ini telah diposting di subreddit DailyProgrammer, dan saya pikir itu akan menjadi kandidat yang bagus untuk tantangan kode golf. Menentukan apakah surat saldo didasarkan pada jaraknya dari titik keseimbangan, dan nilai surat itu. Nilai huruf dapat ditentukan dengan mengambil posisi satu-indeksnya dalam alfabet, atau dengan mengurangi 64 dari nilai ASCII-nya. Selain itu, nilai surat dikalikan dengan jaraknya dari titik keseimbangan. Mari kita lihat sebuah contoh 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.

Namun, perlu dicatat bahwa tidak semua kata seimbang. Misalnya, kata WRONGtersebut tidak seimbang dalam konfigurasi apa pun. Juga, kata-kata harus seimbang pada satu huruf, bukan di antara dua huruf. Misalnya, SAASakan menyeimbangkan jika ada huruf di tengah dua As, tetapi karena tidak ada itu tidak seimbang.

Tugas

Anda harus membuat program atau fungsi yang menggunakan kata huruf besar sebagai input atau argumen fungsi , dan kemudian menghasilkan salah satu dari dua output:

  1. Jika kata tersebut seimbang, maka kata tersebut harus dicetak dengan sisi kiri, spasi, huruf jangkar, spasi lain, dan sisi kanan.

    function (STEAD) -> S T EAD

  2. Jika kata itu tidak seimbang, Anda harus mencetak kata, diikuti oleh DOES NOT BALANCE

    function (WRONG) -> WRONG DOES NOT BALANCE

Anda dapat mengasumsikan bahwa semua input akan menjadi huruf besar dan hanya akan ada karakter alfa.

Contoh I / O

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

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Kade
sumber
Bisakah kita menghilangkan spasi dalam output dari kata-kata huruf tunggal, misalnya function (A)-> Abukannya -> `A`?
nimi
1
@nimi Ya, Anda dapat menghilangkan spasi.
Kade
Haruskah input karakter tunggal dianggap seimbang?
beberapa pengguna
1
@someuser Ya, karena "bobot" di kedua sisi adalah 0.
Kade
14
BALANCE DOES NOT BALANCE
Pengoptimal

Jawaban:

6

Pyth, 49 byte

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

Demonstrasi.

Penjelasan:

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.
isaacg
sumber
12

Bash murni (tanpa coreutils atau utilitas lain), 125

Pusat standar perhitungan massa menggunakan momen tentang asal:

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}

Output tes:

$ 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
$ 
Trauma Digital
sumber
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])

Kode ini tidak menguji titik tumpu potensial, tetapi menemukan "pusat massa" dan memeriksa apakah itu bilangan bulat. Itu dilakukan dengan menjumlahkan massa total adan massa posisi-tertimbang b, untuk menemukan pusat massa m=b/a. Kemudian mencetak string yang dipisah pada posisi m, atau string plus "DOES NOT BALANCE", yang dipilih oleh [_::2]trik slicing daftar.

Tidak
sumber
8

CJam, 57 byte

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

Ini masih bisa golf sedikit.

Cobalah online di sini

Pengoptimal
sumber
Itu memperbaikinya. '@fmlebih pendek dari 64f-:i.
Dennis
Ya .. lupa bahwa CJam bertindak aneh jika pengurangan arang ..
Pengoptimal
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`}

Upaya sebelumnya, 200 byte

Terima kasih kepada edc56 dan nderscore untuk membantu saya bermain golf ini

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

Demo

Firefox dan Edge hanya untuk saat ini, seperti 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'));

rink.attendant.6
sumber
3
Coba pemahaman array [for (v of w) v.charCode ....], biasanya 1 byte lebih pendek dari .map untuk string
edc65
@ edc65 Terima kasih! Pelajari sesuatu yang baru setiap hari
rink.attendant.6
1
@ edc65 pemahaman array secara teknis didorong ke draft ES7 sekarang :(
nderscore
1
-1 byte: pindah j=0ke dalam panggilan ke charCodeAt:)
nderscore
6

C, 236 198 192 188 180 180 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");}

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

Verifikasi:

$ ./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
beberapa pengguna
sumber
1
Solusi saya terlalu mirip dengan milik Anda untuk mengirim jawaban, tetapi saya bisa turun ke 146 karakter: 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);}Catatan: menggunakan perilaku yang tidak terdefinisi :)
Cole Cameron
Saya pikir Anda harus mempostingnya juga. Saya juga menyadari bahwa saya harus menyingkirkan #define saya karena membuang-buang byte.
beberapa pengguna
Saya berusaha sangat keras untuk mengalahkan C dengan PHP tapi saya masih byte
rink.attendant.6
6

CJam, 50 byte

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

Menggunakan penerjemah Java, ini keluar dengan kesalahan ke STDERR untuk kata-kata yang tidak seimbang.

Jika Anda mencoba kode dalam juru bahasa CJam , abaikan saja semuanya kecuali baris keluaran terakhir.

Ide

"Ide asli" saya ternyata adalah pendekatan yang sama dengan @xnor yang diposting beberapa jam sebelum saya. Namun demikian, ini dia:

Diberikan daftar nilai (v 0 , ... v n ) , kami berpendapat bahwa v_t adalah jangkar daftar jika dan hanya jika salah satu dari kondisi berikut ini, yang setara berlaku:

  • 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 ) adalah bilangan bulat.

Kode

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.

Pada bagian ini, kami mulai bersenang-senang dengan operator yang kelebihan beban.

Bagi hasil bagi, ini terjadi:

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

Untuk string, ini terjadi:

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

Pada titik ini, kesalahan runtime terjadi, karena ""tidak memiliki karakter terakhir. Tumpukan dicetak dan mengeksekusi dibatalkan segera.

Dennis
sumber
Kode yang Anda
tautkan
@aditsu: Oh, tautan salah. Ini lebih pendek dan lebih bersih, ya, tetapi memiliki ruang tambahan ...
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")

Ini menciptakan fungsi tanpa nama yang menerima string sebagai input dan mengembalikan string. Untuk menyebutnya, berikan nama, mis f=s->....

Kami memperlakukan kata seperti sistem satu dimensi yang kami butuhkan untuk menemukan pusat massa. Pusat massa dihitung sebagai produk titik dari massa dengan lokasi mereka, dibagi dengan total massa sistem. Jika pusat yang dihitung adalah bilangan bulat, itu sesuai dengan salah satu huruf dalam kata. Kalau tidak, kata itu tidak seimbang.

Penjelasan + tidak dikumpulkan:

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

Contoh:

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

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

julia> f("CONSUBSTANTIATION")
"CONSUBST A NTIATION"
Alex A.
sumber
5

PHP, 249 174 byte

Mengambil satu argumen baris perintah.

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

Upaya awal:

<?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";
rink.attendant.6
sumber
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=([]!)

Contoh penggunaan:

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

Cara kerjanya: fmemanggil fungsi helper !yang mengambil dua parameter, bagian kiri dan kanan kata pada posisi tertentu. Itu berhenti jika kedua bagian memiliki bobot (fungsi v) yang sama atau menyebut dirinya secara rekursif dengan huruf pertama dari bagian kanan dipindahkan ke kiri. Itu berakhir dengan DOES NOT BALANCEpesan jika bagian kanan kosong.

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

Versi Baru Dijelaskan:

Seperti dua entri lainnya, ia menggunakan penambahan konstan di satu sisi dan pengurangan di sisi lain untuk mudah-mudahan mencapai nol yang merupakan indikasi keseimbangan. Keluaran asli saya digunakan kembali dari jawaban pertama, meskipun sedikit dimodifikasi.

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

Versi Lama Dijelaskan:

Loop pertama (h) adalah iterator utama untuk panjang string. Loop kedua (i) terakumulasi (b) hingga h == i. Setelah itu terjadi, (b) disimpan dalam (a), reset ke 0, dan kemudian berlanjut sampai akhir string tercapai di mana (a) dibandingkan dengan (b). Jika ada kecocokan, loop iterator utama rusak dan hasilnya dicetak.

openaddr
sumber
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}

Uji secara online: http://ideone.com/G403Fv

Ini adalah implementasi Ruby yang sangat mudah. Inilah program yang dapat dibaca:

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
}
Cristian Lupascu
sumber
3

R, 190 byte

Sebagai fungsi yang tidak disebutkan namanya. Saya pikir saya bisa mendapatkan beberapa lagi, tetapi itu harus menunggu.

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

Tidak digabungkan sedikit dengan penjelasan singkat

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
}

Itu tidak menempatkan baris baru di akhir.

Uji coba

> 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
> 
MickyT
sumber
2

C, 142 byte

Kredit untuk beberapa pengguna karena telah mengalahkan saya :)

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);}
Cole Cameron
sumber
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";}
ECS
sumber