Converter uma sequência em seu equivalente Rövarspråket


15

Rövarspråket

Rövarspråket é um jogo de palavras jogado por crianças suecas, dos livros sobre Kalle Blomkvist de Astrid Lindgren.

As regras básicas são as seguintes (da Wikipedia):

  • Cada consoante (a ortografia importa, não a pronúncia) é dobrada e um o é inserido no meio.
  • As vogais são deixadas intactas.

Alguns exemplos:

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

As consoantes suecas são iguais às inglesas; portanto, o programa deve funcionar com entradas suecas e inglesas.

A letra "y" é considerada consoante neste caso - como na maioria das vezes.


Sua tarefa:

Escreva um programa para converter uma sequência de letras suecas, inserida através de uma função ou através de stdin, no seu equivalente a Rövarspråket. Menor resposta em bytes ganha!


@ MartinBüttner Esclareceu ainda mais minha pergunta - ela deve funcionar com sueco (pois é um jogo de palavras sueco).
— James Williams

Qual o significado das entradas alfabéticas?
— Optimizer

@Optimizer Uma sequência de apenas caracteres alfabéticos. Desculpe, eu redigido a mal, eu vou editar
— James Williams

3
Como devemos tratar as não letras? Pelo menos espaços aparecem no segundo exemplo.
— nimi 24/03

2
Em uma nota lateral: 'Y' é considerado uma vogal em sueco
— leo

Respostas:


14

Retina , 14 + 5 = 19 bytes

Retina é uma linguagem que é essencialmente apenas regex .NET com o mínimo de sobrecarga possível. O código para este programa consiste em dois arquivos:

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

Isso lê a entrada em STDIN e imprime a saída em STDOUT.

Se você chamar os arquivos pattern.rgxe replacement.rpl, poderá executar o programa simplesmente como

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

Explicação

Isso é bem direto, mas deixe-me acrescentar algumas explicações de qualquer maneira (principalmente sobre como o Retina funciona). Se o Retina for chamado com 2 arquivos, presume-se que ele funcione automaticamente no "Modo Substituir", onde o primeiro arquivo é a regex e o segundo arquivo é o padrão.

