Il migliorato Cipher Latin Caesar Pig


32

Il problema con il codice Caesar è che le parole risultanti sono spesso imprecisabili. Il problema con Pig Latin è che è facile da decodificare. Perché non combinarli?

Ingresso

Una parola composta da 26 lettere inglesi.

Produzione

Innanzitutto, cambia ogni consonante della parola nella consonante successiva dell'alfabeto. Quindi, b va a c, d va a f e z va a b. Quindi, cambia ogni vocale nella vocale successiva dell'alfabeto (vai a a). Infine, solo se la prima lettera della parola è una consonante, sposta quella lettera alla fine della parola e aggiungi "ay" alla fine della parola.

Esempi:

cat -> evday  
dog -> uhfay   
eel -> iim
  • Questo è , quindi vince il codice più corto.
  • Il caso non ha importanza.
  • Le vocali che verranno utilizzate sono A, E, I, O e U

2
no, ma puoi, se vuoi
qazwsx,

6
Benvenuti in PPCG! Sfida molto bella, presentata in modo chiaro.
Jonathan Allan,

6
Caso di prova suggerito: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
Suggerita banco di prova: the → jivay? (Cioè, se la parola inizia con più consonanti, ne spostiamo solo una?)
DLosc

Risposte:


3

Stax , 20 byte

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

Esegui ed esegui il debug

Spiegazione

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)

Ho superato alcune iterazioni e alla fine sono arrivato a 20. La mia soluzione originale era di 53 byte.


7

Rubino , 96 69 byte

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

Provalo online!

Fatto divertente del giorno: tr () corrisponde alle stringhe da destra a sinistra. Ho sempre pensato che fosse da sinistra a destra.


6

R , 86 85 byte

Modo semplice. chartrha la proprietà affascinante e utile che può specificare intervalli di lettere , che salvano alcuni byte.

-1 byte rubando le stringhe di traduzione della soluzione Ruby di GB : votalo!

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

Provalo online!



4

05AB1E , 21 byte

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

Provalo online!

Spiegazione

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

4

Node.js 10.9.0 , 121 116 byte

Prevede la stringa di input in minuscolo.

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'

Provalo online!

Individuare le vocali

Per identificare le vocali, la funzione helper utilizza la seguente maschera di bit:v

2130466 = 000001000001000001000100010
               ^     ^     ^   ^   ^
          zyxwvutsrqponmlkjihgfedcba-

E fa:

(2130466 >> n) & 1

Non abbiamo bisogno di mascherare i bit rilevanti di , perché è fatto implicitamente. Di seguito è riportata la citazione pertinente dalla specifica ECMAScript :n

Lascia che shiftCount sia il risultato del mascheramento di tutti tranne i 5 bit meno significativi di rnum , ovvero calcola rnum e 0x1F.

Commentate

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

4

Python 2 , 153 121 110 99 99 byte

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

Provalo online!

8 byte eliminati a causa di un suggerimento di Matthew Jensen


Puoi salvare 8 byte usando la funzione string.translate ():lambda s:[s[1:]+s[0]+"ux",s][s[0]in'aeiou'].translate(8*".ecdfighjoklmnpuqrstvawxyzb.....")
Matthew Jensen il

@MatthewJensen Clever! Di solito evito translatein Python 2 ...
Chas Brown il

Per coincidenza, ora funziona anche in maiuscolo
Matthew Jensen il

3

T-SQL, 169 byte

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'input avviene tramite una tabella preesistente, secondo i nostri standard IO .

Esegue prima la sostituzione dei caratteri, usando la funzione ( novità di SQL 2017 ) TRANSLATE, quindi controlla il primo carattere.

Fastidioso a lungo principalmente a causa della lunghezza della parola chiave SQL.




2

Retina 0.8.2 , 50 byte

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

Provalo online! Il link include casi di test. Approccio simile alla risposta R. Spiegazione:

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

osi riferisce all'altro set, ovvero aei\oub-df-hj-np-tv-zb, che si espande a aeioubcdfghjlkmnpqrstvwxyzb, quindi si uoespande a uaeioubcdfghjlkmnpqrstvwxyzb. Ciò si traduce nella seguente traslitterazione:

uaeioubcdfghjlkmnpqrstvwxyzb
aeioubcdfghjlkmnpqrstvwxyzb

Il secondo ue bvengono ignorati in quanto non possono mai essere abbinati, quindi questo fornisce la cifra desiderata. (Nota che in Retina 1 puoi ovviamente usare vinvece che aei\ouper un salvataggio di 5 byte.)

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

Se la prima lettera non è una vocale, ruotala fino alla fine e aggiungi il suffisso ay.


2

Gelatina , 24 byte

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

Provalo online!

Salvato 1 byte grazie a Jonathan Allan (utilizzare la sintassi a due caratteri anziché le virgolette).


Purtroppo versione molto più sana e non subdola ( equivalente subdolo più breve di 1 byte ). Non sarò in grado di aggiornarlo entro le prossime ore, ma fai attenzione se trovi miglioramenti.
Mr. Xcoder,

Utilizzare ⁾ayper un byte. Il ©poteva andare dopo il edato che questo è ciò che si memorizzano. Io ho ØẹØḄ,żṙ€¥1ẎyṙḢe©ØḄƊ®⁾ayẋ.
Jonathan Allan,

2

> <> , 94 92 byte

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

Provalo online!

Modifica: salvato 2 byte prendendo l'input mod 97 anziché 32, in modo che il dizionario possa iniziare all'inizio della riga. Versione precedente:

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

1

Rosso , 149 byte

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]

Provalo online!

Come (quasi) sempre, la voce più lunga


1

F # (Mono) , 197 byte

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)

Provalo online!


1

Perl 5 , 56 byte

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

Provalo online!


1
Hai bisogno della -s tra ce do ge h?
Neil,

@Neil no. Ho scritto un programma per comprimere gli intervalli ... e ho sbagliato la logica :) Grazie.
Hobbs,

Normalmente in questi casi scrivi <s>58</s> 56 bytesnell'intestazione e molte persone aggiungono un "Modifica: Salvato 2 byte grazie a @Neil". o alcuni di questi quando vengono aiutati in un commento.
Neil,

1

Dyalog APL (SBCS), 57 byte

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

Provalo online!

Accetta solo lettere maiuscole! (Perché ⎕Aè un alfabeto maiuscolo)

  • ⎕A{(⍺~⍵)⍵}'AEIOU': Vettore di consonanti e vocali
  • (⊂⍵⍳⍨∊a)⌷∊1⌽¨a: Utilizza gli indici di ogni lettera della parola nell'alfabeto normale ( ⊂⍵⍳⍨∊a) per indicizzare ( ) nella cifra ∊1⌽¨a.
  • ('AY',⍨1⌽⊢)⍣(∊/⊃¨⍵a): Sposta la prima lettera alla fine e aggiunge 'AY', se la prima lettera è una consonante.

Grazie per la bella sfida!


0

JavaScript (SpiderMonkey) , 107 byte

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

Provalo online!

Prevede input in lettere minuscole.

Sostituisce ogni carattere della stringa con uno dopo quello nella stringa 'aeiouabcdfghjklmnpqrstvwxyzb', quindi piglatinifica qualsiasi cosa con una consonante iniziale.


0

PHP, 112 byte

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

o

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

assume l'input di lettere minuscole. Esegui come pipe -nRo provali online .


Puoi anche usare
strtr($s,uzbcadfgehjklminpqrsotvwxy,range(a,z))invece di
strtr($s,range(a,z),ecdfighjoklmnpuqrstvawxyzb).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.