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.