Le chiffre latin amélioré du cochon César

32

Le problème avec le chiffre César est que les mots résultants sont souvent imprononçables. Le problème avec Pig Latin est qu'il est facile à décoder. Pourquoi ne pas les combiner?

Contribution

Un mot composé des 26 lettres anglaises.

Sortie

Tout d'abord, changez chaque consonne du mot par la consonne suivante de l'alphabet. Donc, b va à c, d va à f et z va à b. Ensuite, changez chaque voyelle en voyelle suivante dans l'alphabet (u va à a). Enfin, seulement si la première lettre du mot est une consonne, déplacez cette lettre à la fin du mot et ajoutez "ay" à la fin du mot.

Exemples:

cat -> evday  
dog -> uhfay   
eel -> iim
  • C'est le , donc le code le plus court l'emporte.
  • L'affaire n'a pas d'importance.
  • Les voyelles qui seront utilisées sont A, E, I, O et U
qazwsx
la source
2
non, mais vous pouvez si vous voulez
qazwsx
6
Bienvenue chez PPCG! Très beau défi, clairement présenté.
Jonathan Allan
6
Cas de test suggéré:z → bay
Arnauld
1
jot ot e wisz opvisitvoph dupdiqv cav o fu puv vjopl ov jimqt xovj vji ecomovz vu qsupuapdi vji xusftvay
Shadow
4
Suggéré cas de test: the → jivay? (Autrement dit, si le mot commence par plusieurs consonnes, ne déplaçons-nous qu'une seule d'entre elles?)
DLosc

Réponses:

3

Stax , 20 octets

ù≥±╘├*Lâ■8O±âΓ║Θæ%º•

Exécuter et déboguer

Explication

Vc:tVv:tBcVc#{sL"ay"+}ML             #Full program, unpacked, implicit input
Vc:t                                 #Push consonants and ring translate input
    Vv:t                             #Push vowels and ring translate input
        BCvc#                        #Push first letter and tail of word, find number 
                                     #of occurrences to consonants
             {sL"ay"+}M              #If truthy (word starts with consonant)
                                     #swap stack, listify, add "ay"
                       L             #Listify stack (combines words that start with vowel)

J'ai parcouru quelques itérations et finalement je suis descendu à 20. Ma solution d'origine était de 53 octets.

Multi
la source
7

Ruby , 96 69 octets

