Numeronim veya N8s?


10

Bir numeronym ("sayısal kasılma" olarak da bilinir), bir kelime sayılar kullanılarak kısaltılır. Yaygın olarak kullanılan bir daralma yöntemi, değiştirilen alt dizenin uzunluğunu, ilk ve son karakterlerin dışındaki tüm karakterlerin yerine kullanmaktır. Örneğin, i18nyerine internationalizationveya L10nyerine kullanınlocalization . ( LKüçük harfli olana çok benzediği için büyük harfle yazılır 1.)

Tabii ki, aynı cümledeki birkaç kelime aynı kısaltılmış forma sahip olabilir, bu yüzden işiniz bir grup kelimeyi numeronimlerine dönüştürmek veya aynı numeronim ile bazı farklı kelimeler olması durumunda, programınız bir sonucu A7s R4t, kısa Ambiguous Result(evet, bu sonucun kendisinin belirsiz bir sonuç olduğunu biliyorum.)

Kurallar:

  • Bir program veya işlev kullanın ve sonucu yazdırın veya döndürün.
  • Giriş tek bir dize olarak alınır.
  • Çıktı, boşlukla ayrılmış kelimelerin tek bir dizesidir.
  • Programınızın uzunluğu 3 olan kelimeleri dönüştürmesi ve daha kısa kelimeleri dönüştürmesi gerekmez.
  • lBir 1(bir) harfinden önce bir (küçük harfli el) ortaya çıkarsa , büyük harfli yapılmalıdır.
  • Bir I(büyük) göz 1( a) 'dan önce ortaya çıkarsa , küçük harf yapılmalıdır.
  • Giriş yazdırılabilir ASCII ve boşluklar olacaktır. Kelimeler boşluklarla ayrılır.
  • En kısa kod kazanır.

Örnekler:

