Ot wes thist uf tomis

36

Eu simplesmente amo esse código simples, é tão divertido ler palavras não muito legíveis por humanos e preencher as lacunas ...

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.

As regras são super simples:

  • Aceite algum texto como entrada (caracteres ascii, letras maiúsculas / minúsculas e pontuação).
  • Para cada vogal, gire-a para a próxima vogal ou volte ao início.
    • a => e
    • e => i
    • i => o
    • o => u
    • u => a
  • As vogais maiúsculas permanecem maiúsculas, as vogais minúsculas permanecem minúsculas.
  • Envie o texto após essas conversões.
  • Não há necessidade de apoiar sotaques.
  • Os demais caracteres devem permanecer inalterados.
  • Tente fazer isso no menor número de bytes.
  • Qualquer idioma antigo que você gosta.

Casos de teste

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.

Fora:

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.

Em:

The quick brown fox jumps over the lazy dog.

Fora:

Thi qaock bruwn fux jamps uvir thi lezy dug.

Em:

Home is where the heart is.

Fora:

Humi os whiri thi hiert os.

Em:

Boaty McBoatface

Fora:

Buety McBuetfeci

Em:

AEIOUaeiou

Fora:

EIOUAeioua

Em:

Programming Puzzles And Code Golf

Fora:

Prugremmong Pazzlis End Cudi Gulf
AJFaraday
fonte
20
Aka The Great Vogal Shift
Angs
4
Hmm. Olde English?
Iammax
10
Ainda é uma leitura mais fácil que Beowulf.
Smeato
4
Parece um tradutor de kiwi para mim.
Magoo 24/04
1
Eu gosto de como "mal", quando cifra para "ivol", é efetivamente pronunciado da mesma maneira.
Enrico Borba

Respostas:

11

Stax , 7 bytes

öΦΣòC└∞

Execute e depure

Experimente online!

Explicação (descompactada)

Vv:tVV:t
Vv:t           #Push aeiou and ring translate it to input
    VV:t       #Push AEIOU and ring translate it to input

Pode ser capaz de economizar mais, continuará tentando.

Multi
fonte
22

MS-SQL, 51 bytes

Funciona no SQL 2017 ou superior:

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

A nova função TRANSLATErealiza a substituição de caracteres individuais, sendo ideal para esse desafio.

A entrada é feita através de uma tabela preexistente t com a coluna varchar v , de acordo com nossas regras de IO .

Nesse caso, a tabela deve ser criada usando um agrupamento com distinção entre maiúsculas e minúsculas , executando em um servidor com distinção entre maiúsculas e minúsculas ou usando a COLLATEpalavra - chave (não contada no total de caracteres):

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

EDIT : SSMS pode cortar a citação longa acima ao retornar o resultado em uma janela "resultados para texto", esta é uma configuração do cliente, não um bug no meu programa .

Para corrigir, vá para Tools > Options > Query Results > SQL Server > Results to Texte aumente o "Número máximo de caracteres exibidos em cada coluna".

BradC
fonte
1
Estou genuinamente chocado que o SQL seja quase competitivo para isso. Além disso, é uma função interessante! Obrigado por nos dizer :)
Fund Monica's Lawsuit
@ NicHartley Sim, eles parecem adicionar algumas funções úteis a cada versão. Você também pode aninhar REPLACEalguns truques: REPLACE(TRANSLATE(v,'1234567890','xxxxxxxxxx'),'x','')para eliminar todos os números de uma sequência, por exemplo. Ainda longo, mas muito menor que 10 REPLACEs aninhados .
BradC
14

Haskell , 52 bytes

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

Experimente online!

Lynn me salvou dois bytes apontando que !!0é menor que head.

Explicação

Se você nunca codificou em Haskell, isso provavelmente parecerá uma pilha de bobagens. Então, primeiro vamos desmontar e depois dividir:

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

Primeiro, temos uma função !, que recebe uma string se um caractere c. Nossa primeira captura de correspondência de padrão aceita entrada se a sequência não estiver vazia. Se a string não estiver vazia, comparamos seu primeiro caractere com c. Se o primeiro caractere não for igual a, cnós o lançamos e chamamos !novamente com o restante da string e c. Se for igual, retornamos o segundo caractere na string.

Nossa próxima correspondência de padrões captura a string em todos os outros casos, ou seja, se a string estiver vazia. Neste caso, apenas retornamos c.

Em suma, essa função pega um caractere ce uma string se retorna o caractere após a primeira ocorrência de cin s. Se passarmos com aeiouaAEIOUAisso, executaremos nossa cifra em um único caractere. Para fazer toda a nossa função, devemos mapear isso através da string.

Assistente de Trigo
fonte
12

Retina ,10 9 8 bytes

T`uo`vVA

Experimente online!

Guardado 1 byte graças a Neil! E outro byte graças a Martin!

