Nama atau N8?

10

Sebuah numeronim (juga dikenal sebagai "kontraksi numerik") adalah ketika sebuah kata disingkat menggunakan angka. Metode kontraksi umum adalah dengan menggunakan panjang substring yang diganti untuk mengganti semua kecuali karakter pertama dan terakhir. Misalnya, gunakan i18nsebagai ganti internationalization, atau L10nalih-alihlocalization . (Huruf Lkapital karena huruf kecil terlihat terlalu mirip dengan 1.)

Tentu saja, beberapa kata dalam frasa yang sama mungkin memiliki bentuk singkatan yang sama, jadi tugas Anda adalah mengonversi sekelompok kata menjadi angka-angka mereka, atau jika ada beberapa kata yang berbeda dengan angka-angka yang sama, program Anda harus memberikan hasil A7s R4t, kependekan dari Ambiguous Result(ya, saya tahu bahwa hasil ini sendiri merupakan hasil yang ambigu.)

Aturan:

  • Gunakan program atau fungsi, dan cetak atau kembalikan hasilnya.
  • Input diambil sebagai string tunggal.
  • Outputnya adalah string tunggal dari kata-kata yang dibatasi ruang.
  • Program Anda tidak perlu mengonversi kata dengan panjang 3, dan tidak boleh mengonversi kata yang lebih pendek.
  • Jika l(huruf kecil) terjadi sebelum 1(satu), harus dibuat huruf besar.
  • Jika I(huruf besar) akan terjadi sebelum 1(satu), itu harus dibuat huruf kecil.
  • Input akan dicetak ASCII dan spasi. Kata-kata dipisahkan oleh spasi.
  • Kode terpendek menang.

Contoh:

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

Sunting: Jika ada yang tidak mendapatkan referensi: Thnks fr th Mmrs

mbomb007
sumber
Bisakah input berisi angka juga? Jika demikian, apakah input l1menjadi L1atau tetap sama l1?
Gagang Pintu
Saya kira dari penekanan pada berbeda yang example exampleakan e5e e5e, tapi itu akan baik untuk menyertakan kasus uji yang mencakup ini.
Peter Taylor
Menambahkan kasus uji untuk kedua pertanyaan Anda ( 2B or not 2Bdan setelah.)
mbomb007

Jawaban:

1

J, 92 byte

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

Rantai telepon yang tenang. Bagian pertama hanyalah garpu: literal joinstring,, dan fungsi (dalam J, 1 (10 + +) 2adalah (10 + (1 + 2))). Bagian kedua adalah fungsinya. Dua rplcpanggilan itu untuk menggantikan I / l ketika mereka bisa bingung. &adalah komposisi, dan menyusun operator dengan kari nilai. (sehingga 3&+memberikan fungsi yang mengharapkan argumen ke-2 ditambahkan). Akhirnya, bagian terakhir adalah fungsi yang mengambil yang pertama, panjang-2 (tersusun dengan pengencangan), dan yang terakhir. yang &>&;:sedikit di akhir menyusun fungsi ini (yang harus diterapkan untuk setiap argumen) ke >(unboxing), karena ;:(kata split) mengembalikan daftar kotak (sehingga setiap elemen dapat memiliki panjang yang berbeda).

contoh:

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

Caché ObjectScript , 231 byte

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"

Ini akan menjadi MUMPS yang memenuhi standar yang baik jika bukan karena $REPLACEpanggilan sial itu , yang bukan bagian dari standar. Mengimplementasikan ulang dalam M murni membutuhkan 80ish byte yang baik, jadi saya tidak turun rute itu.

Titik masuknya adalah $$z("your string here"), yang mengembalikan "y2r s4g h2e", dan sebagainya.

senshin
sumber
3
Mungkinkah Anda menautkan ke bahasa? Saya belum pernah mendengarnya.
mbomb007
Maksud saya, ini adalah hal yang muncul ketika Anda google untuk itu ( docs.intersystems.com/cache20152/csp/docbook/… ) - rasa eksklusif MUMPS.
senshin
3

C #, 280 274 byte

Pegolf pertama kali di sini! Telah menikmati membaca ini akhir-akhir ini dan jadi saya pikir saya mungkin akan mencobanya sendiri! Mungkin bukan solusi terbaik, tapi oh well!

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

Hal yang sama ungolfed:

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

Terima kasih teman-teman!

SkyPharaoh
sumber
Selamat datang di PPCG! c:
Deusovi
2

Perl, 131 120 byte

Saya telah menambahkan byte untuk menggunakan -p sakelar:

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;

Penjelasan

# 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;
Toby Speight
sumber
Tidak yakin apakah itu benar tetapi saya berharap "l" dalam "suka" tidak dikapitalisasi ketika diubah menjadi "l2e", karena tidak diikuti oleh "1".
manatwork
Diuji hanya beberapa kasus, tetapi tampaknya berhasil: s/(\w)(\w+)(\w)/$1.length($2)."$3_$2"/ges/\B(\w+)(\w)/length($1)."$2_$1"/ge.
manatwork
Terima kasih, @manatwork. Saya mengabaikan persyaratan untuk casewap [Il]hanya sebelumnya 1- juga menyimpan beberapa byte!
Toby Speight
1

JavaScript (ES6), 165 byte

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

Penjelasan

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
)

Uji

pengguna81655
sumber
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` `

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

Uji

edc65
sumber
1

Python 2, 185 byte

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()
TFeld
sumber
1

Python 3, 160

Saya ingin menemukan cara yang baik untuk mengganti panggilan pengganti itu.

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

Dengan beberapa kasus uji:

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'
Morgan Thrapp
sumber
1

Factor, 48 35 byte, tidak bersaing

Ini adalah lambda yang ada di tumpukan, yang secara teknis tidak memenuhi persyaratan yang sangat menyebalkan yang awalnya saya abaikan.

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

Menggunakan englishkosakata.

Atau, jika kami sebaris a10nkata perpustakaan, maka 131 byte (dengan impor otomatis):

: a ( b -- c ) " " split [ dup length 3 > [ [ 1 head ] [ length 2 - number>string ] [ 1 tail* ] tri 3append ] when ] map " " join ;
kucing
sumber
Apakah ini menangani hal-hal i / L dan A7s R4t?
Robert Fraser
@ Roberttraser Saya yakin itu, meskipun saya tidak di kompilator Factor saat ini; Saya akan menambahkan tes unit lulus ketika saya. : D
cat
Ya, maaf tentang persyaratannya. Seminggu setelah saya menyelesaikan pertanyaan, saya seperti "oh tidak, apa yang telah saya lakukan," tetapi sudah terlambat. Saya mungkin membuat versi yang lebih sederhana sebagai tantangan terpisah.
mbomb007