Convertir una cadena a su equivalente Rövarspråket


15

Rövarspråket

Rövarspråket es un juego de palabras jugado por niños suecos, de los libros sobre Kalle Blomkvist de Astrid Lindgren.

Las reglas básicas son las siguientes (de Wikipedia):

  • Cada consonante (la ortografía importa, no la pronunciación) se duplica y se inserta una o en el medio.
  • Las vocales se dejan intactas.

Algunos ejemplos:

  • "hola" -> "hohelollolo"
  • "Min svävare är full med ål" -> "MoMinon sosvovävovarore äror fofulollol momedod ålol"

Las consonantes suecas son las mismas que las inglesas, por lo que el programa debería funcionar con entradas suecas e inglesas.

La letra "y" se toma como una consonante en este caso, como lo es la mayoría de las veces.


Tu tarea:

Escriba un programa para convertir una cadena de letras suecas, ingresadas a través de una función o a través de stdin, en su equivalente de Rövarspråket. ¡La respuesta más corta en bytes gana!


@ MartinBüttner Aclaró mi pregunta aún más: debería funcionar con sueco (ya que es un juego de palabras sueco).
James Williams

¿Cuál es el significado de las entradas alfabéticas?
Optimizador

@Optimizer Una cadena de solo caracteres alfabéticos. Lo siento, lo redacté mal, lo editaré
James Williams

3
¿Cómo debemos tratar las no letras? Al menos se muestran espacios en el segundo ejemplo.
nimi

2
En una nota al margen: 'Y' se considera una vocal en sueco
leo

Respuestas:


14

Retina , 14 + 5 = 19 bytes

Retina es un lenguaje que es esencialmente una expresión regular .NET con la menor sobrecarga posible. El código para este programa consta de dos archivos:

i`[b-z-[eiou]]
$0o$0

Esto lee la entrada en STDIN e imprime la salida en STDOUT.

Si llama a los archivos pattern.rgxy replacement.rpl, puede ejecutar el programa simplemente como

echo "hello" | ./Retina pattern.rgx replacement.rpl

Explicación

Esto es bastante sencillo, pero permítanme agregar alguna explicación de todos modos (principalmente sobre cómo funciona Retina). Si se invoca Retina con 2 archivos, se supone automáticamente que funciona en "Modo de reemplazo", donde el primer archivo es la expresión regular y el segundo archivo es el patrón.

La retina se puede configurar (que incluye RegexOptionsy otras opciones) anteponiendo la expresión regular con `una cadena de configuración. En este caso, solo le doy icuál es el modificador de expresiones regulares para la insensibilidad de mayúsculas y minúsculas.

En cuanto a la expresión regular en sí, utiliza la resta de la clase de caracteres de .NET para hacer coincidir cualquier consonante en el rango ASCII. El reemplazo luego solo escribe el partido dos veces con un ointermedio.


¿Te estás perdiendo un aen tu clase de carácter vocal?
Brian Gordon

3
@BrianGordon No, estoy comenzando la clase de personaje b, así que no necesito restar a.
Martin Ender

2
Interesante, nunca antes había visto rangos de caracteres sustractivos anidados. ¿Es eso solo una cosa .NET?
Steve Bennett

Siento que necesita contar al menos un carácter para la delimitación entre los dos archivos. eso sería un punto y coma o una nueva línea en otro idioma. es el espacio entre los nombres de archivo si quieres ser selectivo sobre el origen del personaje en este idioma.
Sparr

@Sparr sí, esa es la política ahora, pero esa política es más nueva que este desafío / respuesta. Como referencia (de hecho, si observa las marcas de tiempo, puede ver que presioné por la política debido a esta respuesta, pero aplicar reglas como esa en todo el sitio retroactivamente no tiene mucho sentido).
Martin Ender

12

Usando Unix KSH 27 28 32 27 bytes (o 21 si solo contamos dentro del comando sed)

Gracias a las sugerencias de otros :) Apreciado.

.. Me puse a esto:

sed 's/[^AEIOUÅÄÖ ]/&o&/ig'

