Numeronimy lub N8?

10

Numeronym (znany również jako „skurcz numerycznego”) jest, gdy słowo jest skrócony za pomocą liczb. Powszechną metodą skurczu jest użycie długości zastąpionego podciągu do zastąpienia wszystkich znaków oprócz pierwszego i ostatniego. Na przykład użyj i18nzamiast internationalizationlub L10nzamiastlocalization . ( LWielkie litery są pisane wielką literą, ponieważ wyglądają zbyt podobnie do 1.)

Oczywiście kilka słów w tej samej frazie może mieć tę samą skróconą formę, więc Twoim zadaniem jest konwersja grupy słów na ich numeronimy lub w przypadku, gdy istnieją inne słowa o tym samym numerze, twój program powinien podać wynik A7s R4t, skrót od Ambiguous Result(tak, wiem, że sam ten wynik jest wynikiem niejednoznacznym).

Zasady:

  • Użyj programu lub funkcji i wydrukuj lub zwróć wynik.
  • Dane wejściowe są traktowane jako pojedynczy ciąg.
  • Dane wyjściowe to pojedynczy ciąg słów rozdzielanych spacjami.
  • Twój program nie musi konwertować słów o długości 3 i nie powinien konwertować krótszych słów.
  • Jeśli lprzed 1(jednym) wystąpi (mała litera ), powinna być wielka.
  • Jeśli I(wielkie) oko wystąpi przed 1(jednym), powinno być wykonane małymi literami.
  • Dane wejściowe będą drukowalne ASCII i spacje. Słowa są oddzielone spacjami.
  • Najkrótszy kod wygrywa.

Przykłady:

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

Edycja: Jeśli ktoś nie dostał referencji: Thnks fr th Mmrs

mbomb007
źródło
Czy dane wejściowe mogą również zawierać liczby? Jeśli tak, czy dane wejściowe l1stają się L1lub pozostają jako l1?
Klamka
Przypuszczam, ze szczególnym naciskiem na inny , który example examplebyłby e5e e5e, ale dobrze byłoby, aby to przypadek testowy, który obejmuje ten.
Peter Taylor,
Dodano przypadki testowe dla obu twoich pytań ( 2B or not 2Bi później.)
mbomb007

Odpowiedzi:

1

J, 92 bajty

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

Długi łańcuch złożonych połączeń. Pierwsza część to tylko rozwidlenie: literał joinstringi funkcja (w J 1 (10 + +) 2jest (10 + (1 + 2))). Druga część to funkcja. Dwa rplcwezwania mają zastąpić I / l, gdy można je pomylić. &to kompozycja i komponowanie operatora z curry wartości. ( 3&+daje więc funkcję, która oczekuje, że drugi argument zostanie dodany). Wreszcie ostatnia część jest funkcją, która przyjmuje pierwszą, długość-2 (złożoną ze strunizacji) i ostatnią. &>&;:nieco na końcu komponuje tej funkcji (które powinny być stosowane do każdego argumentu) do >(unboxing), ponieważ ;:(Split słowa) zwraca listę box (tak, że każdy element może mieć inną długość).

przykład:

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

Caché ObjectScript , 231 bajtów

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"

Byłby to MUMPS zgodny z dobrymi standardami, gdyby nie to nieznośne $REPLACEwezwanie, które nie jest częścią standardu. Ponowne wdrożenie go w czystym M zajmuje dobre 80-bajtowe bajty, więc nie poszedłem tą drogą.

Punktem wejścia jest $$z("your string here"), który powraca "y2r s4g h2e"i tak dalej.

senshin
źródło
3
Czy możesz podać link do języka? Nie słyszałem o tym.
mbomb007,
Chodzi mi o to, że pojawia się to, gdy go szukasz w Google ( docs.intersystems.com/cache20152/csp/docbook/… ) - zastrzeżony smak MUMPS.
senshin
3

C #, 280 274 bajtów

Pierwszy golfista tutaj! Ostatnio lubię je czytać, więc pomyślałem, że sam mogę je wypróbować! Prawdopodobnie nie najlepsze rozwiązanie, ale 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);}}

Ta sama rzecz bez golfa:

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

Dzięki chłopaki!

SkyPharaoh
źródło
Witamy w PPCG! c:
Deusovi
2

Perl, 131 120 bajtów

Dodałem bajt do używania -pprzełącznika:

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;

Wyjaśnienie

# 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
źródło
Nie jestem pewien, czy jest poprawny, ale spodziewałem się, że litera „l” w „lubię” nie będzie pisana wielkimi literami po przekształceniu w „l2e”, ponieważ nie następuje po niej „1”.
manatwork,
Przetestowano tylko kilka przypadków, ale wydają się działać: s/(\w)(\w+)(\w)/$1.length($2)."$3_$2"/ges/\B(\w+)(\w)/length($1)."$2_$1"/ge.
manatwork,
Dzięki, @manatwork. Zlekceważyłem wymóg zamiany skrzynek [Il]tylko wcześniej 1- zaoszczędziłem też kilka bajtów!
Toby Speight,
1

JavaScript (ES6), 165 bajtów

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

Wyjaśnienie

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
)

Test

użytkownik 81655
źródło
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` `

Mniej golfa

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

Test

edc65
źródło
1

Python 2, 185 bajtów

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
źródło
1

Python 3, 160

Chciałbym znaleźć dobry sposób na zastąpienie tych połączeń zastępczych.

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

W przypadku niektórych przypadków testowych:

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
źródło
1

Współczynnik, 48 35 bajtów, niekonkurujący

To lambda, która wchodzi na stos, która technicznie nie spełnia naprawdę irytująco trudnych wymagań, które pierwotnie udało mi się przeoczyć.

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

Wykorzystuje englishsłownictwo.

Lub, jeśli wstawimy a10nsłowo biblioteki, to 131 bajtów (z automatycznym importem):

: a ( b -- c ) " " split [ dup length 3 > [ [ 1 head ] [ length 2 - number>string ] [ 1 tail* ] tri 3append ] when ] map " " join ;
kot
źródło
Czy to obsługuje elementy i / L i A7s R4t?
Robert Fraser
@RobertFraser Jestem pewien, że tak, choć w tej chwili nie jestem przy kompilatorze Factor; Dodam testy jednostkowe, kiedy będę. : D
cat
Tak, przepraszam za wymagania. Tydzień po tym, jak skończyłem pytanie, pomyślałem: „nie, co ja zrobiłem”, ale było już za późno. Mogę stworzyć prostszą wersję jako osobne wyzwanie.
mbomb007