Ot wes thi bist uf tomis

36

Me encanta este simple cifrado, es muy divertido leer palabras que no son del todo legibles para los humanos y llenar los vacíos ...

Ot wes thi bist uf tomis, ot wes thi wurst uf tomis, 
ot wes thi egi uf wosdum, ot wes thi egi uf fuuloshniss, 
ot wes thi ipuch uf biloif, ot wes thi ipuch uf oncridaloty, 
ot wes thi siesun uf loght, ot wes thi siesun uf derkniss, 
ot wes thi sprong uf hupi, ot wes thi wontir uf dispeor, 
wi hed ivirythong bifuri as, wi hed nuthong bifuri as, 
wi wiri ell guong dorict tu hievin, wi wiri ell guong dorict thi uthir wey – 
on shurt, thi piroud wes su fer loki thi prisint piroud, 
thet sumi uf ots nuosoist eathurotois onsostid un ots biong riciovid, 
fur guud ur fur ivol, on thi sapirletovi digrii uf cumperosun unly.

Las reglas son súper simples:

  • Acepte texto como entrada (caracteres ascii, letras mayúsculas / minúsculas y puntuación).
  • Para cada vocal, gírela a la siguiente vocal o regrese al inicio.
    • a => e
    • e => i
    • i => o
    • o => u
    • u => a
  • Las vocales mayúsculas permanecen en mayúsculas, las vocales minúsculas permanecen en minúsculas.
  • Salida del texto después de estas conversiones.
  • No es necesario admitir acentos.
  • Los demás personajes deben permanecer sin cambios.
  • Intenta hacerlo en el menor número de bytes.
  • Cualquier idioma antiguo que te guste.

Casos de prueba

It was the best of times, it was the worst of times,
it was the age of wisdom, it was the age of foolishness,
it was the epoch of belief, it was the epoch of incredulity,
it was the season of light, it was the season of darkness,
it was the spring of hope, it was the winter of despair,
we had everything before us, we had nothing before us,
we were all going direct to heaven, we were all going direct the other way –
in short, the period was so far like the present period,
that some of its noisiest authorities insisted on its being received,
for good or for evil, in the superlative degree of comparison only.

Fuera:

Ot wes thi bist uf tomis, ot wes thi wurst uf tomis, 
ot wes thi egi uf wosdum, ot wes thi egi uf fuuloshniss, 
ot wes thi ipuch uf biloif, ot wes thi ipuch uf oncridaloty, 
ot wes thi siesun uf loght, ot wes thi siesun uf derkniss, 
ot wes thi sprong uf hupi, ot wes thi wontir uf dispeor, 
wi hed ivirythong bifuri as, wi hed nuthong bifuri as, 
wi wiri ell guong dorict tu hievin, wi wiri ell guong dorict thi uthir wey – 
on shurt, thi piroud wes su fer loki thi prisint piroud, 
thet sumi uf ots nuosoist eathurotois onsostid un ots biong riciovid, 
fur guud ur fur ivol, on thi sapirletovi digrii uf cumperosun unly.

En:

The quick brown fox jumps over the lazy dog.

Fuera:

Thi qaock bruwn fux jamps uvir thi lezy dug.

En:

Home is where the heart is.

Fuera:

Humi os whiri thi hiert os.

En:

Boaty McBoatface

Fuera:

Buety McBuetfeci

En:

AEIOUaeiou

Fuera:

EIOUAeioua

En:

Programming Puzzles And Code Golf

Fuera:

Prugremmong Pazzlis End Cudi Gulf
AJFaraday
fuente
20
Aka The Great Vowel Shift
Angs
44
Hmm Inglés antiguo?
iammax
10
Sigue siendo una lectura más fácil que Beowulf.
Smeato
44
A mí me parece un traductor de kiwi.
Magoo
1
Me gusta cómo "mal" cuando se cifra a "ivol", se pronuncia efectivamente de la misma manera.
Enrico Borba

Respuestas:

22

MS-SQL, 51 bytes

Funciona en SQL 2017 o superior:

SELECT TRANSLATE(v,'AEIOUaeiou','EIOUAeioua')FROM t

La nueva función TRANSLATErealiza el reemplazo de personajes individuales, por lo que es ideal para este desafío.

La entrada es a través de una tabla t preexistente con la columna varchar v , según nuestras reglas de IO .