(permitido para espacios y caracteres suecos)

echo "hello" | sed 's/[BCDFGHJ-NP-TV-Z]/&o&/ig'
hohelollolo
echo "HELLO" | sed 's/[BCDFGHJ-NP-TV-Z]/&o&/ig'
HoHELoLLoLO
echo "QuIcKlY Now" | sed 's/[BCDFGHJ-NP-TV-Z]/&o&/ig'
QoQuIcocKoKlolYoY NoNowow

44
Además, creo que es permisible reclamar que su respuesta es un sedprograma, y ​​solo contar los bytes entre las comillas simples
Digital Trauma

1
s/[^AEIOU]/&o&/igparece funcionar ... al menos para palabras sueltas ... también necesitará excluir espacios
Digital Trauma

1
bash, aunque el shell no debería importar, siempre y cuando su programa sed esté entre comillas simples
Digital Trauma

1
También esté atento a las vocales suecas ö, åetc - estos necesidad excluyendo también. Podría ser mejor usar una lista blanca de solo las consonantess/[BCDFGHJ-NP-TV-Z]/&o&/ig
Digital Trauma

2
Lo haría 'sed' y usaría "s / [^ AEIOUÅÄÖ] / & o & / ig", que cubre las vocales y espacios suecos para 25 bytes.
swstephe

7

CJam, 32 30 bytes

q{_eu'[,66>"EIOU"-#)g{'o1$}*}/

Este es un programa completo que lee desde STDIN e imprime en STDOUT. Funciona para la entrada arbitraria de Unicode y trata los siguientes 42 caracteres como consonantes:

BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz

Pruébalo aquí.

Explicación

q                              "Slurp STDIN.";
 {                          }/ "For each character...";
  _eu                          "Duplicate and convert to upper case.";
     '[,66>                    "Get a string from B to Z using range and slice.";
           "EIOU"-             "Remove the remaining four vowels.";
                  #            "Find the position of the character in this string or
                                -1 if the character can't be found.";
                   )g          "Increment, take signum, which gives 1 for consonants, 
                                and 0 otherwise.";
                     {    }*   "Repeat this block that many times, i.e. do nothing for
                                non-consonants.";
                      'o       "Push an 'o'.";
                        1$     "Copy the current character.";

5

JavaScript, 59 57 55 44 bytes

s=>s.replace(/(?![eiou])[b-z]/gi,"$&o$&")

¡Gracias a Masterzagh por recordarme que una función también sería aceptable, y por su consejo de expresiones regulares con respecto a las referencias posteriores sin capturar!

Versión más larga con entrada / salida:

alert(prompt().replace(/(?![eiou])[b-z]/gi,"$&o$&"));

Muestra un cuadro de aviso para ingresar la cadena, luego muestra un cuadro de diálogo que contiene la salida de Rövarspråket. El código usa una expresión regular para duplicar las consonantes e insertar os.


"Escriba un programa para convertir una cadena de letras suecas, ingresadas a través de una función o mediante una entrada estándar", puede hacerlos=>alert(s.replace(/(?![eiou])([b-z])/gi,"$1o$1"));

Y como no se le solicitó la salida, tampoco necesita la alerta.

Una cosa más, puede retroceder sin capturar . Básicamente s=>s.replace(/(?![eiou])[b-z]/gi,"$&o$&"), ya que $&significa coincidencia actual, puede eliminar el paréntesis que captura su letra y, mientras lo hace, guarde otro byte eliminando el punto y coma al final.

@Masterzagh Eso es genial, ¡gracias de nuevo!
ProgramFOX

4

Mathematica, 84 73 72 bytes

