Chữ số hay N8?


10

Một chữ số (còn được gọi là "co rút số") là khi một từ được rút ngắn bằng cách sử dụng các số. Một phương pháp co phổ biến là sử dụng độ dài của chuỗi con được thay thế để thay thế tất cả trừ các ký tự đầu tiên và cuối cùng. Ví dụ, sử dụng i18nthay vì internationalization, hoặc L10nthay vìlocalization . (Chữ Lviết hoa vì chữ thường trông quá giống với 1.)

Tất nhiên, một số từ trong cùng một cụm từ có thể có cùng dạng viết tắt, vì vậy công việc của bạn là chuyển đổi một nhóm từ thành chữ số của chúng hoặc trong trường hợp tồn tại một số từ khác nhau có cùng một chữ số, chương trình của bạn sẽ cung cấp cho kết quả là A7s R4t, viết tắt của Ambiguous Result(vâng, tôi biết rằng kết quả này tự nó là một kết quả mơ hồ.)

Quy tắc:

  • Sử dụng một chương trình hoặc chức năng, và in hoặc trả về kết quả.
  • Đầu vào được lấy dưới dạng một chuỗi.
  • Đầu ra là một chuỗi các từ được phân tách bằng dấu cách.
  • Chương trình của bạn không cần chuyển đổi các từ có độ dài 3 và không nên chuyển đổi các từ ngắn hơn.
  • Nếu một l(chữ thường chữ thường) sẽ xuất hiện trước một 1(một), thì nó nên được viết hoa.
  • Nếu một I(chữ hoa) sẽ xuất hiện trước một 1(một), thì nó nên được viết thường.
  • Đầu vào sẽ có thể in ASCII và dấu cách. Các từ được phân cách bằng dấu cách.
  • Mã ngắn nhất sẽ thắng.

Ví dụ:

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

Chỉnh sửa: Nếu bất cứ ai không nhận được tài liệu tham khảo: Thnks fr th Mmrs


Đầu vào có thể chứa số là tốt? Nếu vậy, một đầu vào l1trở thành L1hoặc ở lại là l1?
Doorknob

Tôi đoán từ sự nhấn mạnh vào khác nhauexample examplesẽ là e5e e5e, nhưng nó sẽ là tốt để bao gồm một trường hợp thử nghiệm trong đó bao gồm này.
Peter Taylor

Đã thêm các trường hợp kiểm tra cho cả hai câu hỏi của bạn ( 2B or not 2Bvà sau đó.)
mbomb007

Câu trả lời:


1

J, 92 byte

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

Một chuỗi looong của các cuộc gọi sáng tác. Phần đầu tiên chỉ là một ngã ba: một nghĩa đen joinstringvà một hàm (trong J, 1 (10 + +) 2(10 + (1 + 2))). Phần thứ hai là chức năng. Hai rplccuộc gọi là để thay thế I / l khi chúng có thể bị nhầm lẫn. &là thành phần và soạn thảo một toán tử với các dòng điện giá trị. (vì vậy 3&+cung cấp một hàm dự kiến ​​đối số thứ 2 sẽ được thêm vào). Cuối cùng, phần cuối cùng là hàm lấy phần đầu tiên, độ dài-2 (bao gồm chuỗi hóa) và phần cuối. các &>&;:chút ở cuối soạn chức năng này (mà nên được áp dụng cho tất cả các đối số) đến >(unboxing), bởi vì ;:(từ split) trả về một danh sách đóng hộp (vì vậy mà mọi phần tử có thể có chiều dài khác nhau).

thí dụ:

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

4

Đối tượng bộ nhớ cache , 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"

Đây sẽ là MUMPS tuân thủ tiêu chuẩn tốt nếu nó không phù hợp với $REPLACEcuộc gọi phiền phức đó, không phải là một phần của tiêu chuẩn. Việc thực hiện lại nó trong M thuần mất 80 byte tốt, vì vậy tôi đã không đi theo tuyến đường đó.

Điểm vào là $$z("your string here"), trả về "y2r s4g h2e", v.v.


3
Có lẽ bạn có thể liên kết với ngôn ngữ? Tôi chưa nghe nói về nó.
mbomb007

Ý tôi là, đó là thứ xuất hiện khi bạn google cho nó ( docs.intersystems.com/cache20152/csp/docbook/ trộm ) - một hương vị độc quyền của MUMPS.
Senshin

3

C #, 280 274 byte

Người chơi gôn lần đầu ở đây! Gần đây tôi rất thích đọc những thứ này và vì vậy tôi nghĩ rằng tôi có thể tự mình thử một số thứ! Có lẽ không phải là giải pháp tốt nhất, nhưng oh tốt!

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

Điều tương tự vô căn cứ:

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

Cảm ơn các bạn!


Chào mừng đến với PPCG! c:
Deusovi

2

Perl, 131 120 byte

Tôi đã thêm một byte để sử dụng công -ptắc:

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;

Giải trình

# 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;

Không chắc là có đúng hay không nhưng tôi đã hy vọng rằng những người yêu thích trò chơi này sẽ không được viết hoa khi chuyển đổi thành Lọe, vì không được theo sau bởi 1 1.
manatwork 9/12/2015

Chỉ thử nghiệm một vài trường hợp, nhưng dường như có tác dụng: s/(\w)(\w+)(\w)/$1.length($2)."$3_$2"/ges/\B(\w+)(\w)/length($1)."$2_$1"/ge.
manatwork

Cảm ơn, @manatwork. Tôi đã bỏ qua yêu cầu để xử lý các trường hợp [Il]trước đó 1- cũng đã lưu một vài 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")

Giải trình

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
)

Kiểm tra


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

Ít chơi gôn

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

Kiểm tra


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

1

Con trăn 3, 160

Tôi muốn tìm một cách tốt để thay thế các cuộc gọi thay thế.

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

Với một số trường hợp thử nghiệm:

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

Yếu tố, 48 35 byte, không lọc

Đó là một lambda đi trên ngăn xếp, về mặt kỹ thuật không đáp ứng các yêu cầu thực sự khó chịu mà ban đầu tôi đã bỏ qua.

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

Sử dụng englishtừ vựng.

Hoặc, nếu chúng tôi nội tuyến a10ntừ thư viện, thì 131 byte (có nhập tự động):

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

Điều này có xử lý các công cụ i / L và A7s R4t không?
Robert Fraser

@RobertFraser Tôi chắc chắn là có, mặc dù tôi không ở trình biên dịch Factor vào phút này; Tôi sẽ thêm các bài kiểm tra đơn vị khi tôi. : D
mèo

Vâng, xin lỗi về các yêu cầu. Một tuần sau khi tôi hoàn thành câu hỏi, tôi như "ồ không, tôi đã làm gì", nhưng đã quá muộn. Tôi có thể tạo một phiên bản đơn giản hơn như một thử thách riêng biệt.
mbomb007
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.