Kelimeleri Dengelemek


33

Bu meydan okuma DailyProgrammer alt dizininde yayınlandı ve bir kod golf mücadelesi için harika bir aday olacağını düşündüm. Bir harfin bakiyesinin bakiye noktasından uzaklığına ve harfin değerine bağlı olup olmadığını belirleme. Bir harfin değeri, alfabedeki tek indeksli pozisyonu alınarak veya 64'ü ASCII değerinden çıkartarak belirlenebilir. Ayrıca, bir harfin değeri denge noktasından uzaklığı ile çarpılır. Bir örneğe bakalım 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.

Ancak, tüm kelimelerin dengelenmediğine dikkat edilmelidir. Örneğin, kelime WRONGhiçbir yapılandırmada dengelenmez. Ayrıca, kelimeler iki harf arasında değil, bir harf üzerinde dengelenmelidir. Örneğin SAAS, iki As'in ortasında bir mektup olsaydı, denge kurardı, ancak hiçbiri dengede değil.

Görev

Büyük harfli bir kelimeyi girdi veya işlev argümanları olarak alan bir program veya işlev oluşturmanız ve ardından iki çıktıdan birini üretmeniz gerekir:

  1. Sözcük dengeye gelirse, sözcük sol taraf, boşluk, çapa harfi, başka bir boşluk ve sağ taraf ile yazdırılmalıdır.

    function (STEAD) -> S T EAD

  2. Kelime dengede değilse, kelimeyi ve ardından DOES NOT BALANCE

    function (WRONG) -> WRONG DOES NOT BALANCE

Tüm girişlerin büyük harf olacağını ve sadece alfa karakterleri olacağını varsayabilirsiniz.

Örnek G / Ç

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

Bu , yani bayt cinsinden en kısa cevap kazanır.


Biz tek harfli kelimeler, örneğin çıkışında boşluklar ihmal Can function (A)> - A> `A` - yerine?
nimi

1
@nimi Evet, boşluk bırakabilirsiniz.
Kade

Tek karakter girişi hiç dengelenmeli mi?
bazı kullanıcılar

1
@someuser Evet, çünkü her iki taraftaki "ağırlık" 0'dır.
Kade

14
BALANCE DOES NOT BALANCE
Doktor,

Yanıtlar:


6

Pyth, 49 bayt

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

Gösteri.

Açıklama:

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

Saf bash (coreutils veya diğer yardımcı programları içermez), 125

Menşei ile ilgili anları kullanarak standart kütle hesaplama merkezi:

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}

Test çıkışı:

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

Bu kod potansiyel dayanak noktalarını test etmiyor, aksine “kütle merkezini” bulur ve bir tamsayı olup olmadığını kontrol eder. Bunu, akütle bmerkezini bulmak için toplam kütle ve pozisyon ağırlıklı kütleyi toplayarak yapar m=b/a. Daha sonra ya pozisyondaki bölünmüş dizeyi mya "DOES NOT BALANCE"da [_::2]liste dilimleme numarası ile seçilen dizgeyi artı olarak yazdırır .


8

CJam, 57 bayt

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

Bu hala biraz golf olabilir.

Burada çevrimiçi deneyin


Bu onu düzeltir. '@fmdaha kısa 64f-:i.
Dennis,

Evet .. unuttum CJam char çıkarılması durumunda garip davranıyor .. ..
Doktor

7

JavaScript (ES6), 211 200 160 bayt

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

Önceki deneme, 200 bayt

Bu golf için bana yardım için edc56 ve nderscore için teşekkürler

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

gösteri

Firefox ve Edge yalnızca şimdilik, ES6’da olduğu gibi

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
Dizi kavrayışını deneyin [(w için v) v.charCode ....] için, genellikle dizeler için .map
öğesinden

@ edc65 Teşekkürler! Her gün yeni bir şeyler öğren
rink.attendant.6

1
@ edc65 dizi anlama teknik olarak şimdi ES7 taslağına itilir :(
nderscore 7:15

1
-1 bayt: j=0aramaya devam et charCodeAt:)
nderscore

6

C, 236 198 192 188 180 173 bayt

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 () ile genişletilmiş:

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

Doğrulama:

$ ./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
Benim çözümüm sizin cevap yazamayacak kadar benziyordu, ama 146 karaktere kadar alabildim: 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);}Not: tanımsız davranışlar kullanıyor :)
Cole Cameron

