Numeronyme oder N8s?

10

Ein Numeronym (auch als "numerische Kontraktion" bezeichnet) ist, wenn ein Wort mit Zahlen gekürzt wird. Eine übliche Kontraktionsmethode besteht darin, die Länge des ersetzten Teilstrings zu verwenden, um alle bis auf das erste und das letzte Zeichen zu ersetzen. Verwenden Sie beispielsweise i18nanstelle von internationalizationoder L10nanstelle vonlocalization . (Das Lwird groß geschrieben, da ein Kleinbuchstabe dem zu ähnlich sieht 1.)

Natürlich können mehrere Wörter in derselben Phrase dieselbe abgekürzte Form haben. Ihre Aufgabe besteht also darin, eine Gruppe von Wörtern in ihre Numeronyme umzuwandeln. Falls es verschiedene Wörter mit demselben Numeronym gibt, sollte Ihr Programm eine geben Ergebnis von A7s R4t, kurz für Ambiguous Result(ja, ich weiß, dass dieses Ergebnis selbst ein mehrdeutiges Ergebnis ist.)

Regeln:

  • Verwenden Sie ein Programm oder eine Funktion und drucken Sie das Ergebnis aus oder geben Sie es zurück.
  • Die Eingabe erfolgt als einzelne Zeichenfolge.
  • Die Ausgabe besteht aus einer einzelnen Zeichenfolge von durch Leerzeichen getrennten Wörtern.
  • Ihr Programm muss keine Wörter mit der Länge 3 konvertieren und sollte keine kürzeren Wörter konvertieren.
  • Wenn ein l(Kleinbuchstabe) vor einem 1(Eins) auftreten würde , sollte es in Großbuchstaben geschrieben werden.
  • Wenn ein I(Großbuchstaben) vor einem 1(Eins) auftreten würde , sollte es in Kleinbuchstaben geschrieben werden.
  • Die Eingabe erfolgt über ASCII und Leerzeichen. Wörter werden durch Leerzeichen getrennt.
  • Der kürzeste Code gewinnt.

Beispiele:

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

Bearbeiten: Wenn jemand die Referenz nicht bekam: Danke für die Frau

mbomb007
quelle
Kann die Eingabe auch Zahlen enthalten? Wenn ja, ist ein Eingang l1werden L1als oder Aufenthalt l1?
Türknauf
Ich nehme an der Betonung auf verschiedenen , das example examplewäre e5e e5e, aber es wäre gut , einen Testfall einschließen , die diese abdeckt.
Peter Taylor
Testfälle für beide Fragen ( 2B or not 2Bund danach)
hinzugefügt

Antworten:

1

J, 92 Bytes

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

Eine lange Kette zusammengesetzter Anrufe. Der erste Teil ist nur eine Gabelung: ein Literal joinstringund eine Funktion (in J 1 (10 + +) 2ist (10 + (1 + 2))). Der zweite Teil ist die Funktion. Die beiden rplcAufrufe sollen die E / A ersetzen, wenn sie verwechselt werden könnten. &ist Komposition und Zusammensetzen eines Operators mit einem Wert curies. ( 3&+gibt also eine Funktion an, die erwartet, dass das 2. Argument hinzugefügt wird). Schließlich ist der letzte Teil die Funktion, die den ersten, die Länge 2 (zusammengesetzt mit Stringifizierung) und den letzten übernimmt. Das &>&;:Bit am Ende setzt diese Funktion (die auf jedes Argument angewendet werden sollte) auf >(Unboxing) zusammen, da ;:(geteilte Wörter) eine Boxliste zurückgibt (so dass jedes Element eine andere Länge haben kann).

Beispiel:

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

Ohne diesen nervigen $REPLACEAnruf, der nicht Teil des Standards ist, wären dies MUMPS, die den alten Standards entsprechen. Die Neuimplementierung in reinem M dauert gut 80 Bytes, also bin ich diesen Weg nicht gegangen.

Der Einstiegspunkt ist $$z("your string here"), der zurückkehrt "y2r s4g h2e"und so weiter.

senshin
quelle
3
Könnten Sie vielleicht auf die Sprache verlinken? Ich habe noch nichts davon gehört.
mbomb007
Ich meine, es ist die Sache, die auftaucht, wenn Sie danach googeln ( docs.intersystems.com/cache20152/csp/docbook/… ) - eine proprietäre Variante von MUMPS.
Senshin
3

C #, 280 274 Bytes

Zum ersten Mal hier Golfer! Ich habe es in letzter Zeit genossen, diese zu lesen, und deshalb dachte ich, ich könnte einige selbst ausprobieren! Wahrscheinlich nicht die beste Lösung, aber na ja!

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

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

Danke Leute!

SkyPharaoh
quelle
Willkommen bei PPCG! c:
Deusovi
2

Perl, 131 120 Bytes

Ich habe ein Byte für die Verwendung des -pSchalters hinzugefügt :

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;

Erläuterung

# 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
quelle
Ich bin mir nicht sicher, ob dies korrekt ist, aber ich habe erwartet, dass das "l" in "like" nicht großgeschrieben wird, wenn es in "l2e" umgewandelt wird, da nicht "1" folgt.
Manatwork
Nur ein paar Fälle getestet, scheinen aber zu funktionieren: s/(\w)(\w+)(\w)/$1.length($2)."$3_$2"/ges/\B(\w+)(\w)/length($1)."$2_$1"/ge.
Manatwork
Danke, @manatwork. Ich habe die Anforderung zum Fallwechsel [Il]erst vorher übersehen 1- auch ein paar Bytes gespart!
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")

Erläuterung

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
)

Prüfung

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

Weniger Golf gespielt

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

Prüfung

edc65
quelle
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
quelle
1

Python 3, 160

Ich würde gerne einen guten Weg finden, um diese Ersetzungsaufrufe zu ersetzen.

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

Mit einigen Testfällen:

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

Faktor, 48 35 Bytes, nicht konkurrierend

Es ist ein Lambda, das auf dem Stapel liegt und technisch nicht den wirklich ärgerlich harten Anforderungen entspricht, die ich ursprünglich übersehen habe.

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

Verwendet den englishWortschatz.

Oder, wenn wir das a10nBibliothekswort einbinden, dann 131 Bytes (mit automatischen Importen):

: a ( b -- c ) " " split [ dup length 3 > [ [ 1 head ] [ length 2 - number>string ] [ 1 tail* ] tri 3append ] when ] map " " join ;
Katze
quelle
Behandelt dies das I / L-Zeug und den A7s R4t?
Robert Fraser
@RobertFraser Ich bin mir sicher, dass dies der Fall ist, obwohl ich momentan nicht bei einem Factor-Compiler bin. Ich werde bestandene Unit-Tests hinzufügen, wenn ich es bin. : D
Katze
Ja, entschuldigen Sie die Anforderungen. Eine Woche nachdem ich die Frage beendet hatte, sagte ich: "Oh nein, was habe ich getan?", Aber es war zu spät. Ich könnte eine einfachere Version als separate Herausforderung machen.
mbomb007