En este caso, la tabla debe crearse utilizando una intercalación entre mayúsculas y minúsculas , ya sea ejecutándose en un servidor sensible a mayúsculas o minúsculas o utilizando la COLLATEpalabra clave (sin contar para el total de caracteres):

CREATE TABLE t(v varchar(max) COLLATE Latin1_General_CS_AS)

EDITAR : SSMS puede cortar la larga cita anterior al devolver el resultado en una ventana de "resultados a texto", esta es una configuración del cliente, no un error en mi programa .

Para solucionarlo, vaya Tools > Options > Query Results > SQL Server > Results to Texty aumente el "Número máximo de caracteres que se muestran en cada columna".

BradC
fuente
1
Estoy realmente sorprendida de que SQL es aún cerca a la competencia para ello. Además, ¡esa es una función genial! Gracias por contarnos :)
Financia la demanda de Mónica el
@NicHartley Sí, parecen agregar un par de funciones útiles en cada versión. También puede anidarlo REPLACEpara algunos trucos: REPLACE(TRANSLATE(v,'1234567890','xxxxxxxxxx'),'x','')para eliminar todos los números de una cadena, por ejemplo. Todavía largo, pero mucho más corto que 10 REPLACEs anidados .
BradC
14

Haskell , 52 bytes

(a:b)!c|a/=c=b!c|1>0=b!!0
a!b=b
map("aeiouaAEIOUA"!)

Pruébalo en línea!

Lynn me ahorró dos bytes al señalar que !!0es más corto que head.

Explicación

Si nunca ha codificado en Haskell, esto probablemente se verá como un montón de bromas. Así que primero eliminemos el golf y luego analicemos:

(a:b)!c
 |   a/=c   = b!c
 |otherwise = b!!0
a!b=b
map("aeiouaAEIOUA"!)

Primero tenemos una función !, que toma una cadena sy un carácter c. Nuestras primeras capturas de coincidencia de patrones aceptan entradas si la cadena no está vacía. Si la cadena no está vacía, comparamos su primer carácter con c. Si su primer carácter no es igual a lo ctiramos y llamamos !nuevamente con el resto de la cadena yc . Si es igual, devolvemos el segundo carácter en la cadena.

Nuestra próxima coincidencia de patrones atrapa la cadena en todos los demás casos, es decir, si la cadena está vacía. En este caso acabamos de regresar c.

En general, esta función toma un carácter cy una cadena sy devuelve el carácter después de la primera aparición de cin s. Si pasamos esto con aeiouaAEIOUAél, realizaremos nuestro cifrado en un solo personaje. Para hacer toda nuestra función, debemos mapear esto a través de la cadena.

Asistente de trigo
fuente
12

Retina ,10 9 9 8 bytes

T`uo`vVA

Pruébalo en línea!

¡Guardado 1 byte gracias a Neil! ¡Y otro byte gracias a Martin!

La nueva versión de retina tiene clases de vocales, lo que hace que el resultado sea un poco más corto. La transliteración también hace uso de la clase "otro". Entonces la toclase se ve como "aeiouAEIOUA" mientras que la fromclase se ve como "uaeiouAEIOUA"

Esto no causa ningún problema ya que la segunda uasignación Anunca se realizará ya que uya se asignó a.

FryAmTheEggman
fuente
9 bytes: T`_o`uvUV.
Neil
¡Esta es una respuesta notablemente corta!
AJFaraday
@Neil inteligente, gracias! Pensé que poner un _conjunto from lo trataría literalmente, pero parece que no lo hace.
FryAmTheEggman
3
Puedes afeitarte uno más, pero parece que no puedo atar a Stax, desafortunadamente: tio.run/##HYnBDoIwEAXv/…
Martin Ender
@MartinEnder Gracias! Esa es una configuración inteligente, que se mezcla entre los dos. Todavía no he intentado usar Ymucho, así que lo intentaré mañana.
FryAmTheEggman
9

Perl 5 + -p, 24 23 bytes

y;AEIOUaeiou;EIOUAeioua

Pruébalo en línea

-1 byte gracias a @DomHastings

Nahuel Fouilleul
fuente
1
Ya no contamos -pcomo +1, sino que consideramos que esta respuesta está en "Perl 5 + -p".
Erik the Outgolfer
1
Esto también funciona en sed
Kritixi Lithos
1
Si lo usa ;como delimitador, puede guardar un byte.
Dom Hastings
actualizado, @Cowsquack ya no
Nahuel Fouilleul
6

