숫자 또는 N8?


10

numeronym 단어가 숫자를 사용하여 단축되는 경우 (또한 "수치 수축"로 알려진)입니다. 일반적인 수축 방법은 대체 된 부분 문자열의 길이를 사용하여 첫 번째와 마지막 문자를 제외한 모든 문자를 대체하는 것입니다. 예를 들어 i18n대신 internationalization또는 L10n대신을 사용하십시오localization . 합니다 (이 L받는 하나의 모습도 유사한 소문자 때문에 대문자로 1.)

물론, 같은 문구에서 여러 단어가 같은 약어 형식을 가질 수 있으므로, 단어 그룹을 숫자로 변환하거나 같은 숫자를 가진 다른 단어가있는 경우 프로그램은 의 결과 A7s R4t, 짧음 Ambiguous Result(예,이 결과 자체가 모호한 결과라는 것을 알고 있습니다.)

규칙 :

  • 프로그램이나 기능을 사용하고 결과를 인쇄하거나 반환하십시오.
  • 입력은 단일 문자열로 간주됩니다.
  • 출력은 공백으로 구분 된 단어의 단일 문자열입니다.
  • 프로그램은 길이가 3 인 단어를 변환 할 필요가 없으며 더 짧은 단어를 변환해서는 안됩니다.
  • 이 경우 l(소문자 엘)은 이전에 발생하는 것 1(일), 그것은 대문자해야한다.
  • 는 IF I(대문자 아이)는 이전에 발생하는 것 1(일), 그것은 소문자를해야한다.
  • 입력 가능한 ASCII 및 공백이 입력됩니다. 단어는 공백으로 구분됩니다.
  • 가장 짧은 코드가 승리합니다.

예 :

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

편집 : 누군가 참조를 얻지 못한 경우 : Thnks fr th Mmrs


입력 값에도 숫자가 포함될 수 있습니까? 그렇다면 입력 l1L1그대로 유지 l1됩니까?
Doorknob

나는에 대한 강조에서 추정 다른example examplee5e e5e,하지만이 커버하는 테스트 케이스를 포함하는 것이 좋은 것입니다.
피터 테일러

두 질문 모두에 대한 테스트 사례를 추가했습니다 ( 2B or not 2B후).
mbomb007

답변:


1

J, 92 바이트

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

편성 된 통화의 긴 체인. 첫 번째 부분은 바로 포크입니다 : 리터럴 joinstring및 함수 (J에서는 1 (10 + +) 2is (10 + (1 + 2)))입니다. 두 번째 부분은 기능입니다. 두 rplc호출은 혼란 스러울 때 I / l을 대체해야합니다. &는 구성이며 값 커리가있는 연산자를 구성합니다. (따라서 3&+두 번째 인수가 추가 될 것으로 예상되는 함수를 제공합니다). 마지막으로, 마지막 부분은 첫 번째, 길이 -2 (문자열로 구성) 및 마지막을 취하는 함수입니다. &>&;:끝에 있는 비트는이 함수 (모든 인수에 적용되어야 함)를 >(unboxing)으로 구성합니다. ;:(분할 단어)는 상자 목록을 반환하므로 모든 요소의 길이가 다를 수 있습니다.

예:

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

4

Caché ObjectScript , 231 바이트

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"

성가신 $REPLACE전화가 아니었다면 이는 표준의 일부가 아닌 좋은 표준 준수 MUMPS 일 것 입니다. 순수한 M으로 다시 구현하는 데는 80 바이트가 필요하므로 그 경로를 따르지 않았습니다.

진입 점은 $$z("your string here")을 반환 "y2r s4g h2e"합니다.


3
언어와 연결될 수 있습니까? 나는 그것을 듣지 못했습니다.
mbomb007

내 말은, MUMPS 의 독점적 인 풍미 인 Google 용으로 docs.intersystems.com/cache20152/csp/docbook/… 을 검색 할 때 나타나는 것입니다 .
senshin

3

C #을, 280 274 바이트

여기 처음으로 골퍼! 최근에 이것들을 읽고 즐기기 때문에 나 자신을 시험해 볼 수도 있다고 생각했습니다! 아마도 최선의 해결책은 아니지만 오 잘 될 것입니다!

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

똑같은 것 :

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

고마워요!


PPCG에 오신 것을 환영합니다! c :
Deusovi

2

펄, 131120 바이트

-p스위치 를 사용하기 위해 바이트를 추가했습니다 .

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;

설명

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

정확한지 확실하지 않지만“like”의“l”이“l2e”로 변환 될 때 대문자가되지 않을 것으로 예상했습니다. 그 뒤에“1”이 없습니다.
manatwork

몇 가지 사례 만 테스트했지만 작동하는 것 같습니다 : s/(\w)(\w+)(\w)/$1.length($2)."$3_$2"/ges/\B(\w+)(\w)/length($1)."$2_$1"/ge.
manatwork

감사합니다, @manatwork. 나는 caseswap에 대한 요구 사항을 간과 [Il]전에 만 1- 너무 바이트의 몇 저장!
Toby Speight

1

자바 스크립트 (ES6), 165 바이트

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

설명

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
)

테스트


1

자바 스크립트 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` `

덜 골프

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

테스트


1

파이썬 2, 185 바이트

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

파이썬 3, 160

교체 통화를 대체하는 좋은 방법을 찾고 싶습니다.

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

일부 테스트 사례의 경우 :

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

비경쟁 요소, 48 35 바이트

스택에서 진행되는 람다입니다.이 기술은 원래 간과했던 정말 성가신 어려운 요구 사항을 충족시키지 못합니다 .

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

english어휘를 사용합니다 .

또는 a10n라이브러리 단어를 인라인하면 131 바이트 (자동 가져 오기 포함) :

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

이것이 i / L과 A7s R4t를 처리합니까?
Robert Fraser

@RobertFraser 이번에는 Factor 컴파일러에 있지는 않지만 확실합니다. 나는 지나가는 단위 테스트를 추가 할 것입니다. : D
고양이

예, 요구 사항에 대해 죄송합니다. 질문을 마치고 일주일 후, 나는 "아뇨, 내가 한 일"과 같았지만 너무 늦었습니다. 별도의 도전으로 더 간단한 버전을 만들 수 있습니다.
mbomb007
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.