A nova versão da retina possui classes de vogais, o que torna o resultado um pouco mais curto. A transliteração também faz uso da classe "other". Portanto, a toclasse se parece com "aeiouAEIOUA", enquanto a fromclasse se parece com "uaeiouAEIOUA"

Isso não causa problemas, pois o segundo umapeamento para Anunca será feito, pois ujá foi mapeado para a.

FryAmTheEggman
fonte
9 bytes: T`_o`uvUV.
23418 Neil
Esta é uma resposta notavelmente curta!
precisa saber é o seguinte
@ Neil inteligente, obrigado! Eu pensei que colocar um _no set trataria isso literalmente, mas parece que não faz isso.
FryAmTheEggman
3
Você pode raspar mais um, mas eu não consigo amarrar Stax, infelizmente: tio.run/##HYnBDoIwEAXv/...
Martin Ender
@MartinEnder Thanks! Essa é uma configuração inteligente, misturando-se entre os dois. Ainda não tentei usar Ymuito, então vou tentar amanhã.
FryAmTheEggman #
9

Perl 5 + -p, 24 23 bytes

y;AEIOUaeiou;EIOUAeioua

Experimente online

-1 byte graças a @DomHastings

Nahuel Fouilleul
fonte
1
Não contamos mais -pcomo +1, mas consideramos que esta resposta está em "Perl 5 + -p".
Erik o Outgolfer
1
Isso também funciona em sed
Kritixi Lithos
1
Se você usar ;como delimitador, poderá salvar um byte!
Dom Hastings
atualizado, @Cowsquack não mais
Nahuel FOUILLEUL
6

Python 3, 62 bytes

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

Faça uma tabela de tradução (dicionário) com stro str.maketransmétodo estático . Traduzir caracteres relevantes para o caractere de destino.

mypetlion
fonte
Onde isso executa E / S?
reinierpost
@reinierpost É uma função. A entrada é via xparâmetro. Em python, as funções lambda não precisam de uma declaração de retorno.
mypetlion
6

C, 85 76 67 65 64 bytes

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

Porto de Kevin Cruijssen é Java resposta . Experimente online aqui .

Agradecimentos a Kevin Cruijssen por jogar 9 bytes, a Christoph por jogar 11 bytes e a roofcat pelo golfe de 1 byte.

Versão não destruída:

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
fonte
1
Parece não ser uma extensão padrão do gcc. Eu sabia do php e simplesmente tentei.
Christoph
1
@Christoph Gosto do seu uso de recursão, mas não tenho certeza de que possamos produzir um resultado final \0. Além disso, isso não funciona quando compilado com clang: tio.run/##S9ZNzknMS///...
OOBalance
1
@Christoph: Eu estava curioso para saber onde estava o comportamento indefinido, então depurei a versão clang, depois de desenredá-la um pouco mais. const char *res = strchr("AEIOU...", 0)retorna um ponteiro para o terminador na string literal. putchar(res[1])lê além do final da string literal. Aparentemente, com o gcc, ele encontra outro byte zero e funciona, mas com o clang ele obtém um 73 'I'(provavelmente da mainliteral da string "Era ...", mas não verifiquei o asm). Portanto putchar, não retorna 0, e eventualmente falhamos quando *c++lê uma página não mapeada.
Peter Cordes
2
@ PeterCordes sim, eu descobri sobre isso aqui depois de suspeitar. Enfim, aqui mais 2 bytes salvos f(char*c){for(;*c;)putchar(1[strchr("AEIOUAaeioua",*c++)?:c-2]);}. É tudo por agora, eu acho.
Christoph
1
@ Roger Por causa da propriedade comutativa da adição a[b]==*(a+b)==*(b+a)==b[a],. Portanto1[...]==(...)[1]
ceilingcat
5

Python 2 , 79 68 67 bytes

-1 byte graças a @ArnoldPalmer

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

Experimente online!

Gambá morto
fonte
67 bytes . Além disso, desculpe se você foi inundado por notificações, não publiquei um comentário há algum tempo e esqueci como fazê-lo.
Arnold Palmer
@ArnoldPalmer Thanks! Tudo bem, eu estava fora e todos sentiram minha falta: D
Dead Possum
5

JavaScript (ES6), 60 bytes

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

Experimente online!

Arnauld
fonte
s=>s.replace(/./g,c=>'auoieaAUOIEA'.match(".(?=${c})")||c)
TSH
Erro: only.=>unlya
l4m2 25/04
4

Pitão, 17 bytes

em=.rQdrB"aeiou"1

Experimente aqui

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.
Mnemônico
fonte
4

Tiago 2.0, 25 21 bytes

Eu me diverti jogando golfe com Shaggy.

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

Execute-o aqui.