Python 3, 62 bytes

lambda x:x.translate(str.maketrans('aeiouAEIOU','eiouaEIOUA'))

Haga una tabla de traducción (diccionario) con strel str.maketransmétodo estático . Traducir caracteres relevantes a su carácter de destino.

mypetlion
fuente
¿Dónde realiza esto E / S?
reinierpost
@reinierpost Es una función. La entrada es a través del xparámetro. En python, las funciones lambda no necesitan una declaración de devolución.
mypetlion
6

C, 85 76 67 65 64 bytes

f(char*c){for(;*c;)putchar(1[index("AEIOUAaeioua",*c++)?:c-2]);}

La respuesta Java del puerto de Kevin Cruijssen . Pruébelo en línea aquí .

Gracias a Kevin Cruijssen por jugar al golf 9 bytes, a Christoph por jugar al golf 11 bytes y a ceilingcat por jugar al golf 1 byte.

Versión sin golf:

f(char* c) { // function taking a char array as parameter and implicitly returning an unused int
    for(; *c ;) // loop over the input
        putchar(1 [index("AEIOUAaeioua", * c++) ?: c-2]); // find the first pointer to the current char in the vowels string, NULL if not present; if it's not NULL, print the next vowel, otherwise just print the char
}
OOBalance
fuente
1
Parece ser una extensión no estándar de gcc. Lo sabía de PHP y simplemente lo probé.
Christoph
1
@ Christoph Me gusta su uso de la recursividad, pero no estoy seguro de que podamos generar un seguimiento \0. Además, esto no funciona cuando se compila con clang: tio.run/##S9ZNzknMS///…
OOBalance
1
@ Christoph: Tenía curiosidad acerca de dónde estaba el comportamiento indefinido, así que depuré la versión de clang, después de desentrañarla un poco más. const char *res = strchr("AEIOU...", 0)devuelve un puntero al terminador en la cadena literal. putchar(res[1])lee más allá del final de la cadena literal. Aparentemente, con gcc encuentra otro byte cero y funciona, pero con el sonido metálico se obtiene un 73 'I'(probablemente del mainliteral de la cadena, "Fue ...", pero no verifiqué el asm). Por putcharlo tanto , no devuelve 0, y eventualmente nos desconectamos cuando *c++lee una página sin asignar.
Peter Cordes el
2
@ PeterCordes, sí, lo descubrí aquí después de tener una sospecha. De todos modos aquí otros 2 bytes guardados f(char*c){for(;*c;)putchar(1[strchr("AEIOUAaeioua",*c++)?:c-2]);}. Eso es todo por ahora, supongo.
Christoph
1
@Rogem Debido a la propiedad conmutativa de la suma, a[b]==*(a+b)==*(b+a)==b[a]. Por lo tanto1[...]==(...)[1]
ceilingcat
5

Python 2 , 79 68 67 bytes

-1 byte gracias a @ArnoldPalmer

V='uaeiouAEIOUA'
print''.join((V[1:]+c)[V.find(c)]for c in input())

Pruébalo en línea!

Zarigüeya muerta
fuente
67 bytes . Además, lo siento si te inundaron las notificaciones, no he publicado un comentario desde hace un tiempo y olvidé cómo hacerlo.
Arnold Palmer
@ArnoldPalmer ¡Gracias! Está bien, estaba lejos y todos me extrañaron: D
Dead Possum
5

JavaScript (ES6), 60 bytes

s=>s.replace(/./g,c=>(S='aeiouaAEIOUA'+c+c)[S.indexOf(c)+1])

Pruébalo en línea!

Arnauld
fuente
s=>s.replace(/./g,c=>'auoieaAUOIEA'.match(".(?=${c})")||c)
tsh
Error: only.=>unlya
l4m2
4

Pyth, 17 bytes

em=.rQdrB"aeiou"1

Pruébalo aquí

em=.rQdrB"aeiou"1
 m                  For each string...
       rB"aeiou"1   ... in ['aeiou', 'AEIOU']...
  =.rQd             ... cyclically rotate the characters in the input.
e                   Take the last.

fuente
4

Japt 2.0, 25 21 bytes

Me divertí jugando al golf con Shaggy.

r\v@=`aeia`pu)g1+UbX

Ejecútalo aquí.

