Spielen Sie Zip, Zap, Zop

22

Es gibt ein kleines Improvisations-Aufwärmspiel, in dem Sie sich in einem Kreis anordnen und Reißverschlüsse, Zaps und Zops versenden, indem Sie auf eine Person zeigen und das nächste Wort in der Sequenz sagen wie auch immer.

Ihre Aufgabe ist es, ein Programm zu erstellen, das bei einem eingegebenen Wort das nächste Wort der Reihe nach ausgibt. (Zip -> Zap -> Zop -> Zip) Da es viele verschiedene Möglichkeiten gibt, diese drei Wörter und Flairs auszudrücken, die hinzugefügt werden können, sollte Ihr Programm die Vervielfältigung von Groß- und Kleinschreibung imitieren und Suffixe tragen.

Um dies zu erläutern, geben Sie ein oder mehrere Zs, dann ein oder mehrere Is, As oder Os (alle gleichen Buchstaben), dann ein oder mehrere Ps (alle Buchstaben bis zu diesem Punkt können in gemischter Schreibweise geschrieben sein) ein, gefolgt von ein beliebiges Suffix (das leer sein kann). Sie sollten die Läufe von Zs und Ps sowie das Suffix genau so belassen, wie sie erhalten wurden, aber dann das Is in As, As in Os oder Os in Is ändern , um die Groß- und Kleinschreibung bei jedem Schritt beizubehalten.

Beispiel Testfälle

zip         ==> zap
zAp         ==> zOp
ZOP         ==> ZIP
ZiiP        ==> ZaaP
ZZaapp      ==> ZZoopp
zzzzOoOPppP ==> zzzzIiIPppP
Zipperoni   ==> Zapperoni
ZAPsky      ==> ZOPsky
ZoPtOn      ==> ZiPtOn
zipzip      ==> zapzip
zapzopzip   ==> zopzopzip
zoopzaap    ==> ziipzaap

Regeln und Hinweise

  • Sie können für die Eingabe und Ausgabe eine beliebige bequeme Zeichenkodierung verwenden, sofern diese alle ASCII-Buchstaben unterstützt und vor dieser Herausforderung erstellt wurde.
  • Sie können annehmen, dass das Eingabewort eine Variante von Zip, Zap oder Zop ist. Alle anderen Eingaben führen zu undefiniertem Verhalten.
    • Gültige Eingaben stimmen mit dem regulären Ausdruck überein Z+(I+|A+|O+)P+.*(in gemischten Fällen)

Viel Spaß beim Golfen!

Beefster
quelle
2
ziop -> was macht das
Joshua
2
@Joshua Dies ist laut Beschreibung ungültig (siehe "alle gleichen Buchstaben" ).
Arnauld
1
@Arnauld: Und der Testfall für zoopzaap stimmt nicht mit der Beschreibung überein.
Joshua
4
@ Joshua Warum? Dies gilt nur für die Vokale zwischen dem führenden zund dem ersten p. Das Suffix kann alles enthalten.
Arnauld

Antworten:

9

JavaScript (Node.js) ,  69 63 57  54 Byte

s=>Buffer(s).map(c=>s|c%4<1?s=c:c+c*90%320%34%24-8)+''

Probieren Sie es online!

Wie?

Wir verarbeiten den eingegebenen String s .

Wir verwenden s als Flag: Sobald ein numerischer Wert darin gespeichert ist, wissen wir, dass wir nichts anderes aktualisieren dürfen.

Zur Identifizierung "p"(112) und "P"(80), verwenden wir die Tatsache , dass ihre ASCII - Codes sind ein Vielfaches von 4 und die ASCII - Codes der anderen Buchstaben am Anfang des Strings ( "z", "Z"und Vokale) nicht.

Um einen Vokal mit ASCII - Code zu drehen c in sein Gegenstück n während verlassen zund Zunverändert verwenden wir die folgende Funktion:

n=c+((((90×c)mod320)mod34)mod24)-8

 letter | ASCII code |  * 90 | % 320 | % 34 | % 24 | - 8 | new letter
--------+------------+-------+-------+------+------+-----+-----------------------
   'i'  |     105    |  9450 |  170  |   0  |   0  |  -8 | 105 -  8 =  97 -> 'a'
   'a'  |      97    |  8730 |   90  |  22  |  22  |  14 |  97 + 14 = 111 -> 'o'
   'o'  |     111    |  9990 |   70  |   2  |   2  |  -6 | 111 -  6 = 105 -> 'i'
   'z'  |     122    | 10980 |  100  |  32  |   8  |   0 | 122 +  0 = 122 -> 'z'
   'I'  |      73    |  6570 |  170  |   0  |   0  |  -8 |  73 -  8 =  65 -> 'A'
   'A'  |      65    |  5850 |   90  |  22  |  22  |  14 |  65 + 14 =  79 -> 'O'
   'O'  |      79    |  7110 |   70  |   2  |   2  |  -6 |  79 -  6 =  73 -> 'I'
   'Z'  |      90    |  8100 |  100  |  32  |   8  |   0 |  90 +  0 =  90 -> 'Z'