A retina pode ser configurada (que inclui RegexOptionse outras opções), acrescentando o regex com `uma string de configuração. Nesse caso, estou fornecendo apenas io modificador regex normal para insensibilidade a maiúsculas e minúsculas.

Quanto ao próprio regex, ele usa a subtração de classe de caracteres do .NET para corresponder a qualquer consoante no intervalo ASCII. A substituição apenas grava a partida de volta duas vezes com um ointervalo.


Está faltando um ana sua classe de personagem de vogal?
— Brian Gordon

3
@BrianGordon Não, eu estou começando a classe de personagens b, então não preciso subtrair a.
— Martin Ender

2
Interessante, nunca vi intervalos de caracteres subtrativos aninhados antes. Isso é apenas uma coisa do .NET?
— 21815 Steve Bennett

Sinto que você precisa contar pelo menos um caractere para delimitar os dois arquivos. isso seria ponto-e-vírgula ou nova linha em outro idioma. é o espaço entre os nomes dos arquivos, se você quiser saber de onde vem o personagem nesse idioma.
— Sparr

@ Sparr sim, essa é a política agora, mas essa política é mais nova que esse desafio / resposta. Para referência (na verdade, se você olhar para os carimbos de data e hora, poderá ver que insisti na política por causa dessa resposta, mas a aplicação de regras como essa em todo o site retroativamente não faz muito sentido.)
— Martin Ender

12

Usando Unix KSH 27 28 32 27 bytes (ou 21, se contarmos apenas dentro do comando sed)

Obrigado às sugestões de outros :) Apreciado.

.. Eu comecei a isso:

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

(permitido para espaços e 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

4
Além disso, acho que é permitido afirmar que sua resposta é um sedprograma e apenas contar os bytes entre as aspas simples
— Digital Trauma

1
s/[^AEIOU]/&o&/igparece funcionar .. por palavras simples, pelo menos ... você vai precisar excluir espaços bem
— Digital Trauma

1
bash, embora o shell não deva importar, desde que o seu programa sed esteja entre aspas simples
— Digital Trauma

1
Também atente para as vogais sueco ö, å, etc - estes necessidade excluindo também. Talvez seja melhor usar uma whitelist de apenas as consoantess/[BCDFGHJ-NP-TV-Z]/&o&/ig
— Trauma Digital

2
Eu o tornaria 'sed' e usaria "s / [^ AEIOUÅÄÖ] / & o & / ig", que abrange vogais e espaços suecos por 25 bytes.
— swstephe

7

CJam, 32 30 bytes

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

Este é um programa completo que lê de STDIN e imprime em STDOUT. Ele funciona para entrada Unicode arbitrária e trata os seguintes 42 caracteres como consoantes:

BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz

Teste aqui.

Explicação

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$&")

Agradeço a Masterzagh por me lembrar que uma função também seria aceitável, e por sua dica de regex sobre referências anteriores sem capturar!

Versão mais longa com entrada / saída:

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

Exibe uma caixa de prompt para inserir a sequência e mostra uma caixa de diálogo contendo a saída Rövarspråket. O código usa uma regex para duplicar as consoantes e inserir os.


"Escreva um programa para converter uma sequência de letras suecas, inserida através de uma função ou através de stdin", você pode fazer issos=>alert(s.replace(/(?![eiou])([b-z])/gi,"$1o$1"));

E, como não foi solicitado a saída, você também não precisa do alerta.

Mais uma coisa, você pode voltar a fazer referência sem capturar . Basicamente s=>s.replace(/(?![eiou])[b-z]/gi,"$&o$&"), como $&significa correspondência atual, você pode remover os parênteses que capturam sua carta e, enquanto estiver nele, salvar outro byte, removendo o ponto e vírgula no final.

@Masterzagh Isso é legal, obrigado novamente!
— ProgramFOX

4

Mathematica, 84 73 72 bytes

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

Explicação:

  • RegularExpression@"(?i)[BCDFGHJ-NP-TV-Z]" é uma regex que corresponde a todas as consoantes sem distinção entre maiúsculas e minúsculas.
  • a:*..*:>a<>"o"<>acria uma regra atrasada para vincular essas consoantes ae substitui-a por e o cercada por ela mesma.
  • Por fim, StringReplace[#,*..*]&cria uma função pura que aplica essa regra a todas as letras correspondentes em seu argumento.

@ MartinBüttner Obrigado! Ainda novo para Mathematica golfe ...
— LegionMammal978

@ MartinBüttner Faria isso de qualquer maneira, mas se distraiu com algumas notificações: P
— LegionMammal978

4

Julia, 46 44 bytes

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

Isso cria uma função anônima que recebe uma única entrada de sequência e imprime o equivalente ao Rövarspråket. Para chamá-lo, dê um nome, por exemplo f=t->....

Não se jogou muita coisa aqui, além de espaços após as vírgulas replace().

Aqui, estamos usando três argumentos na replace()função: a sequência de entrada, a expressão regular para identificar substrings e uma substituição. Julia denota padrões de expressão regular por r"...". A adição iao final faz com que não seja sensível a maiúsculas. Essa regex específica corresponde às consoantes. Se uma função é usada para a substituição, a saída é essa função aplicada a cada substring correspondente. A função que estamos usando aqui pega uma string se retorna sos, pois *realiza concatenação de string em Julia. Assim, o resultado final é a sequência de entrada com cada consoante dobrada com um "o" entre.

Exemplos:

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"

Observe que isso terá 9 bytes a mais se precisarmos imprimir o resultado em vez de devolvê-lo. Aguardando confirmação do OP.


Editar: salvou 2 bytes graças 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!".

Não posso inteligentemente construir a lista de consoantes sem imports caros . Mesmo girar a letra para marcar em minúscula precisa de mais bytes do que simplesmente listar consoantes maiúsculas e minúsculas.


3

Java 8, 45

Use como uma função lambda. Usa expressão regular.

a->a.replaceAll("(?i)[b-z&&[^eiou]]","$0o$0")

Tente aqui


2

Perl, 33 bytes

Essa resposta é principalmente somente regex, com uma pequena quantidade de código extra para executar E / S.

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

Já faz um tempo desde que eu usei expressões regulares Perl, então isso provavelmente pode ser melhorado.

$_=<>;                              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]Ainda não corresponde a å e outras vogais não-ASCII?
— Alex A.

@AlexA. Eu já notei o problema. Foi uma correção de zero caracteres ( \spara \W).
— PhiNotPi

+1, a explicação mais completa para o código Perl que vi neste site.
— Zgarb 25/03

2

C (versão ideone.com) - 133

Ok, isso é enorme. Mas C não tem expressões regulares. Diga-me se você vê algo que pode torná-lo mais curto ...

#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);}

Como a variável local cé declarada?
— Wjl

As variáveis ​​globais do @wjl em C são zero inicializadas. Variáveis ​​locais estão na pilha e não são inicializadas. Consulte stackoverflow.com/questions/3553559/… Variáveis ​​sem um tipo padrão para int e como printf funciona em chars, o código pode ter problemas endian - vou verificar amanhã.
— 31415 Jerry Jeremiah

Sim, eu entendo a inicialização padrão. Eu estava apenas tentando enfatizar que esse código não é compilado, pois cnão é declarado , por exemplo out.c:2:18: error: ‘c’ undeclared (first use in this function).
— WJL

@ wjl Acho que depende do compilador. Compila e roda em ideone.com ideone.com/s7M5mZ quando você escolhe C - alguma idéia de qual é a diferença?
— Jerry Jeremiah

Parece um bug com o compilador de ideone. Se você corrigir a nova linha entre c[2];main(necessário porque #definenão termina em ponto e vírgula), ocorrerá erros semelhantes ao GCC. De qualquer forma, não é grande coisa, ainda é uma diversão código-golf, mas você pode realmente precisa de alguns mais caracteres para fazer este válida C. =)
— WJL

2

Lote do 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

Resultado:

hohelollolo

Você pode estar se perguntando por que eu não defini d como "aoui", para verificar se não é igual, é necessário interromper um loop. Nem tudo o que deve funcionar, funciona, em lote. O script lida com 1 palavra de caracteres [como eles aparecem no teclado]. Todos os espaços e novas linhas que ainda estão presentes são necessários para a execução do script.

Windows XP ou superior, necessário. Não testado no Windows 8 e acima.


2

PowerShell - 35 bytes

Apenas para mostrar que o PowerShell também pode competir nelas, e com o regex roubado descaradamente da resposta Retina de Martin Büttner:

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

aceita entrada de string de stdin


1

Pitão - 28 bytes

Isso funciona da maneira óbvia, gerando a lista de consoantes em tempo real usando a diferença entre conjuntos.

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

Explicação em breve.

Experimente aqui .


Você pode economizar 4 bits removendo 4 caracteres e substituindo um caracter por outro.
— Jakube 24/03



1

Python, 61

Eu não conseguia fazer com que uma união ou subtração de classe de personagem funcionasse, então não acho que o Python tenha esse recurso. Eu tive que usar um lookahead negativo em seu lugar.

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

Execute-o aqui: http://repl.it/fQ5

Link para o inverso: /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}'

Uma solução direta parece bastante competitiva, dado que K carece de regexes. Selecione entre o formulário "XoX" e o formulário "X" com base na localização de cada caractere em uma tabela de pesquisa de vogais ignoradas e entre nas listas resultantes.

Você pode experimentá-lo no seu 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

(Infelizmente, não posso fornecer um link clicável porque o excesso de pilha não parece permitir caracteres acentuados nos URLs)


0

Golfscript, 35 bytes

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

Espera que a entrada esteja na pilha. Com entrada (50 bytes):

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

Trabalha com os vovéis suecos å, ä e ö.


2
entrada está sempre na pilha no GS
— Optimizer

0

Sed (na linha de comando), 28 bytes

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

Canalize o texto ou digite-o diretamente. Apenas o código sed, por si só, tem 22 bytes.


3
Isso também duplica espaços e caracteres como ä.
— ProgramFOX

0

R, 45 caracteres

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

Regex simples. Lê de stdin. i=Tsignifica ignore.case=TRUE(graças à correspondência parcial dos nomes dos argumentos), o que torna as gsubmaiúsculas e 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

<> <(Peixe), 64 bytes

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

Não é a resposta mais curta, mas eu gosto do desafio de programar em <> <

Experimente aqui


0

golflua, 36 bytes

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

Correspondência simples de padrões: pegue stdin e encontre as não vogais ( %Wcuida de caracteres não alfanuméricos) e insira um oentre as duas substituições. Infelizmente, fazer tudo isso dentro da gravação (ou seja w(I.r():g(....))) também gera a contagem de inserções, embora tenha economizado 3 caracteres. Um equivalente Lua seria

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

Agradecemos ao @Masterzagh por economizar na sintaxe da função.

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

JavaScript 62

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

Sua função pode estar na forma de uma função de seta anônima como x=>x.replace(/[bcdfghj-np-tv-z]/gi,"$&o$&"). As funções de seta funcionam assim name=(arg1, arg2)=>{code}. ()não são necessários se houver apenas um argumento e {}não são necessários se houver apenas uma linha de código. O retorno também não é necessário se a linha retornar algo.

E eu esqueci de dizer. Você não precisa dar um nome para resolver o problema, que apenas solicitou a criação de uma função.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.