A7s R4t -> A7s R4t (OR: A1s R1t, etc)
Ambiguous Result -> A7s R4t
Billy goats gruff -> B3y g3s g3f
Thanks for the Memories -> T4s f1r the M6s (one possible answer, NOT: Thnks fr th Mmrs)
Programming Puzzles & Code Golf -> P9g P5s & C2e G2f
globalization -> g11n
localizability -> L12y
Internationalization or antidisestablishmentarianism -> i18n or a26m
Internationalization or InternXXXXXalization -> A7s R4t
what is this fiddle and faddle -> A7s R4t
A be see -> A be s1e (OR: A be see)
see sea -> s1e s1a (OR: see sea)
2B or not 2B -> 2B or not 2B (OR: 2B or n1t 2B. 2 letters, don't change, don't count as ambiguous)
this example is this example -> t2s e5e is t2s e5e (same words aren't ambiguous)
l1 -> l1 (2 letters, don't change.)
I1 -> I1 (2 letters, don't change.)

Düzenleme: Herkes referans alamadım: Thnks fr th Mmrs


Girdi sayılar da içerebilir mi? Eğer öyleyse, bir giriş yapar l1hale L1veya kal l1?
Kapı Tokmağı

Ben vurgu gelen tahmin farklıexample example olurdu e5e e5e, ama bunun kapsayan bir test vakası dahil etmek iyi olur.
Peter Taylor

Her iki sorunuz için ( 2B or not 2Bve sonrasında) test örnekleri eklendi
mbomb007

Yanıtlar:


1

J, 92 bayt

(' 'joinstring(<&(]`(rplc&('I1';'i1')&(rplc&('l1';'L1'))&({.,([:":#-2:),{:))@.(#>3:))&>&;:))

Looong birleşik çağrı zinciri. , Bir hazır: birinci parça sadece bir çatal joinstringve bir işlev (J, 1 (10 + +) 2bir (10 + (1 + 2))). İkinci bölüm fonksiyon. İki rplcçağrı, karıştırılabilecekleri zaman I / l'nin yerini alacaktır. &kompozisyon ve bir değer körileri olan bir operatör oluşturmaktır. (böylece 3&+2. argümanın eklenmesini bekleyen bir işlev verir). Son olarak, son bölüm ilk, uzunluk-2 (dizgi ile oluşturulmuş) ve sonuncuyu alan işlevdir. ( &>&;:bit sözcükleri) kutulu bir liste döndürdüğünden (her öğenin farklı uzunluğa sahip olabilmesi için) sondaki bit (her bağımsız değişkene uygulanması gereken) bu işlevi ( >kutudan çıkarmaya ;:) oluşturur.

misal:

     (' 'joinstring(<&(]`(rplc&('I1';'i1')&(rplc&('l1';'L1'))&({.,([:":#-2:),{:))@.(#>3:))&>&;:)) 'hey you baby Iooooooooneey I1'
hey you b2y i11y I1

4

Caché ObjectScript , 231 bayt

r(a,b) s o=$REPLACE(o,a,b) q
z(s) f i=1:1:$L(s," ") s u=$P(s," ",i),l=$L(u),o=$S(l<4:u,1:$E(u)_(l-2)_$E(u,l)) d:l>3 r("I1","i1"),r("l1","L1") d  g:r z+4
    . i '(l<4!(v(o)=u!'$D(v(o)))) s r=1 q
    . s v(o)=u,t=t_o_" "
    q t
    q "A7s R4t"

Bu $REPLACE, standardın bir parçası olmayan bu sinir bozucu çağrı için olmasaydı, standartlarla uyumlu MUMPS olurdu . Saf M'de yeniden uygulamak iyi bir 80ish bayt alır, bu yüzden o rotaya gitmedim.

Giriş noktası $$z("your string here")geri döner "y2r s4g h2e"ve bu böyle devam eder.


3
Dil ile bağlantı kurabilir misiniz? Bunu duymadım.
mbomb007

Demek istediğim, onun için google'ı kullandığınızda ortaya çıkan şey ( docs.intersystems.com/cache20152/csp/docbook/… ) - MUMPS'ın tescilli bir lezzeti.
senshin

3

C #, 280 274 bayt

Burada ilk kez golfçü! Son zamanlarda bunları okumaktan keyif aldım ve bu yüzden kendimi deneyebileceğimi düşündüm! Muhtemelen en iyi çözüm değil, ama iyi!

class B{static void Main(string[] a){string[] n=Console.ReadLine().Split(' ');string o="";int j,i=j=0;for(;j<n.Length;j++){int s=n[j].Length;n[j]=((s<4)?n[j]:""+n[j][0]+(s-2)+n[j][s-1])+" ";o+=n[j];for(;i<j;i++)if(n[j]==n[i]){o="A7s R4t";j=n.Length;}}Console.WriteLine(o);}}

Aynı şey çözülmedi:

class B
{
    static void Main(string[] a)
    {            
        string[] n = Console.ReadLine().Split(' ');
        string o = "";
        int j, i = j = 0;
        for(; j < n.Length;j++)
        {
            int s = n[j].Length;

            n[j] = ((s<4) ? n[j] : "" + n[j][0] + (s - 2) + n[j][s - 1]) + " ";
            o += n[j];
            for (; i < j; i++)
            {
                if (n[j] == n[i]) { o = "A7s R4t"; j=n.Length;}
            }                              
        }
        Console.WriteLine(o);
    }
}

Teşekkürler beyler!


PPCG'ye Hoşgeldiniz! c:
Deusovi

2

Perl, 131 120 bayt

-pAnahtarı kullanmak için bir bayt ekledim :

s/\B(\w+)(\w)/length($1)."$2_$1"/ge;$_="A7s R4t\n"if/(\w\d+\w)(\w+)\b.*\1(?!\2)/;s/_\w+//g;s/I1\w/\l$&/g;s/l1\w/\u$&/g;

açıklama

# Replace internal letters with count, but keep them around for the next test.
s/\B(\w+)(\w)/length($1)."$2_$1"/ge;
# Detect ambiguous result
$_ = "A7s R4t\n" if
    # Use negative look-ahead assertion to find conflicts
    /(\w\d+\w)(\w+)\b.*\1(?!\2)/;
# We're done with the internal letters now
s/_\w+//g;
# Transform case of initial 'I' and 'l', but only before '1'
s/I1\w/\l$&/g;
s/l1\w/\u$&/g;

Doğru olup olmadığından emin değilim, ancak “like” deki “l” ifadesinin “l2e” ye dönüştüğünde büyük harfle yazılmamasını bekledim.
manatwork

Sadece birkaç vaka test edildi, ancak işe yarıyor gibi görünüyor: s/(\w)(\w+)(\w)/$1.length($2)."$3_$2"/ges/\B(\w+)(\w)/length($1)."$2_$1"/ge.
manatwork

Teşekkürler, @manatwork. Caseswap gereksinimini daha [Il]önce gözden kaçırdım 1- birkaç bayt da kaydettim!
Toby Speight

1

JavaScript (ES6), 165 bayt

s=>(r=s.replace(/\S+/g,w=>(m=w.length-2)<2?w:(i=d.indexOf(n=((m+s)[0]<2&&{I:"i",l:"L"}[w[0]]||w[0])+m+w[m+1]))>=0&d[i+1]!=w?v=0:d.push(n,w)&&n,v=d=[]),v?r:"A7s R4t")

açıklama

s=>(                         // s = input string
  r=s.replace(               // r = result of s with words replaced by numeronyms
    /\S+/g,                  // match each word
    w=>                      // w = matched word
      (m=w.length-2)         // m = number of characters in the middle of the word
        <2?w:                // if the word length is less than 4 leave it as it is
      (i=d.indexOf(          // check if this numeronym has been used before
        n=                   // n = numeronymified word
          ((m+s)[0]<2&&      // if the number starts with 1 we may need to replace
            {I:"i",l:"L"}    //     the first character with one of these
              [w[0]]||w[0])+ // return the replaced or original character
          m+w[m+1]
      ))>=0&d[i+1]!=w?       // set result as invalid if the same numeronym has been
        v=0:                 //     used before with a different word
      d.push(n,w)&&n,        // if everything is fine return n and add it to the list
    v=                       // v = true if result is valid
      d=[]                   // d = array of numeronyms used followed by their original word
  ),
  v?r:"A7s R4t"              // return the result
)

Ölçek


1

JavaScript ES6, 162

w=>(v=(w=w.split` `).map(x=>(l=x.length-2+'')>1?((l[0]>1||{I:'i',l:'L'})[x[0]]||x[0])+l+x[-~l]:x)).some((a,i)=>v.some((b,j)=>a==b&w[i]!=w[j]))?'A7s R4t':v.join` `

Daha az golf

// Less golfed
f=w=>{
  w = w.split` ` // original text splitted in words
  v = w.map(x=> { // build modified words in array v

    l = x.length - 2 // word length - 2
    if (l > 1) // if word length is 4 or more
    {
      a = x[0] // get first char of word
      l = l+'' // convert to string to get the first digit
      m = l[0] > 1 || {I:'i', l:'L'} // only if first digit is 1, prepare to remap I to i and l to L
      a = m[a] || a // remap
      return a + l + x[-~l] // note: -~ convert back to number and add 1
    }
    else
      return x // word unchanged
  })
  return v.some((a,i)=>v.some((b,j)=>a==b&w[i]!=w[j])) // look for equals Numeronyms on different words
  ? 'A7s R4t' 
  : v.join` `
}  

Ölçek


1

Python 2, 185 bayt

d={}
r=''
for w in input().split():
 l=len(w);x=(w[0]+`l-2`+w[-1]).replace('l1','L1').replace('I1','i1')
 if l<4:x=w
 if d.get(x,w)!=w:r='A7s R4t';break
 d[x]=w;r+=x+' '
print r.strip()

1

Python 3, 160

Bu aramaların yerine geçmek için iyi bir yol bulmak isterim.

def f(a):y=[(x,(x[0]+str(len(x)-2)+x[-1]).replace('l1','L1').replace('I1','i1'))[len(x)>3]for x in a.split()];return('A7s R4t',' '.join(y))[len(set(y))==len(y)]

Bazı test durumlarında:

assert f('Billy goats gruff') == 'B3y g3s g3f'
assert f('Programming Puzzles & Code Golf') == 'P9g P5s & C2e G2f'
assert f('Internationalization or InternXXXXXalization') == 'A7s R4t'

1

Faktör, 48 35 bayt, rakipsiz

Yığında devam eden, aslında göz ardı etmeyi başardığım gerçekten sinir bozucu zor gereksinimleri teknik olarak karşılamayan bir lambda .

[ " " split [ a10n ] map " " join ]

englishKelime dağarcığını kullanır .

Veya, a10nkitaplık kelimesini satır içine alırsak , 131 bayt (otomatik içe aktarma ile):

: a ( b -- c ) " " split [ dup length 3 > [ [ 1 head ] [ length 2 - number>string ] [ 1 tail* ] tri 3append ] when ] map " " join ;

Bu, i / L öğelerini ve A7s R4t'yi ele alıyor mu?
Robert Fraser

@RobertFraser Eminim, bu dakika bir Factor derleyicisinde değilim; Ben geçerken geçen ünite testlerini ekleyeceğim. : D
kedi

Evet, gereksinimler için üzgünüm. Soruyu bitirdikten bir hafta sonra, "oh hayır, ne yaptım" gibiydim ama çok geçti. Ayrı bir meydan okuma olarak daha basit bir sürüm yapabilirim.
mbomb007
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.