StringReplace[#,a:RegularExpression@"(?i)[BCDFGHJ-NP-TV-Z]":>a<>"o"<>a]&

Explicación:

  • RegularExpression@"(?i)[BCDFGHJ-NP-TV-Z]" es una expresión regular que coincide con todas las consonantes sin distinción entre mayúsculas y minúsculas.
  • a:*..*:>a<>"o"<>acrea una regla retrasada para unir esas consonantes ay reemplazarla con o rodeada por sí misma.
  • Finalmente, StringReplace[#,*..*]&crea una función pura aplicando esa regla a cada letra coincidente en su argumento.

@ MartinBüttner Gracias! Todavía nuevo en el golf de Mathematica ...
LegionMammal978

@ MartinBüttner iba a hacer eso de todos modos pero se distrajo con algunas notificaciones: P
LegionMammal978

4

Julia, 46 44 bytes

t->replace(t,r"(?![eiou])[b-z]"i,s->s*"o"*s)

Esto crea una función anónima que toma una sola entrada de cadena e imprime el equivalente de Rövarspråket. Para llamarlo, asígnele un nombre, por ejemplo f=t->....

No se ha jugado mucho golf aquí, aparte de los espacios después de las comas replace().

Aquí estamos usando 3 argumentos en la replace()función: la cadena de entrada, la expresión regular para identificar subcadenas y un reemplazo. Julia denota patrones de expresión regular por r"...". Agregar ial final lo hace insensible a mayúsculas y minúsculas. Esta expresión regular particular coincide con las consonantes. Si se usa una función para el reemplazo, la salida es esa función aplicada a cada subcadena coincidente. La función que estamos usando aquí toma una cadena sy regresa sos, ya que *realiza la concatenación de cadenas en Julia. Por lo tanto, el resultado final es la cadena de entrada con cada consonante duplicada con una "o" entre ellas.

Ejemplos:

julia> f("Min svävare är full med ål")
"MoMinon sosvovävovarore äror fofulollol momedod ålol"

julia> f("hello")
"hohelollolo"

julia> f("Rövarspråket")
"RoRövovarorsospoproråkoketot"

Tenga en cuenta que esto será 9 bytes más largo si tenemos que imprimir el resultado en lugar de devolverlo. En espera de confirmación por parte del OP.


Editar: ¡ Guardado 2 bytes gracias a Martin Büttner!


3

Haskell, 81 bytes

x n|elem n"bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ"=[n,'o',n]|1<2=[n]
f=(>>=x)

Uso: f "Hello there!"-> "HoHelollolo tothoherore!".

No puedo construir inteligentemente la lista de consonantes sin imports costosas . Incluso convertir la letra para verificar en minúsculas necesita más bytes que simplemente enumerar las consonantes en mayúsculas y minúsculas.



2

Perl, 33 bytes

Esta respuesta es principalmente de expresiones regulares, con una pequeña cantidad de código adicional para realizar E / S.

$_=<>;s/[^aeiou\W]/$&o$&/gi;print

Ha pasado un tiempo desde que usé expresiones regulares de Perl, por lo que esto probablemente pueda mejorarse.

$_=<>;                              This takes input from STDIN `<>` and stores
                                    it into the default variable $_
      s/          /     /gi;        This is a case-(i)nsentive, (g)lobal, 
                                    (s)ubstitution regex.  Since no other
                                    variable is specified, it is applied to
                                    the default variable $_.
        [^aeiou\W]                  This matches any single character that 
                                    is a consonant, by using a double-
                                    negative ^\W to match only alphanumeric 
                                    characters excluding vowels.  Accented 
                                    vowels are not considered alphanumeric 
                                    by Perl.
                   $&o$&            This forms the replacement.  $& contains the 
                                    match (the consonant), so this replaces each 
                                    consonant with two copies of itself with 
                                    an 'o' in between.
                            print   This prints the result.  With no arguments, 
                                    it prints $_ by default.

¿ [^aeiou]Todavía no coincidirá con å y otras vocales no ASCII?
Alex A.

@AlexA. Ya noté el problema. Fue una corrección de cero caracteres ( \sa \W).
PhiNotPi

+1, la explicación más completa para el código Perl que he visto en este sitio.
Zgarb

2

C (versión de ideone.com) - 133

Ok, esto es enorme. Pero C no tiene expresiones regulares. Por favor, dime si ves algo que pueda acortarlo ...

#define x (*c<66||*c>90)&&(*c<98||*c>122)||strchr("EIOUeiou",*c)?"":
c[2];main(){while(0<(*c=getchar()))printf("%s%s%s",c,x"o",x c);}

¿Cómo cse declara la variable local ?
wjl

Las variables globales @wjl en C son cero inicializadas. Las variables locales están en la pila y no se inicializan. Consulte stackoverflow.com/questions/3553559/… Variables sin un tipo predeterminado para int y dado que printf funciona en caracteres, el código puede tener problemas endian. Lo comprobaré mañana.
Jerry Jeremiah

Sí, entiendo la inicialización predeterminada. Solo intentaba señalar que este código no se compila, ya cque no se declara en absoluto, por ejemplo out.c:2:18: error: ‘c’ undeclared (first use in this function).
wjl

@wjl Supongo que depende del compilador. Se compila y se ejecuta en ideone.com ideone.com/s7M5mZ cuando elige C: ¿alguna idea de cuál es la diferencia?
Jerry Jeremiah

Parece un error con el compilador de ideone. Si arregla la nueva línea entre c[2];main(necesaria porque #defineno termina en punto y coma), da errores similares a GCC. De todos modos, no es gran cosa, sigue siendo una diversión código de golf, pero en realidad puede ser que necesite un poco más de caracteres para hacer esta válida C =)
WJL

2

Lote de Windows, 235 bytes

@echo off
setlocal enabledelayedexpansion
set d=qwrtypsdfghjklzxcvbnm
set #=%1
:x
if defined # (
for /l %%i in (0,1,20)do (
set m=!d:~%%i,1!
if /i !m!==%#:~0,1% set g=!g!!m!o)
set g=!g!%#:~0,1%
set #=%#:~1%
goto x)
echo %g%

Uso:

script.bat hello

Salida:

hohelollolo

Tal vez se pregunte por qué no configuré d en "aoui", la comprobación de no iguales requiere salir de un bucle. No todo lo que debería funcionar, funciona, por lotes. El script maneja 1 palabra de caracteres [como aparecen en su teclado]. Todos los espacios y líneas nuevas que todavía están presentes son necesarios para que se ejecute el script.

Se requiere Windows XP o superior. No probado en Windows 8 y superior.


2

PowerShell - 35 bytes

Solo para mostrar que PowerShell también puede competir en estos a veces, y con la expresión regular robada descaradamente de la respuesta de Martin Büttner Retina:

%{$_-replace'[b-z-[eiou]]','$0o$0'}

acepta entrada de cadena desde stdin


1

Pyth - 28 bytes

Esto funciona de la manera obvia al generar la lista de consonantes sobre la marcha utilizando la diferencia establecida.

FNzpk+N?+\oN}rNZ-{G{"aeiou"k

Explicación próximamente.

Pruébalo aquí .


Puede guardar 4 bits eliminando 4 caracteres y reemplazando un carácter por otro.
Jakube

1

Clip 10 , 30

gx"((?i)[b-z&&[^eiou]])""$1o$1

Sustitución básica de expresiones regulares.



1

Python, 61

No pude lograr que una unión o resta de clase de caracteres funcione, por lo que no creo que Python tenga esa característica. Tuve que usar un lookahead negativo en su lugar.

import re;f=lambda s:re.sub('(?i)(?![eiou])([b-z])',r'\1o\1',s)

Ejecútelo aquí: http://repl.it/fQ5

Enlace a la inversa: /codegolf//a/48182/34718


1

K, 38 caracteres

f:{,/(1+2*~(_x)in"aeiouåäö ")#'x,'"o"}

-1 f"Min svävare är full med ål";
MoMinon sosvovävovarore äror fofulollol momedod ålol

1

K, 31 bytes

,/{(x,"o",x;x)9>" aeiouåäö"?x}'

Una solución sencilla parece bastante competitiva dado que K carece de expresiones regulares. Seleccione entre la forma "XoX" y la forma "X" en función de si cada carácter se encontró en una tabla de búsqueda de vocales ignoradas y únase a las listas resultantes.

Puedes probarlo en tu navegador usando oK :

http://johnearnest.github.io/ok/index.html?run=%20%2C%2F%7B(x%2C%22o%22%2Cx%3Bx)9%3E%22%20aeiouåäö%22%3Fx%7D'%22Min%20svävare%20är%20full%20med%20ål%22

(Lamentablemente, no puedo proporcionar un enlace en el que se pueda hacer clic porque el desbordamiento de la pila no parece permitir caracteres acentuados en las URL)


0

Golfscript, 35 bytes

{."aeiouåäö\n "?-1={."o"\}{}if}%

Espera que la entrada esté en la pila. Con entrada (50 bytes):

"#{STDIN.gets}"{."aeiouåäö\n "?-1={."o"\}{}if}%

Trabaja con las vocales suecas å, ä y ö.


2
la entrada siempre está en la pila en GS
Optimizer

0

Sed (en línea de comando), 28 bytes

sed 's/\([^aeiou]\)/\1o\1/g'

Puede canalizar el texto o escribirlo directamente. Solo el código sed por sí solo es de 22 bytes.


3
Esto también duplica espacios y caracteres como ä.
ProgramFOX

0

R, 45 caracteres

gsub("([^aeiouäöå ])","\\1o\\1",readline(),i=T)

Regex simple. Lecturas de stdin. i=Tsignifica ignore.case=TRUE(gracias a la coincidencia parcial de los nombres de los argumentos), lo que hace que no se gsubdistinga entre mayúsculas y minúsculas.

Uso:

> gsub("([^aeiouäöå ])","\\1o\\1",readline(),i=T)
Min svävare är full med ål
[1] "MoMinon sosvovävovarore äror fofulollol momedod ålol"
> gsub("([^aeiouäöå ])","\\1o\\1",readline(),i=T)
hello
[1] "hohelollolo"
> gsub("([^aeiouäöå ])","\\1o\\1",readline(),i=T)
hElLo
[1] "hohElolLoLo"

0

<> <(Pez), 64 bytes

>" oieauåäöOIEAUÅÄÖ"0i:1+?!;01.
 :&=?\     l?!v&
^[0o&<&o"o"o:&<

No es la respuesta más corta, pero disfruto el desafío de programar en <> <

Pruébalo aquí


0

golflua, 36 bytes

B=I.r():g("[^aeiou%W ]","%1o%1")w(B)

Coincidencia de patrones simple: tome stdin, luego encuentre las no vocales ( %Wse ocupa de los caracteres no alfanuméricos) e inserte una oentre los dos reemplazos. Lamentablemente, hacer todo esto dentro de la escritura (es decir, w(I.r():g(....))) también genera el recuento de inserciones, aunque salvó 3 caracteres. Un equivalente de Lua sería

line = io.read()
rovar = line:gsub("[^aeiou%W ]","%1o%1")
print(rovar)

0

REXX, 107 bytes

parse arg s
v='aeiouåäö '
o=
do until s=''
  parse var s l 2 s
  if verify(l,v)>0 then l=l'o'l
  o=o||l
  end
say o

"MoMinon sosvovävovarore äror fofulollol momedod ålol"


0

JavaScript 43

Gracias a @Masterzagh por ahorrar en la sintaxis de la función.

x=>x.replace(/[bcdfghj-np-tv-z]/gi,"$&o$&")

JavaScript 62

function E(x){return x.replace(/[bcdfghj-np-tv-z]/gi,"$&o$&")}

Su función puede tener la forma de una función de flecha anónima como x=>x.replace(/[bcdfghj-np-tv-z]/gi,"$&o$&"). Las funciones de flecha funcionan así name=(arg1, arg2)=>{code}. ()no son necesarios si solo hay un argumento y {}no son necesarios si solo hay una línea de código. El retorno tampoco es necesario si la línea única devuelve algo.

Y se me olvidó decir. No necesita asignarle un nombre para resolver el problema, que solo le pide que cree una función.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.