Oliver
fuente
1
23 bytes
Shaggy
1
@ Shaggy Eso no funciona con vocales mayúsculas.
Oliver
1
En ese caso ... 22 bytes .
Shaggy
1
@Shaggy Esto es divertido ... 21 bytes
Oliver
1
¡Agradable! Creo que es la primera vez que lo veo S.p(f)usado.
Shaggy
4

Java 10, 97 87 bytes

s->{for(var c:s){var t="AEIOUAaeioua"+c+c;System.out.print(t.charAt(t.indexOf(c)+1));}}

-10 bytes después de inspirarse en la respuesta JavaScript de @Arnauld (su versión de 60 bytes) .

Pruébalo en línea.

Explicación:

s->{                         // Method with character-array parameter and no return-type
  for(var c:s){              //  Loop over the input characters
    var t="AEIOUAaeioua"     //  Temp-String containing the order of vowels 
                             //  (including additional 'A' and 'a'),
          +c+c;              //  appended with two times the current character
    System.out.print(        //  Print:
      t.charAt(              //   The character in String `t` at index:
         t.indexOf(c)+1));}} //    The (first) index of the current character in `t` + 1
Kevin Cruijssen
fuente
4

05AB1E , 14 13 11 bytes

žMDÀ‡žMuDÀ‡

Pruébalo en línea!

Kaldo
fuente
1
Puede guardar dos bytes simplemente tomando la entrada como una cadena de varias líneas, por lo que no hay necesidad de |y »: Pruébelo en línea: 11 bytes .
Kevin Cruijssen
@KevinCruijssen ¡Gracias! ¿No es algo que se solucionó en una versión reciente de 05AB1E?
Kaldo
No tengo idea tbh. Solo comenzó 05AB1E desde aproximadamente el comienzo de este año. Si lo desea, puede preguntarle a @Adnan en el chat 05AB1E cuándo se agregó la función.
Kevin Cruijssen
3

APL + WIN, 55 bytes

Solicitudes de cadena de entrada:

i←(10≥n←'AEIOUaeiou'⍳s)/⍳⍴s←⎕⋄s[i]←'EIOUAeioua'[n~11]⋄s
Graham
fuente
3

Paperas, 38 bytes

R T W $TR(T,"AEIOUaeiou","EIOUAeioua")

Las paperas normalmente no agregan un retorno de carro, ya que no vi un requisito para separar la entrada de la salida, se ve un poco extraño en la primera ejecución. Por ejemplo, la salida para el último caso de prueba se ve así:

Programming Puzzles And Code GolfPrugremmong Pazzlis End Cudi Gulf

Si desea agregar un retorno de carro, agregue dos bytes de esta manera:

R T W !,$TR(T,"AEIOUaeiou","EIOUAeioua")
zmerch
fuente
3

Vim + tpope / vim-abolish , 30 bytes

:%S/{a,e,i,o,u}/{e,i,o,u,a}/g<cr>

Solución alternativa, también 30 bytes:

Oe,i,o,u<esc>|D:%s/{a,<C-r>"}/{<C-r>",a}/g

Según meta , las respuestas de vim pueden usar complementos sin penalización de bytes. Esta no es una respuesta vim, sino una respuesta vim + abolir .


Abolir es un complemento extremadamente útil. Esta sección de README describe muy bien cómo funciona este comando (el Subvertcomando).

DJMcMayhem
fuente
3

CJam, 29 19 bytes

q"aeioua"_eu+_1m<er

Try it online!

-10 bytes thanks to @Peter Taylor

Explicación:

q                       # take all input
 "aeioua"               # push vowel pairs
         _eu            # duplicate, uppercase
            +_          # concatenate, duplicate again
              1m<       # rotate left by 1
                 er     # transliterate
vazt
fuente
Aunque la pregunta no es específica sobre la entrada, creo que probablemente debería usarla en qlugar de ltomarla. El primer caso de prueba parece ser de varias líneas. También puedes acortar "eioua"a _1m<. De hecho, puedes ir más lejos y jugar golf a estoq"aeioua"_eu+_1m<er
Peter Taylor
3

AutoHotkey, 24 bytes

AuotHotkey reemplaza automáticamente las letras en mayúsculas y minúsculas.

a::e
e::i
i::o
o::u
u::a
nelsontruran
fuente
2

PHP, 90 bytes

Pruébalo en línea

Código

function f($s){echo strtr($s,array_combine(str_split(UuAaEeIiOo),str_split(AaEeIiOoUu)));}