Kommentiert

s =>                  // s = input string
  Buffer(s)           // convert it to a Buffer of ASCII codes
  .map(c =>           // for each ASCII code c in s:
    s |               //   if s is numeric
    c % 4 < 1 ?       //   or c is either 'p' or 'P':
      s = c           //     turn s into a numeric value and yield c
    :                 //   else:
      c +             //     update c
        c * 90 % 320  //     by applying the transformation function
        % 34 % 24     //     (see above)
        - 8           //
  ) + ''              // end of map(); coerce the Buffer back to a string
Arnauld
quelle
Wie sind Sie auf diese Funktion gekommen?
Thomas Hirsch
2
@ThomasHirsch Es wurde mit einer Brute-Force-Suchfunktion gefunden. Der erste Schritt (Multiplikation + 1. Modulo) stellt sicher, dass die Parameter für Klein- und Großbuchstaben identische Ergebnisse liefern. Der 2. Schritt (die nächsten 2 Module und die Subtraktion) prüft, ob die korrekten Delta-Werte von dort erhalten werden können.
Arnauld
6

C (gcc) ,  81 ... 61 48  46 Bytes

2 Bytes dank @Grimy gespart

Port meiner JS Antwort . Ausgabe durch Ändern der Eingabezeichenfolge.

f(char*s){for(;*++s%4;*s+=*s*90%320%34%24-8);}

Probieren Sie es online!

Kommentiert

f(char * s) {       // f = function taking the input string s
  for(;             //   for each character *s in s:
    *++s % 4;       //     advance the pointer; exit if *s is either 'p' or 'P' (it's safe 
                    //     to skip the 1st character, as it's guaranteed to be 'z' or 'Z')
    *s +=           //     update the current character:
      *s * 90 % 320 //       apply a transformation formula that turns
      % 34 % 24     //       a vowel into the next vowel in the sequence
      - 8           //       while leaving 'z' and 'Z' unchanged
  );                //   end of for()
}                   // end of function
Arnauld
quelle
-2 Bytes
Grimmy
@ Grimy Netter Fang, danke! ( *++s%4Irgendwann habe ich es versucht , aber die daraus resultierende Optimierung übersehen ...)
Arnauld
1
Weitere -3 Bytes . Dies sollte auch für Ihre JS-Antwort gelten.
Grimmy
@Grimy Es unterscheidet sich genug von meinem, daher möchten Sie dies möglicherweise als separate Antwort posten.
Arnauld
5

Retina 0.8.2 , 21 Bytes

