Numeronyms o N8s?

10

Un numeronym (también conocido como "contracción numérica") es cuando una palabra se acorta usando números. Un método de contracción común es utilizar la longitud de la subcadena reemplazada para reemplazar todos los caracteres excepto el primero y el último. Por ejemplo, use en i18nlugar de internationalizationo en L10nlugar delocalization . (El Lestá en mayúscula ya que uno en minúscula se parece demasiado al 1.)

Por supuesto, varias palabras en la misma frase pueden tener la misma forma abreviada, por lo que su trabajo es convertir un grupo de palabras a sus numeronyms, o en el caso de que existan algunas palabras diferentes con el mismo numeronym, su programa debe dar un resultado de A7s R4t, abreviatura de Ambiguous Result(sí, sé que este resultado es en sí mismo un resultado ambiguo).

Reglas:

  • Use un programa o función e imprima o devuelva el resultado.
  • La entrada se toma como una sola cadena.
  • La salida es una sola cadena de palabras delimitadas por espacios.
  • Su programa no necesita convertir palabras con longitud 3, y no debe convertir palabras más cortas.
  • Si un l(ell minúsculo) ocurriera antes de un 1(uno), se debe poner en mayúscula.
  • Si un I(ojo en mayúscula) ocurriera antes de un 1(uno), se debe poner en minúscula.
  • La entrada será ASCII y espacios imprimibles. Las palabras están separadas por espacios.
  • El código más corto gana.

Ejemplos:

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

Editar: Si alguien no obtuvo la referencia: Gracias de la Sra.

mbomb007
fuente
¿Puede la entrada contener números también? Si es así, ¿una entrada de l1convertirse L1o permanecer como l1?
Pomo de la puerta
Supongo por el énfasis en lo diferente que example examplesería e5e e5e, pero sería bueno incluir un caso de prueba que cubra esto.
Peter Taylor
Se agregaron casos de prueba para ambas preguntas ( 2B or not 2By posteriores)
Mbomb007

Respuestas:

1

J, 92 bytes

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

Una larga cadena de llamadas compuestas. La primera parte es solo una bifurcación: un literal joinstring, y una función (en J, 1 (10 + +) 2es (10 + (1 + 2))). La segunda parte es la función. Las dos rplcllamadas son para reemplazar el I / l cuando pueden confundirse. &es composición, y componer un operador con un valor curries. (Por lo tanto, 3&+proporciona una función que espera que se agregue el segundo argumento). Finalmente, la última parte es la función que toma la primera, la longitud-2 (compuesta con stringificación) y la última. el &>&;:bit al final compone esta función (que debe aplicarse a cada argumento) a >(unboxing), porque ;:(palabras divididas) devuelve una lista en recuadro (para que cada elemento pueda tener una longitud diferente).

ejemplo:

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

Caché ObjectScript , 231 bytes

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"

Esto sería bueno para MUMPS que cumplen con los estándares si no fuera por esa molesta $REPLACEllamada, que no es parte del estándar. Replegarlo en M puro requiere unos 80 bytes, por lo que no tomé esa ruta.

El punto de entrada es $$z("your string here"), que regresa "y2r s4g h2e", y así sucesivamente.

senshin
fuente
3
¿Podrías quizás vincular al idioma? No he oído hablar de eso.
mbomb007
Quiero decir, es lo que surge cuando buscas en Google ( docs.intersystems.com/cache20152/csp/docbook/… ): un sabor patentado de MUMPS.
senshin
3

C #, 280 274 bytes

Golfista por primera vez aquí! ¡He estado disfrutando de leer esto últimamente, así que pensé que podría probarlo yo mismo! Probablemente no sea la mejor solución, pero ¡bueno!

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

Lo mismo sin golf:

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

¡Gracias chicos!

SkyPharaoh
fuente
Bienvenido a PPCG! c:
Deusovi
2

Perl, 131 120 bytes

He agregado un byte para usar el -pinterruptor:

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;

Explicación

# 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
fuente
No estoy seguro de si es correcto, pero esperaba que la "l" en "me gusta" no se capitalizara cuando se transformara en "l2e", ya que no va seguida de "1".
manatwork
Probado solo un par de casos, pero parece funcionar: s/(\w)(\w+)(\w)/$1.length($2)."$3_$2"/ges/\B(\w+)(\w)/length($1)."$2_$1"/ge.
manatwork
Gracias, @manatwork. Pasé por alto el requisito de cambiar casos [Il]solo antes 1, ¡también guardé un par de bytes!
Toby Speight
1

JavaScript (ES6), 165 bytes

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

Explicación

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
)

Prueba

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

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

Prueba

edc65
fuente
1

Python 2, 185 bytes

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
fuente
1

Pitón 3, 160

Me encantaría encontrar una buena manera de reemplazar esas llamadas de reemplazo.

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

Con algunos casos de prueba:

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
fuente
1

Factor, 48 35 bytes, sin competencia

Es una lambda que va en la pila, que técnicamente no cumple con los requisitos realmente molestos que originalmente logré pasar por alto.

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

Utiliza el englishvocabulario.

O, si incorporamos la a10npalabra de la biblioteca, 131 bytes (con importación automática):

: a ( b -- c ) " " split [ dup length 3 > [ [ 1 head ] [ length 2 - number>string ] [ 1 tail* ] tri 3append ] when ] map " " join ;
gato
fuente
¿Esto maneja las cosas de I / L y A7s R4t?
Robert Fraser
@RobertFraser Estoy seguro de que sí, aunque no estoy en un compilador de Factor en este momento; Agregaré pruebas unitarias aprobadas cuando lo esté. : D
gato
Sí, perdón por los requisitos. Una semana después de terminar la pregunta, dije "oh no, qué he hecho", pero ya era demasiado tarde. Podría hacer una versión más simple como un desafío separado.
mbomb007