Die verbesserte lateinische Caesar Pig-Chiffre


32

Das Problem mit der Caesar-Chiffre ist, dass die daraus resultierenden Wörter oft unaussprechlich sind. Das Problem mit Pig Latin ist, dass es einfach zu dekodieren ist. Warum nicht kombinieren?

Eingang

Ein Wort aus den 26 englischen Buchstaben.

Ausgabe

Ändern Sie zunächst jeden Konsonanten im Wort zum nächsten Konsonanten im Alphabet. Also geht b nach c, d geht nach f und z geht nach b. Ändern Sie dann jeden Vokal zum nächsten Vokal im Alphabet (u geht zu a). Zuletzt, nur wenn der erste Buchstabe des Wortes ein Konsonant ist, verschieben Sie diesen Buchstaben an das Ende des Wortes und fügen Sie "ay" an das Ende des Wortes hinzu.

Beispiele:

cat -> evday  
dog -> uhfay   
eel -> iim
  • Das ist , also gewinnt der kürzeste Code.
  • Fall spielt keine Rolle.
  • Verwendete Vokale sind A, E, I, O und U

2
Nein, aber Sie können, wenn Sie wollen
Qazwsx

6
Willkommen bei PPCG! Sehr schöne Herausforderung, übersichtlich präsentiert.
Jonathan Allan

6
Vorgeschlagener Testfall:z → bay
Arnauld

1
jot ot e wisz opvisitvoph dupdiqv cav o fu puv vjopl ov jimqt xovj VJI ecomovz vu qsupuapdi VJI xusftvay
Schatten

4
Empfohlene Testfall: the → jivay? (Das heißt, wenn das Wort mit mehreren Konsonanten beginnt, verschieben wir nur einen von ihnen?)
DLosc

Antworten:


3

Stax , 20 Bytes

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

Führen Sie es aus und debuggen Sie es

Erläuterung

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)

Ich ging einige Iterationen durch und brachte es schließlich auf 20. Meine ursprüngliche Lösung war 53 Bytes.


7

Ruby , 96 bis 69 Bytes

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

Probieren Sie es online!

Unterhaltsame Tatsache des Tages: tr () entspricht den Zeichenfolgen von rechts nach links. Ich habe immer angenommen, dass es von links nach rechts ist.


6

R , 86 85 Bytes

Einfacher Weg. chartrhat die charmante und nützliche Eigenschaft, dass Buchstabenbereiche angegeben werden können , wodurch einige Bytes gespart werden.

-1 Byte durch Stehlen der Übersetzungsstrings von @ GBs Ruby-Lösung - stimmen Sie zu!

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

Probieren Sie es online!



4

05AB1E , 21 Bytes

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

Probieren Sie es online!

Erläuterung

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

Erwartet die Eingabezeichenfolge in Kleinbuchstaben.

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'

Probieren Sie es online!

Vokale identifizieren

v

2130466 = 000001000001000001000100010
               ^     ^     ^   ^   ^
          zyxwvutsrqponmlkjihgfedcba-

Und tut:

(2130466 >> n) & 1

n

Sei shiftCount das Ergebnis des Ausblendens aller bis auf die niedrigstwertigen 5 Bits von rnum , dh des Berechnens von rnum & 0x1F.

Kommentiert

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 91 Bytes

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

Probieren Sie es online!

8 Bytes wurden aufgrund eines Vorschlags von Matthew Jensen abgeschabt


Sie können 8 Bytes mit der Funktion string.translate () einsparen:lambda s:[s[1:]+s[0]+"ux",s][s[0]in'aeiou'].translate(8*".ecdfighjoklmnpuqrstvawxyzb.....")
Matthew Jensen,

@MatthewJensen Clever! Normalerweise vermeide ich translatein Python 2 ...
Chas Brown

Zufälligerweise funktioniert es jetzt auch für Großbuchstaben
Matthew Jensen

3

T-SQL, 169 Bytes

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

Die Eingabe erfolgt gemäß unseren E / A-Standards über eine bereits vorhandene Tabelle .

Führt zuerst die Zeichenersetzung mit der Funktion ( neu in SQL 2017 ) TRANSLATEdurch und überprüft dann das erste Zeichen.

Ärgerlich lange vor allem aufgrund der SQL-Keyword-Länge.




2

Retina 0,8,2 , 50 Bytes

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