Oliver
fonte
1
23 bytes
Shaggy
1
@ Shagy Isso não funciona com vogais em maiúsculas.
Oliver
1
Nesse caso ... 22 bytes .
Shaggy
1
@Shaggy Isso é divertido ... 21 bytes
Oliver
1
Agradável! Eu acho que é a primeira vez que eu vejo 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 depois de ter sido inspirado pela resposta JavaScript de @Arnauld (sua versão de 60 bytes) .

Experimente online.

Explicação:

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
fonte
4

05AB1E , 14 13 11 bytes

žMDÀ‡žMuDÀ‡

Experimente online!

Kaldo
fonte
1
Você pode salvar dois bytes simplesmente usando a entrada como uma sequência de linhas múltiplas, para que não haja necessidade de |e »: Experimente online: 11 bytes .
Kevin Cruijssen
@KevinCruijssen Thanks! Isso não foi corrigido em uma versão recente do 05AB1E?
Kaldo
Não faço ideia tbh. Só começou o 05AB1E desde o início deste ano. Você pode perguntar ao @Adnan no bate-papo 05AB1E quando o recurso foi adicionado, se você quiser saber.
Kevin Cruijssen
3

APL + WIN, 55 bytes

Solicita a sequência de entrada:

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

Caxumba, 38 bytes

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

O Mumps normalmente não adiciona um retorno de carro, já que não vi um requisito para separar entrada e saída, ele parece um pouco estranho na primeira execução. Por exemplo, a saída do último caso de teste é assim:

Programming Puzzles And Code GolfPrugremmong Pazzlis End Cudi Gulf

Se você deseja adicionar um retorno de carro, adicione dois bytes assim:

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

Vim + tpope / vim-abolish , 30 bytes

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

Solução alternativa, também 30 bytes:

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

De acordo com a meta , as respostas do vim podem usar plugins sem penalidade de bytes. Esta não é uma resposta vim, mas uma resposta vim + abolir .


Abolir é um plugin extremamente útil. Esta seção do README descreve bem como esse comando (o Subvertcomando) funciona.

DJMcMayhem
fonte
3

CJam , 29 19 bytes

q"aeioua"_eu+_1m<er

Experimente online!

-10 bytes graças a Peter Taylor

Explicação:

q                       # take all input
 "aeioua"               # push vowel pairs
         _eu            # duplicate, uppercase
            +_          # concatenate, duplicate again
              1m<       # rotate left by 1
                 er     # transliterate
vazt
fonte
Embora a pergunta não seja específica sobre a entrada, acho que você provavelmente deveria usar qe não lreceber entrada. O primeiro caso de teste parece ser multilinhas. Também você pode reduzir "eioua"para _1m<. Na verdade, você pode ir mais longe e jogar golfe com isso emq"aeioua"_eu+_1m<er
Peter Taylor
3

AutoHotkey , 24 bytes

O AuotHotkey substitui automaticamente as letras com distinção entre maiúsculas e minúsculas.

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

PHP, 90 bytes

Experimente online

Código

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

Explicação

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 se executado com o php -ruso$argv

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

str , 18 bytes

[aeiouaAEIOUA]#D#U

Experimente online!

Explicação

                       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
fonte
2

PHP, 38 bytes

Muito simples, não muito criativo, usa strtrpara substituir as vogais:

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

Execute com echo '<input>' | php -nF <filename>ou Experimente online .

David
fonte
Isso não pressupõe que a entrada esteja atribuída à variável predefinida argn? Se sim, então isso não é válido; você precisaria passar a string como argumento e usar $argv1].
Shaggy
2
@ Shaggy Não, se você executá-lo com o -Fsinalizador, ele funciona com entrada na linha de comando. Nos documentos do PHP sobre as opções : -F --process-file PHP file to execute for every input line. Added in PHP 5.A definição da variável Try it online é apenas porque algumas pessoas não têm o PHP instalado localmente, e eu não consegui fazer o -Fsinalizador funcionar no TIO.
Davіd
1
Obrigado, @ David - essa é a minha "algo novo" para PHP hoje :)
Shaggy
2

q / kdb +, 36 33 bytes

Solução:

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

Exemplos:

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"

Explicação:

Descobrir o índice de vogais, adicionar um para avançar e avançar. Ainda acho que essa abordagem pode ser significativamente melhorada ...

{(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

Bônus:

Minha antiga solução de ** 36 bytes (()) que eu acho muito legal, mas preciso jogar as listas para torná-la competitiva:

ssr/[;"uoiea%UOIEA%";"%uoiea%UOIEA"]
rua
fonte
2

Carvão , 35 bytes

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

Experimente online!

Método ingênuo.

Explicação:

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)
Somente ASCII
fonte
2

PHP , 76 bytes.

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

Confira!

Este foi o mais curto que pude fazer isso em 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
        )
    );
Mal-humorado diz Restabelecer Monica
fonte