Bence yine de göndermelisin. Ayrıca bayt harcıyor gibi # tanımımdan kurtulmam gerektiğini de fark ettim.
bazı kullanıcılar

PHP ile C yenmek için gerçekten çok çalışıyorum ama hala bir bayt
kapalıyım

6

CJam, 50 bayt

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

Java tercümanını kullanarak, dengesiz sözcükler için STDERR'ye bir hatayla çıkıyor.

Eğer kodu CJam yorumlayıcısında denerseniz , sadece son çıktı satırı dışında her şeyi görmezden gelin .

Fikir

Benim "orijinal fikrim" aynı yaklaşım olarak ortaya çıktı @ xnor benden birkaç saat önce yayınlandı . Yine de, işte gidiyor:

Bir değerler listesi göz önüne alındığında (v 0 ,… v n ) , v_t'nin yalnızca aşağıdaki eşdeğer koşullardan herhangi birinin geçerli olması durumunda listenin tutucusudur:

  • TV 0 + ... + 1v t-1 == 1v t + 1 + ... televizyon 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 ) bir tamsayıdır.

kod

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.

Bu bölümde, aşırı yüklenmiş operatörler ile biraz eğlenmeye başlıyoruz.

Bölüm için bu olur:

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

Dize için bu olur:

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

Bu noktada, ""son bir karakter olmadığından çalışma zamanı hatası meydana geliyor. Yığın yazdırılır ve çalıştırma derhal durdurulur.



@ aditsu: Ah, yanlış bağlantı. Daha kısa ve daha temiz, evet, ama takip eden boşlukları var ...
Dennis

5

Julia, 122 bayt

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

Bu, dizgeyi girdi olarak kabul eden ve bir dize döndüren adsız bir işlev yaratır. Aramak için bir isim verin, örneğinf=s->... .

Sözcüğü, kütle merkezini bulmamız gereken tek boyutlu bir sistem gibi ele alıyoruz. Kütle merkezi, kütlelerin nokta çarpımları olarak, konumlarının bulunduğu sistemin toplam kütlesine bölünerek hesaplanır. Hesaplanan merkez bir tamsayıysa, kelimedeki harflerden birine karşılık gelir. Aksi halde kelime dengede olmaz.

Ungolfed + açıklama:

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

Örnekler:

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

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

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

5

PHP, 249 174 bayt

Bir komut satırı argümanı alır.

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

İlk deneme:

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

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

Kullanım örneği:

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

Nasıl çalışır: iki parametre falan yardımcı işlevi çağırır !, kelimenin sol ve sağ kısmı verilen bir pozisyonda. Her iki parçanın da eşit ağırlığa (fonksiyona v) sahip olması veya sola kaydırılan sağ parçanın ilk harfi ile tekrarlı olarak çağırması durumunda durur . DOES NOT BALANCESağ kısım boş ise mesajla biter .


4

C, 183 134 bayt

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

Açıklanan Yeni Sürüm:

Diğer iki girişte olduğu gibi, bir tarafa sürekli toplama ve diğer tarafa çıkarma işleminden, umarım dengenin göstergesi olan sıfıra ulaşmak için kullanılır. Orijinal çıktım, biraz değiştirilse de, ilk cevaptan itibaren yeniden kullanılıyor.

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

Açıklanan Eski Sürüm:

İlk döngü (h), dize uzunluğu için ana yineleyicidir. İkinci döngü (i) h == i olana kadar (b) biriktirir. Bu gerçekleştiğinde, (b) (a) 'da depolanır, 0'a resetlenir ve sonra (a)' nın (b) ile karşılaştırıldığı yerde dizenin sonuna ulaşılana kadar devam eder. Bir eşleşme varsa, ana yineleyicinin döngüsü bozulur ve çıktı yazdırılır.


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}

Çevrimiçi sınayın: http://ideone.com/G403Fv

Bu oldukça basit bir Ruby uygulamasıdır. İşte okunabilir program:

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 bayt

Adsız bir işlev olarak. Sanırım birkaç tane daha alabilirim, ama bu beklemek zorunda kalacak.

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 biraz açıklama ile biraz

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
}

Sonunda yeni bir satır koymaz.

Test sürüşü

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

Beni dövdüğü için bazı kullanıcılara teşekkür et :)

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 bayt

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";}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.