Explicación

function f($s){
 echo strtr(
       $s,                          #The string to operate
       array_combine(               #combining arrays
            str_split(UuAaEeIiOo),  #splitting this strings
            str_split(AaEeIiOoUu))
              # With array combine php creates an array like
              # ["U"=>"A", "a"=>"e"....and so on]
              # strtr can replace strings in a string, using an array with 
              # the values to replace and with what replace each value.
 );
}

75 bytes si se ejecuta con el php -ruso$argv

<?=strtr($argv,array_combine(str_split(UuAaEeIiOo),str_split(AaEeIiOoUu)));
Francisco Hahn
fuente
2

str, 18 bytes

[aeiouaAEIOUA]#D#U

Try it online!

Explanation

                       implicit: over each character of the input:
[aeiouaAEIOUA]#D#U
[            ]         push this string
              #D       set this to the operation domain
                #U     set the charcter to the next character in the domain
Conor O'Brien
fuente
2

PHP, 38 bytes

Quite simple, not very creative, uses strtr to replace the vowels:

<?=strtr($argn,aeiouAEIOU,eiouaEIOUA);

Run with echo '<input>' | php -nF <filename> or Try it online.

Davіd
fuente
Does this not assume that the input is assigned to the predefined variable argn? If so then that's not valid; you'd need to pass the string as an argument and use $argv1] instead.
Shaggy
2
@Shaggy No, if you run it with the -F flag, then it works with input on the command line. From the PHP docs on options: -F --process-file PHP file to execute for every input line. Added in PHP 5. The Try it online variable defining is just because some people don't have PHP installed locally, and I couldn't get the -F flag working in TIO.
Davіd
1
Thanks, @David - that's my "something new" for PHP today :)
Shaggy
2

q/kdb+, 36 33 bytes

Solution:

{(v,2#x)1+(v:"aeiouaAEIOUA")?x}@'

Examples:

q){(v,2#x)1+(v:"aeiouaAEIOUA")?x}@'"AEIOUaeiou"
"EIOUAeioua
q){(v,2#x)1+(v:"aeiouaAEIOUA")?x}@'"Programming Puzzles And Code Golf"
"Prugremmong Pazzlis End Cudi Gulf"

Explanation:

Figure out index of vowels, add one to push along to the next and index in. Still think this approach can be significantly improved...

{(v,2#x)1+(v:"aeiouaAEIOUA")?x}@' / the solution
{                             }@' / apply lambda to each character of input
                            ?x    / look up x in...
          (                )      / do together
             "aeiouaAEIOUA"       / lookup list
           v:                     / save as v
        1+                        / add one
 (     )                          / do together
    2#x                           / take 2 copies of x
  v,                              / prepend v

Bonus:

My old **36 byte(()) solution which I think is quite cool, but need to golf down the lists to make it competetive:

ssr/[;"uoiea%UOIEA%";"%uoiea%UOIEA"]
streetster
fuente
2

Charcoal, 35 bytes

UT≔AUOIEAauoieaσF¹¹⊞υ➙§σ⊕ι§σι▷SR⟦Sυ

Try it online!

Naive method.

Explanation:

UT                                         Set trim option to on, so output won't be a rectangle
    ≔AUOIEAauoieaσ                          Assign "AUIOEAauioea" to s
                   F¹¹                      For i (ι) from 0 to 10
                       ⊞υ                   Push to u (initially empty list)
                          ➙                 Rule of:
                            §σ⊕ι            S[i + 1]
                                 §σι         to S[i]. This is so a->A gets overwriteen by a->e
                                    ▷SR⟦Sυ  Replace input as string using u (now a list of rules)
ASCII-only
fuente
2

PHP, 76 bytes.

$s=strtr($s,array_combine(str_split("aeiouAEIOU"),str_split("eiouaEIOUA")));

Check it out!

This was the shortest I was able to do this in PHP.

$s = //overwrite $s variable ($s should be a defined string or input)
    strtr(  //strtr replaces key => value pairs from arrays in a string
        $s, //the string we are converting
        array_combine( //create an array with key value pairs, key should be original vowel letter and value should be it's replacement
            str_split("aeiouAEIOU") //turn vowels (lower and upper) into an array
            ,str_split("eiouaEIOUA") //turn vowel replacements into an array
        )
    );
Grumpy says Reinstate Monica
fuente