Probieren Sie es online! Link enthält Testfälle. Ähnliches Vorgehen bei der R-Antwort. Erläuterung:

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

obezieht sich auf die andere Menge, dh aei\oub-df-hj-np-tv-zbdie erweitert sich zu aeioubcdfghjlkmnpqrstvwxyzb, also uoerweitert sich zu uaeioubcdfghjlkmnpqrstvwxyzb. Dies führt zu folgender Transliteration:

uaeioubcdfghjlkmnpqrstvwxyzb
aeioubcdfghjlkmnpqrstvwxyzb

Die zweiten uund bwerden ignoriert, da sie niemals abgeglichen werden können, so dass dies die gewünschte Chiffre liefert. (Beachten Sie, dass Sie in Retina 1 natürlich vstatt aei\oufür eine 5-Byte-Speicherung verwenden können.)

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

Wenn der erste Buchstabe kein Vokal ist, drehen Sie ihn bis zum Ende und setzen Sie das Suffix ay.


2

Gelee , 24 Bytes

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

Probieren Sie es online!

Dank Jonathan Allan 1 Byte gespart (verwenden Sie die Zwei-Zeichen-Syntax anstelle von Anführungszeichen).


Leider viel länger vernünftige, nicht hinterhältige Version (1 Byte kürzeres hinterhältiges Äquivalent). Ich werde dies in den nächsten Stunden nicht aktualisieren können, mache aber auf Verbesserungen aufmerksam.
Mr. Xcoder

Verwenden Sie ⁾ayfür ein Byte. Das ©könnte nach dem gehen, eda das ist, was Sie speichern. Ich habe ØẹØḄ,żṙ€¥1ẎyṙḢe©ØḄƊ®⁾ayẋ.
Jonathan Allan

2

> <> , 94 92 Bytes

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

Probieren Sie es online!

Bearbeiten: 2 Bytes durch Eingabe von Mod 97 anstelle von 32 Bytes gespeichert, so dass das Wörterbuch am Anfang der Zeile beginnen kann. Vorherige Version:

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

1

Rot , 149 Bytes

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]

Probieren Sie es online!

Wie (fast) immer der längste Eintrag



1

Perl 5 , 56 Bytes

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

Probieren Sie es online!


1
Benötigen Sie das -s zwischen cund doder gund h?
Neil

@Neil nein ich nicht. Ich habe ein Programm geschrieben, um die Bereiche zu komprimieren ... und die Logik ist falsch :) Danke.
Hobbs

Normalerweise schreibt man in solchen Fällen <s>58</s> 56 bytesin den Header und viele Leute fügen ein "Edit: 2 Bytes dank @Neil gespeichert" hinzu. oder solche, wenn ihnen in einem Kommentar geholfen wird.
Neil

1

Dyalog APL (SBCS), 57 Bytes

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

Probieren Sie es online!

Nimmt Eingaben nur in Großbuchstaben vor! (Weil ⎕Aist Großbuchstaben)

  • ⎕A{(⍺~⍵)⍵}'AEIOU': Vektor von Konsonanten und Vokalen
  • (⊂⍵⍳⍨∊a)⌷∊1⌽¨a: Verwendet Indizes für jeden Buchstaben des Wortes im normalen Alphabet ( ⊂⍵⍳⍨∊a), um ( ) in die Chiffre zu indizieren ∊1⌽¨a.
  • ('AY',⍨1⌽⊢)⍣(∊/⊃¨⍵a): Verschiebt den ersten Buchstaben an das Ende und fügt 'AY' hinzu, wenn der erste Buchstabe ein Konsonant ist.

Danke für die coole Herausforderung!


0

JavaScript (SpiderMonkey) , 107 Byte

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

Probieren Sie es online!

Erwartet Eingaben in Kleinbuchstaben.

Ersetzt jedes Zeichen der Zeichenfolge durch ein Zeichen nach dem Zeichen in der Zeichenfolge 'aeiouabcdfghjklmnpqrstvwxyzb'und füllt dann alles mit einem Anfangskonsonanten.


0

PHP, 112 Bytes

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

oder

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

Nehmen Sie die Eingabe in Kleinbuchstaben an. Laufen Sie als Pipe mit -nRoder versuchen Sie es online .


Sie können auch
strtr($s,uzbcadfgehjklminpqrsotvwxy,range(a,z))anstelle von verwenden
strtr($s,range(a,z),ecdfighjoklmnpuqrstvawxyzb).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.