->s{/^[^aeiou]/=~(r=s.tr'zb-yadehinotu','b-zefijopuva')?$'+$&+'ay':r}

Essayez-le en ligne!

Fait amusant du jour: tr () correspond aux chaînes de droite à gauche. J'ai toujours pensé que c'était de gauche à droite.

GB
la source
6

R , 86 85 octets

Manière simple. chartra la propriété charmante et utile qu'il peut spécifier la lettre plages de , ce qui économise quelques octets.

-1 octets en volant les chaînes de traduction de la solution Ruby de @ GB - votez pour!

function(s)sub("^([^aeiou])(.*)","\\2\\1ay",chartr('zb-yadehinotu','b-zefijopuva',s))

Essayez-le en ligne!

J.Doe
la source
5

Java (JDK) , 167 octets

s->{String r="",a="aeiouabcdfghjklmnpqrstvwxyzb",c=s.split("")[0];s=a.indexOf(c)>5?s.substring(1)+c+"ux":s;for(var d:s.split(""))r+=a.charAt(a.indexOf(d)+1);return r;}

Essayez-le en ligne!

Crédits

Olivier Grégoire
la source
1
168 octets
Kevin Cruijssen
4

05AB1E , 21 octets

žMDÀ‡žNDÀ‡¬žNsåiÀ…ÿay

Essayez-le en ligne!

Explication

žMDÀ‡                   # replace each vowel with the next vowel in the alphabet
     žNDÀ‡              # replace each consonant with the next consonant in the alphabet
          ¬žNsåi        # if the first letter is a consonant
                À…ÿay   # rotate the word left and add "ay"
Emigna
la source
4

Node.js 10.9.0 , 121 116 octets

Attend la chaîne d'entrée en minuscules.

s=>(v=n=>2130466>>n&1)((a=Buffer(s).map(n=>(g=i=>v(n=n%61?n+1:97)^i?g(i):n)(v(n))))[0],a+='')?a:a.slice(1)+a[0]+'ay'

Essayez-le en ligne!

Identifier les voyelles

v

2130466 = 000001000001000001000100010
               ^     ^     ^   ^   ^
          zyxwvutsrqponmlkjihgfedcba-

Et fait:

(2130466 >> n) & 1

n

Soit shiftCount le résultat du masquage de tous, sauf les 5 bits de rnum les moins significatifs , c'est-à-dire le calcul de rnum & 0x1F.

Commenté

s =>                      // s = input string
  ( v = n =>              // v = helper function taking n = ASCII code in [97..122]
    2130466 >> n & 1      //     and returning 1 if the corresponding character is a vowel
  )                       //     or 0 otherwise (see the previous paragraph)
  (                       // this statement will ultimately invoke v on a[0]
    ( a = Buffer(s)       //   convert s to a Buffer, holding ASCII codes
      .map(n =>           //   for each ASCII code n in there:
        ( g = i =>        //     g = recursive function taking i = vowel flag
          v(              //       update n and invoke v on the new value:
            n = n % 61 ?  //         if n is less than 122 (meaning less than 'z'):
              n + 1       //           increment n
            :             //         else:
              97          //           wrap around by setting n to 97 (meaning 'a')
          ) ^ i ?         //       if v(n) is not equal to i:
            g(i)          //         do recursive calls until it is
          :               //       else:
            n             //         stop recursion and return the new n
        )(v(n))           //     initial call to g with i = v(n)
      )                   //   end of map()
    )[0],                 //   invoke v on a[0]
    a += ''               //   coerce the updated Buffer back to a string
  ) ?                     // if a[0] is a vowel:
    a                     //   return the string as-is
  :                       // else:
    a.slice(1) + a[0]     //   move the leading consonant to the end
    + 'ay'                //   and append the 'ay' suffix
Arnauld
la source
4

Python 2 , 153 121 110 99 91 octets

lambda s:[s[1:]+s[0]+"ux",s][s[0]in'aeiou'].translate(8*".ecdfighjoklmnpuqrstvawxyzb.....")

Essayez-le en ligne!

8 octets rasés grâce à une suggestion de Matthew Jensen

Chas Brown
la source
Vous pouvez économiser 8 octets en utilisant la fonction string.translate ():lambda s:[s[1:]+s[0]+"ux",s][s[0]in'aeiou'].translate(8*".ecdfighjoklmnpuqrstvawxyzb.....")
Matthew Jensen
@MatthewJensen Clever! Habituellement j'évite translateen Python 2 ...
Chas Brown
Par coïncidence, cela fonctionne maintenant aussi pour les majuscules
Matthew Jensen
3

T-SQL, 169 octets

SELECT IIF(CHARINDEX(LEFT(a,1),'aeiou')=0,SUBSTRING(a,2,99)+LEFT(a,1)+'ay',a)FROM
(SELECT TRANSLATE(v,'aeioubcdfghjklmnpqrstvwxyz','eiouacdfghjklmnpqrstvwxyzb')a FROM t)s

L'entrée se fait via une table préexistante, selon nos normes IO .

Effectue la substitution de caractères en premier, en utilisant le ( nouveau dans SQL 2017 )TRANSLATE , puis vérifie le premier caractère.

Long ennuyeux, principalement en raison de la longueur des mots clés SQL.

BradC
la source
3

Haskell , 102 97 octets

h(c:r)|elem c"aeiou"=c:r|True=r++c:"ay"
f s=h["ecdfighjoklmnpuqrstvawxyzb"!!(fromEnum y-97)|y<-s]

Essayez-le en ligne!

Curtis Bechtel
la source
2

Retina 0.8.2 , 50 octets

T`uo`aei\oub-df-hj-np-tv-zb
^([^aeiou])(.*)
$2$1ay

Essayez-le en ligne! Le lien inclut des cas de test. Approche similaire à la réponse R. Explication:

T`uo`aei\oub-df-hj-np-tv-zb

ofait référence à l'autre ensemble, c'est-à-dire aei\oub-df-hj-np-tv-zbqui se développe en aeioubcdfghjlkmnpqrstvwxyzb, se uodéveloppe donc en uaeioubcdfghjlkmnpqrstvwxyzb. Il en résulte la translittération suivante:

uaeioubcdfghjlkmnpqrstvwxyzb
aeioubcdfghjlkmnpqrstvwxyzb

Les seconds uet bsont ignorés car ils ne peuvent jamais être mis en correspondance, donc cela fournit le chiffrement souhaité. (Notez que dans Retina 1, vous pouvez bien sûr utiliser vau lieu de aei\oupour une économie de 5 octets.)

^([^aeiou])(.*)
$2$1ay

Si la première lettre n'est pas une voyelle, faites-la pivoter jusqu'à la fin et suffixez ay.

Neil
la source
2

Gelée , 24 octets

,ṙ¥1y
ØẹçØḄçṙḢe©ØḄƊ®⁾ayx

Essayez-le en ligne!

1 octet enregistré grâce à Jonathan Allan (utilisez la syntaxe à deux caractères plutôt que des guillemets).

M. Xcoder
la source
Malheureusement, version beaucoup plus saine et non sournoise ( équivalent sournois plus court de 1 octet ). Je ne pourrai pas mettre à jour cela dans les prochaines heures, mais faites remarquer si vous trouvez des améliorations.
M. Xcoder
Utilisez ⁾aypour un octet. Le ©pourrait aller après epuisque c'est ce que vous stockez. Je l'ai ØẹØḄ,żṙ€¥1ẎyṙḢe©ØḄƊ®⁾ayẋ.
Jonathan Allan
2

> <> , 94 92 octets

i:0(?v"a"%
2%?!v\~r:5g
a2r}<vr+ad*
ol?!;>4g
ecdfighjoklmnpuqrstvawxyzb
1   1   1     1     1

Essayez-le en ligne!

Edit: sauvé 2 octets en prenant le mod d'entrée 97 plutôt que 32, afin que le dictionnaire puisse commencer au début de la ligne. La version précédente:

i:0(?v84*%
2%?!v\~r:5g
37r}<vr*46*
ol?!;>4g
 ecdfighjoklmnpuqrstvawxyzb
 1   1   1     1     1
Sok
la source
1

Rouge , 149 octets

func[s][c:"aeioua.bcdfghjklmnpqrstvwxyzb"t: copy""foreach p s[append t c/(1
+ index? find c p)]if 7 < index? find c t/1[move t tail t append t"ay"]t]

Essayez-le en ligne!

Comme (presque) toujours, l'entrée la plus longue

Galen Ivanov
la source
1

F # (Mono) , 197 octets

let f(s:string)=
 let a="aeiouabcdfghjklmnpqrstvwxyzb"
 new string(s|>Seq.map(fun c->a.[a.IndexOf(c)+1])|>Seq.toArray)|>(fun x->if a.IndexOf(x.[0])>5 then x.Substring(1)+(string x.[0])+"ay"else x)

Essayez-le en ligne!

Henrik Hansen
la source
1

Perl 5 , 56 octets

y/a-z/ecdfighjok-npuq-tvaw-zb/;s/^([^aeiou])(.*)/$2$1ay/

Essayez-le en ligne!

Hobbs
la source
1
Avez-vous besoin des -s entre cet dou get h?
Neil
@Neil non je ne sais pas. J'ai écrit un programme pour compresser les plages ... et je me suis trompé de logique :) Merci.
hobbs
Normalement, dans de tels cas, vous écrivez <s>58</s> 56 bytesdans l'en-tête et beaucoup de gens ajoutent un "Edit: Saved 2 bytes grace to @Neil". ou certains tels quand ils sont aidés dans un commentaire.
Neil
1

Dyalog APL (SBCS), 57 octets

{a←⎕A{(⍺~⍵)⍵}'AEIOU'⋄('AY',⍨1⌽⊢)⍣(∊/⊃¨⍵a)⊢(⊂⍵⍳⍨∊a)⌷∊1⌽¨a}

Essayez-le en ligne!

Prend la saisie en majuscules uniquement! (Parce que l' ⎕Aalphabet est en majuscule)

  • ⎕A{(⍺~⍵)⍵}'AEIOU': Vecteur de consonnes et voyelles
  • (⊂⍵⍳⍨∊a)⌷∊1⌽¨a: Utilise les index de chaque lettre du mot dans l'alphabet normal ( ⊂⍵⍳⍨∊a) pour indexer ( ) dans le chiffre∊1⌽¨a .
  • ('AY',⍨1⌽⊢)⍣(∊/⊃¨⍵a): Déplace la première lettre à la fin et ajoute «AY», si la première lettre est une consonne.

Merci pour le défi cool!

akhmorn
la source
0

JavaScript (SpiderMonkey) , 107 octets

x=>x.replace(/./g,y=>(z='aeiouabcdfghjklmnpqrstvwxyzb')[z.search(y)+1]).replace(/^([^aeiou])(.+)/,'$2$1ay')

Essayez-le en ligne!

Attend l'entrée en minuscules.

Remplace chaque caractère de la chaîne par un celui qui le suit dans la chaîne 'aeiouabcdfghjklmnpqrstvwxyzb', puis piglatinifie tout ce qui a une consonne initiale.

Yair Rand
la source
0

PHP, 112 octets

<?=strtr(($s=strstr(aeiou,($s=$argn)[0])?$s:substr($s,1).$s[0].ux),join(range(a,z)),ecdfighjoklmnpuqrstvawxyzb);

ou

<?=strtr(($s=strstr(aeiou,($argn)[0])?$argn:substr($s,1).$s[0].ux),join(range(a,z)),ecdfighjoklmnpuqrstvawxyzb);

supposer une entrée en minuscules. Exécuter en tant que pipe avec -nRou essayez-les en ligne .


Vous pourriez aussi bien utiliser
strtr($s,uzbcadfgehjklminpqrsotvwxy,range(a,z))au lieu de
strtr($s,range(a,z),ecdfighjoklmnpuqrstvawxyzb).

Titus
la source