iT`Io`A\OIia\oi`^.+?p

Probieren Sie es online! Transkription von Briefen bis einschließlich der ersten p, obwohl die Buchstaben zund pnicht im Transkriptionsabschnitt enthalten sind und daher nicht betroffen sind. Das erste Owird zitiert, weil es sich normalerweise ausdehnt, 13567und das zweite owird zitiert, weil es ebenfalls magisch ist; Im ersten Teil der Transliteration wird sie auf die andere Zeichenfolge erweitert. Die resultierende Umschrift ist daher aus , IAOIiaoium AOIiaoidann in die doppelten Quelle Buchstaben Ergebnisse Entfernung IAOiaozu AOIaoi.

Neil
quelle
4

C 43 Bytes

f(char*s){for(;*++s%4;*s^=*s%16*36%98%22);}

Probieren Sie es online!

Basierend auf Arnauld's Antwort . Ich habe eine Brute-Force-Suche durchgeführt, um die kürzeste Formel zu finden, die a => o, o => i, i => a, z => z ergibt.

Grimmig
quelle
3

R , 110 76 Byte

-36 Bytes dank Krill

Diese Funktion nimmt eine Eingabe von einer Zeichenkette entgegen.

function(a)sub(s<-sub('z+(.+?)p.*','\\1',a,T),chartr('aioAIO','oaiOAI',s),a)

Probieren Sie es online!

CT Hall
quelle
1
Das Sammeln der Zeichenfolge aus Teilen in R ist in der Regel sehr lang ... Sie sparen jedoch eine Menge Bytes, indem Sie zuerst eine szu übersetzende Teilzeichenfolge extrahieren und diese dann durch eine übersetzte Kopie ersetzen: 76 Bytes
Kirill L.
@KirillL., Ah, das ist der clevere Trick, den ich zu finden versuchte.
CT Hall
2

Perl 6 , 41 33 Bytes

{S:i{.+?p}=$/~~tr/iaoIAO/aoiAOI/}

Probieren Sie es online!

Einfache Substitution ohne Berücksichtigung der Groß- und Kleinschreibung, um den Vokalabschnitt zu verschieben.

Scherzen
quelle
1

Perl 5, 31 Bytes

s/.+?p/$&=~y,iaoIAO,aoiAOI,r/ei

TIO

Nahuel Fouilleul
quelle
1

SNOBOL4 (CSNOBOL4) , 183 Bytes

	INPUT (BREAK('Pp') SPAN('Pp')) . P REM . S
A	P 'a' ='o'	:S(A)
Z	P 'A' ='O'	:S(Z)F(P)
I	P 'i' ='a'	:S(I)
K	P 'I' ='A'	:S(K)F(P)
O	P 'o' ='i'	:S(O)
L	P 'O' ='I'	:S(L)
P	OUTPUT =P S
END

Probieren Sie es online!

Giuseppe
quelle
1

C # (Visual C # Interactive Compiler) , 60 Byte

n=>{for(int i=0;n[i]%4>0;)n[i]^=(char)(n[i++]%16*36%98%22);}

Basierend auf Grimys C-Antwort.

Probieren Sie es online!

Verkörperung der Ignoranz
quelle
1
Dies funktioniert leider nicht, da es auch die Vokale im Suffix ersetzt.
Emigna
Wie oben in @Emigna angegeben, ersetzt dies alle aoi-Vokale und nicht nur die vor dem ersten p/ P. Eine Sache zum Golfen ("iao".IndexOf((char)(c|32))+1)%4kann jedoch sein-~"iao".IndexOf((char)(c|32))%4
Kevin Cruijssen
1

C / C ++ (VC ++ - Compiler) 192 Byte

dies ist aber trotzdem ein eher naiver versuch

void f(char*I){int c[]={-8,14,6},B=1,v[]={105,97,111},j=0;for(*I;*I>0&B;I++){if(*I==80|*I==112){B=0;break;}if(*I==90|*I==122){}else{for(j;j<3;j++){if(*I==v[j]|*I==v[j]-32){*I+=c[j];break;}}}}}

Eine etwas besser lesbare Version ist diese

#include "stdafx.h"

void f(char * theString)
{
    signed int change[] = {'a'-'i','o'-'a','o'-'i'}; // add this to the vowel to get the next one
    char theVowels[] = {'i','a','o'};
    int breaker = 1;
    printf("Input %s\n",theString);
    for (int i = 0;(theString[i] != '\0') && breaker; i++)
    {
        switch (theString[i])
        {
            case 'Z': /*fall through*/
            case 'z': break;
            case 'P': /*fall through*/
            case 'p': breaker = 0;
                      break; 
            default: 
            {
                for (int j = 0; j < 3; j++)
                {
                    if ((theString[i] == theVowels[j]) || (theString[i]==(theVowels[j]-'a'+'A')))
                    {
                        theString[i] += change[j];
                        break;
                    }
                }
            }
            break;
        }

    }
    printf("Output %s\n",theString);
}
int main()
{
    char theString[]= "zzzzIIIIp0815-4711"; // a test string
    f(theString);
    return 0;
}
der bender
quelle
tio: tio.run/…
der
tio golfed: tio.run/…
der
0

05AB1E (Legacy) , 22 Byte

l'pkIg‚£ć…iaoDÀ‚Du+`‡ì

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Kann auf jeden Fall ein bisschen mehr golfen werden ..

Verwendet die Vorgängerversion von 05AB1E anstelle des Umschreibens von Elixir, da +Felder in Listen gleicher Länge zusammengeführt werden, während die neue Version stattdessen einen Pair-Zip-Join benötigt‚øJ .

Erläuterung:

l                       # Lowercase the (implicit) input-string
                        #  i.e. "ZipPeroni" → "zipperoni"
 'pk                   '# Get the index of the first "p"
                        #  i.e. "zipperoni" → 2
    Ig                 # Pair it with the length of the entire input-string
                        #  i.e. 2 and "zipperoni" → [2,9]
       £                # Split the (implicit) input-string into parts of that size
                        #  i.e. "ZipPeroni" and [2,9] → ["Zi","pPeroni"]
        ć               # Extract head: push the head and remainder separately to the stack
                        #  i.e. ["Zi","pPeroni"] → ["pPeroni"] and "Zi"
         iao           # Push string "iao"
             DÀ         # Duplicate, and rotate it once towards the left: "aoi"
                       # Pair them up: ["iao","aoi"]
                Du      # Duplicate and transform it to uppercase: ["IAO","AOI"]
                  +     # Python-style merge them together: ["iaoIAO","aoiAOI"]
                   `    # Push both strings to the stack
                       # Transliterate; replacing all characters at the same indices
                        #  i.e. "Zi", "iaoIAO" and "aoiAOI" → "Za"
                     ì  # Prepend it to the remainder (and output implicitly)
                        #  i.e. ["pPeroni"] and "Za" → ["ZapPeroni"]
Kevin Cruijssen
quelle
0

PHP, 30 Bytes

zu einfach für ein TiO:

<?=strtr($argn,oiaOIA,iaoIAO);

Als Rohr mit laufen lassen -nF. Setzen Sie für PHP 7.2 die String-Literale in Anführungszeichen.

Titus
quelle
Das transliteriert alle oiaVokale anstatt nur die vor dem ersten p/ P, nicht wahr?
Kevin Cruijssen