Introdução
Acontece que os alienígenas amam memes tanto quanto nós. Toda raça alienígena que encontramos até agora tem sua própria versão 2spooky4me
(veja a pergunta seguinte ) e equivalente, no entanto, com algumas variações. Os habitantes do planeta CUTE1f não conseguem lidar com muito fantasma, então o 1spooky2me
fantasma preferido deles é , enquanto os membros do skeletor7 os amam, então eles tendem a usar 9spooky11me
.
Desafio
Traduzir memes é um trabalho árduo, então você foi encarregado de escrever um tradutor universal de memes para ajudar esses caras a acessar o memenet corretamente. Seu programa aceitará um meme e uma transformação para aplicar às seqüências de dígitos desse meme para torná-lo apropriado para os habitantes de um planeta diferente.
Entrada
Seu programa receberá duas entradas de sequência:
- O meme de entrada (por exemplo
2spooky4me
). Jogos [a-zA-Z0-9]+
.
- A transformação a ser aplicada a ela (por exemplo
+1
, para passar de 2spooky4me
para 3spooky5me
). Jogos [+\-*/^]\d+
(você deve aceitar +
, -
, *
, /
, e ^
como operadores, independentemente da representação nativa na sua língua).
Resultado
Seu programa deve retornar uma saída de sequência (impressa na saída padrão ou equivalente) com a transformação fornecida aplicada às seqüências de dígitos no meme de entrada. Em uma mudança estranha de eventos, também acontece que todas as raças encontradas até agora preferem memes integrais a memes fracionários, portanto essas transformações devem executar aritmética inteira (por exemplo, 1spooky1me /2
deve resultar em 0spooky0me
).
Exemplos
As operações aritméticas padrão se aplicam:
Input: 2spooky4me +1
Output: 3spooky5me
Input: 2spooky4me -1
Output: 1spooky3me
Input: 2spooky4me *15
Output: 30spooky60me
Input: 10spooky900me /5
Output: 2spooky180me
Sequências de dígitos são integrais; truncamento inteiro deve ocorrer em casos como este:
Input: idontunderstandmemes3 /2
Output: idontunderstandmemes1
Sua entrada pode não ter nenhuma sequência de dígitos:
Input: notreallyafunnymeme *100
Output: notreallyafunnymeme
Você deve oferecer suporte à exponenciação, mesmo que não seja uma operação nativa no idioma de sua escolha:
Input: 2spooky4me ^3
Output: 8spooky64me
Não há limite para o comprimento da string do número de seqüências de dígitos na string:
Input: some1meme2sequences3can4be5really6long7 /2
Output: some0meme1sequences1can2be2really3long3
Termo aditivo
Se seu idioma suportar números inteiros de precisão arbitrária como um recurso de idioma, você deverá usá-los. Caso contrário, não é necessário oferecer suporte a números inteiros de precisão arbitrária. Por exemplo, você deve usar o Integer
Haskell em vez de Int
estar disponível como parte do idioma; em Java
, você não precisa usar BigInteger
porque é um recurso de biblioteca, não um recurso de idioma.
Input: 2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000spooky4me /2
Output: 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000spooky2me
Isso é código-golfe , portanto , brechas comuns são proibidas e a resposta mais curta em bytes vence!
Entre os melhores
O snippet de pilha na parte inferior desta postagem gera o cabeçalho das respostas a) como uma lista da solução mais curta por idioma eb) como um cabeçalho geral.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
## Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
## Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 79809; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 45941; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
BigInteger
para seus cálculos?Respostas:
Jolf,
1514 bytesExperimente aqui!
Explicação
É interessante notar que atualizei o Jolf após esse desafio, adicionando alguns recursos internos do RegExp. Pode ser
1211 bytes:fonte
Ruby,
504443 bytesResposta FGITW. Tenho que ir rápido!
Obrigado a @Neil por salvar 6 bytes.
Oh certo, riscado 44 ainda é 44
fonte
a=gets;$><<gets.gsub(/\d+/){eval$&+a}
. A minha perdeu a coisa ^! = ** e, provavelmente, é um pouco mais longa.^
. : DPerl,
3634 bytesO código fonte tem 30 bytes e requer os comutadores
-pi
( +4 bytes ). Leva a primeira entrada de STDIN, a segunda entrada como argumento para-i
.Graças a @DenisIbaev por jogar fora 2 bytes!
Teste em Ideone .
fonte
-pi
é de 4 bytes?-pi
o resto do comando."0|$&"
é mais curto que"0|".$&
."0|$&$^I"
também funciona. Obrigado!PowerShell v2 +,
139137 bytesOoof ... 47 bytes apenas para explicar,
^
pois esse não é um operador nativo no PowerShell. Economizou 2 bytes graças a @TessellatingHeckler.Toma de entrada como
$a=<word>
,$b=<operation>
, como.\universal-spooky-meme.ps1 2spooky4me ^3
. Colocamos os-split
$a
dígitos entre parênteses para manter os delimitadores e canalizar a matriz resultante através de um loop|%{...}
. Se a peça atual é um número, estamos na primeiraif
. Precisamos verificar se o primeiro caractere de$b
é^
. Caso contrário, concatenamos nossa peça atual$b
e a enviamos paraiex
(semelhante aeval
), deixando-a no pipeline. Caso contrário, precisamos criar uma cadeia de exponenciação com"$_*"*$b.Trim('^')+1
e canalizar isso paraiex
, e deixá-lo no pipeline. Para o2spooky4me ^3
exemplo dado , este será2*2*2*1
e4*4*4*1
, respectivamente.Caso contrário, deixamos a string como está no pipeline.
Todos esses resultados são coletados do pipeline com os parênteses de encapsulamento antes de serem
-join
reunidos novamente em uma sequência. Essa é a re-esquerda no pipeline e a saída está implícita na finalização do programa.Exemplos
fonte
Floor(("$_$b"|iex))
porFloor((iex $_$b))
salvar um casal, ou talveziex $_+$b
.JavaScript (ES7),
5857 bytesEdit: Salvo 1 byte quando me lembrei que
replace
também funciona em seqüências de caracteres literais.fonte
Pyth, 29
Isso funciona extraindo cada número do meme e, em seguida, intercalando (
.i
), seguido de um espaço e envolvido em uma lista com o outro argumento. Portanto, se o nosso número é7
e tivemos^20
que iria obter a lista:["^", "7 ", "20"]
. Achatar e usar Pyth'seval
(.v
) sempre dão a operação que queremos. Finalmente, esses valores são intercalados com a string original dividida nas ocorrências de números.Pode ser um byte mais curto se as duas entradas estiverem entre caracteres de aspas ou dois bytes mais curto se apenas uma delas puder ser citada.
Experimente aqui ou execute um Conjunto de Testes
fonte
Python 2,
156898887 bytesInspirado nas outras respostas que usam a função de substituição de seus idiomas com um manipulador de funções para processar as partes numéricas da
i
cadeia de caracteres de entrada longa com oo
perator. Para azar do Python, ele^
deve ser substituído por**
, que custa 18 bytes. A.group(0)
chamada apenas para acessar a representação de string do objeto de correspondência não melhora as coisas ...Obrigado ao QPaysTaxes por detectar um espaço falso e ao RootTwo pelo argumento desnecessário
.group
!fonte
i,o:
p.group()
. (o padrão é 0); e (2) inserirr=re.sub;
substituir primeirare.sub
chamada comr
e, em seguida, utilizarr('^','**',o)
em vez deo.replace(...)
r('^','**',o)
então precise de escapar^
para\^
a fim de coincidir com o personagem, não o início deo
líquido não poupando bytes :-( - mas Obrigado por apontar o desnecessário0
!Javascript (ES6) 99 bytes
Outro exemplo, por que odiamos esperar que o ES7 obtenha compatibilidade
Exemplo executável:
fonte
\d+|\D+
, o que é equivalente a.+
.[a-zA-Z0-9]+
é o regex que você quer, não? Ou[a-zA-Z]+|[0-9]+
se a divisão faz a diferença?Math.pow
diretamente, já que você está precisando fazer um caso especial. Além disso, você está usando divisão inteira?\d+|\D+
Não é exatamente o mesmo que.+
. Eles não são os mesmos porque a expansão kleene acontece antes daor
. Seria o mesmo se parecesse(\d|\D)+
, mas, como é, não corresponderia a todos, digamos,2a
em um grupo, seriam dois grupos separados.Julia,
715954 bytesO requisito de uso,
big
se disponível, torna isso muito mais longo do que poderia ser ...Experimente online!
fonte
Kotlin,
416413 bytesA falta de um
eval()
em Kotlin realmente aumentou a contagem de bytes ...Experimente Online!
Ungolfed
fonte
PowerShell (v4),
124120 bytes(as novas linhas estão aqui apenas para evitar a rolagem horizontal; elas funcionam quando salvas como uma linha).
Foram solicitados comentários e versão ungolfed:
iex
é comoeval()
em outros idiomas. Apenas faz"2spooky" "+3"
->eval("2+3")
^
operador ou qualquer outra exponenciação conveniente como**
, ele só pode usar a[math]::Pow()
chamada de biblioteca para que haja um grande bloco para lidar com esse ramo."2*" * n
que se torna"2*2*2*2*"
e depois adiciona+1
ao final a multiplicação por uma, em vez de reclamar sobre o final*
.[math]::Truncate()
. Em vez disso, salvei caracteres usando-replace
para aparar um ponto decimal e qualquer coisa depois dele.Casos de teste:
NB No último teste, os números
[BigInteger]
passam para o tipo automaticamente, mas são renderizados em notação científica. Felizmente, toda raça conhecida, capaz de se comunicar entre as estrelas, tem desenvolvimento científico suficiente para processar a notação científica sem problemas.fonte
Coreutils do Bash + GNU, 144 bytes
Isso examina a alteração entre dígitos e não dígitos, é por isso que um caractere de entrada inválido aleatório (vírgula) é anexado à sequência de entrada. Essa vírgula é então ignorada na saída. A convenção do OP segue exatamente a sintaxe
bc
usada aqui para fazer as contas.fonte
Lua,
14593 bytesfonte
R, 163 bytes
Como alguém que está aprendendo expressões regulares e substituição de cordas em R, isso provou ser um desafio bastante difícil. Especialmente porque combinar os números é fácil, mas não consegui encontrar uma maneira de usar várias substituições
gsub
. Além disso, não sei seeval(parse(paste0(...
é a maneira mais eficiente de alternar entre operações. Talvez aswitch
função-seja mais adequada aqui.Explicação
fonte
Javascript (ES6), 85 bytes
Ungolfed:
fonte
()
ao redor do argumento lambda, você não precisavar
, e você deve usar parênteses e o operador de vírgula em vez de chaves ereturn
^
é um caso especial para JavaScript, é um XOR bit a bit em vez de #Math.pow
Groovy,
6460 bytesSubstitui todas as instâncias de dígitos por um fechamento que avalia a operação nas partes dos dígitos da palavra passada. Se aprovada uma função de expoente, ela será substituída pela notação adequada. O Groovy manipula implicitamente a conversão BigInteger / BigDecimal ao usá-lo
Eval.me()
porque as seqüências de caracteres analisadas podem estar fora do2^32-1
intervalo.Explicado
{a,b->...}
- Encerramento com dois argumentos.a.replaceAll(/\d+/,{...})
- Pesquise todas as seqüências de dígitos na string e substitua por um fechamento.{Eval.me(it+b.replace("^","**"))}
- Mais especificamente, um fechamento com cada partida tendo a operação anexada a ela e depois avaliada como um código groovy..replace("^","**")
- Substitua a primeira instância do^
operador com expoente de groovy**
na operação fornecida. Se você deseja que isso funcione com cadeias de equação completas que usam expoentes, usereplaceAll()
uma penalidade de +3 bytes.Nota lateral divertida é um cenário de teste válido:
(22348952345238905290858906209862398036spooky409552me, /200*4943^8-23939+((100/203)+600)
fonte
RProgN , 39 bytes
Explicado
Resposta tecnicamente inválida, porque esse idioma não existia. No entanto, não foi projetado especificamente para isso, nem qualquer adição específica. Então, eu estou executando. Processe-me.
Experimente Online!
fonte
Perl 6, 111 bytes
Infelizmente
EVAL
está desativado por padrão. Além disso, você deve usardiv
para divisão inteira.fonte