É uma cor do arco-íris?
Desafio:
O desafio é determinar se uma cor, dado seu nome, é uma das cores do arco-íris.
Quando fornecido com uma cor, seu programa deve produzir um valor verdadeiro se for uma cor do arco-íris e um falso caso contrário.
Regras:
- As opções de entrada possíveis são exaustivas e definidas nos casos de teste. Você pode presumir que não receberá nenhuma outra entrada além das definidas
- As letras maiúsculas e minúsculas para entradas podem ser uma das seguintes: MAIÚSCULAS, minúsculas ou Maiúsculas e minúsculas, mas devem ser consistentes
- Falhas padrão não permitidas
Casos de teste:
Verdade:
redorangeyellowgreenblueindigoviolet
Falsy:
purplebrownpinkcyanmaroon
Entre os melhores:
var QUESTION_ID=214678;
var OVERRIDE_USER=97730;
var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;function answersUrl(d){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+d+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(d,e){return"https://api.stackexchange.com/2.2/answers/"+e.join(";")+"/comments?page="+d+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(d){answers.push.apply(answers,d.items),answers_hash=[],answer_ids=[],d.items.forEach(function(e){e.comments=[];var f=+e.share_link.match(/\d+/);answer_ids.push(f),answers_hash[f]=e}),d.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(d){d.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),d.has_more?getComments():more_answers?getAnswers():process()}})}getAnswers();var SCORE_REG=function(){var d=String.raw`h\d`,e=String.raw`\-?\d+\.?\d*`,f=String.raw`[^\n<>]*`,g=String.raw`<s>${f}</s>|<strike>${f}</strike>|<del>${f}</del>`,h=String.raw`[^\n\d<>]*`,j=String.raw`<[^\n<>]+>`;return new RegExp(String.raw`<${d}>`+String.raw`\s*([^\n,]*[^\s,]),.*?`+String.raw`(${e})`+String.raw`(?=`+String.raw`${h}`+String.raw`(?:(?:${g}|${j})${h})*`+String.raw`</${d}>`+String.raw`)`)}(),OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(d){return d.owner.display_name}function process(){var d=[];answers.forEach(function(n){var o=n.body;n.comments.forEach(function(q){OVERRIDE_REG.test(q.body)&&(o="<h1>"+q.body.replace(OVERRIDE_REG,"")+"</h1>")});var p=o.match(SCORE_REG);p&&d.push({user:getAuthorName(n),size:+p[2],language:p[1],link:n.share_link})}),d.sort(function(n,o){var p=n.size,q=o.size;return p-q});var e={},f=1,g=null,h=1;d.forEach(function(n){n.size!=g&&(h=f),g=n.size,++f;var o=jQuery("#answer-template").html();o=o.replace("{{PLACE}}",h+".").replace("{{NAME}}",n.user).replace("{{LANGUAGE}}",n.language).replace("{{SIZE}}",n.size).replace("{{LINK}}",n.link),o=jQuery(o),jQuery("#answers").append(o);var p=n.language;p=jQuery("<i>"+n.language+"</i>").text().toLowerCase(),e[p]=e[p]||{lang:n.language,user:n.user,size:n.size,link:n.link,uniq:p}});var j=[];for(var k in e)e.hasOwnProperty(k)&&j.push(e[k]);j.sort(function(n,o){return n.uniq>o.uniq?1:n.uniq<o.uniq?-1:0});for(var l=0;l<j.length;++l){var m=jQuery("#language-template").html(),k=j[l];m=m.replace("{{LANGUAGE}}",k.lang).replace("{{NAME}}",k.user).replace("{{SIZE}}",k.size).replace("{{LINK}}",k.link),m=jQuery(m),jQuery("#languages").append(m)}}
body{text-align:left!important}#answer-list{padding:10px;float:left}#language-list{padding:10px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/primary.css?v=f52df912b654"> <div id="language-list"> <h2>Winners 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><a href="{{LINK}}">{{SIZE}}</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr></tbody> </table>
Respostas
Haskell , 28 bytes
(`elem`"albedo").(!!8).cycle
Experimente online!
Se envolvermos a entrada e o índice na posição 8, todas as cores do arco-íris geram uma letra entre "albedo", mas as cores não-arco-íris não (elas geram uma letra entre "rwpc").
redredre d red
orangeor a nge
yellowye l low
greengre e ngr
blueblue b lue
indigoin d igo
violetvi o let
purplepu r ple
brownbro w nbr
pinkpink p ink
cyancyan c yan
maroonma r oon
Retina 0.8.2 , 7 bytes
A`p
d|e
Experimente online! O link inclui casos de teste. Presume a entrada em minúsculas. Saídas diferentes de zero para as cores do arco-íris, zero para as outras entradas. Explicação: Simplesmente verifica se a cor contém as letras dou enão p.
Versão de 64 bytes para verificar os 21 casos específicos de cores do arco-íris em três maiúsculas diferentes:
T`L`l`^[A-Z]+$|^. ^(red|orange|yellow|green|blue|indigo|violet)$
Experimente online! O link inclui casos de teste. Explicação: Uma entrada em maiúsculas ou o caractere inicial é em minúsculas, após o que as cores exatas são correspondidas.
K (ok) , 23 19 18 12 bytes
^"rwpc"?*|9#
Experimente online!
Presume a entrada em minúsculas; com base em uma versão invertida da resposta Haskell de @Lynn .
9#repetindo - pegue 9 caracteres da entrada, por exemplo, "purplepur"*|primeiro reverso, ou seja, último"rwpc"?caractere de pesquisa na string "rwpc", retornando o índice da correspondência ou um nulo se não estiver presente^verifique senull, ou seja, converta nulos em1e índices reais em0
Gelatina , 6 bytes
,2ḥ93Ḃ
Experimente online!
Usa a função de hash Jelly. 5 pode ser possível.
05AB1E , 7 bytes
Aceita a entrada em minúsculas.
CƵl%3%È
Experimente online! ou Verifique todos os casos!
Cconverte a cor do binário. Isso permite dígitos maiores que 1, onde os caracteres maiúsculos são 10para 35e os minúsculos 36para 61:
C("red") = "r"*2**2 + "e"*2**1 + "d"*2**0 = 53*4 + 40*2 + 39 = 331
Ƶlé o inteiro compactado 148, o código calcula
is C(color)%148%3 Èven?
R , 41 33 bytes
sd(utf8ToInt(scan(,"")))%%.195<.1
Experimente online!
Menos elegante do que a solução de Giuseppe , mas 3 11 bytes mais curta.
Converte a entrada (em minúsculas) em pontos de código ASCII, obtém o desvio padrão dos inteiros resultantes e, em seguida, obtém aquele módulo 0.195(encontrado por uma pesquisa de grade). O resultado é menor do que 0.1se a entrada for verdadeira.
C (gcc) , 22 21 bytes
f(int*s){s=*s/203&1;}
Experimente online!
Inspirado pela resposta de ErikF. Eu escrevi um pequeno programa para força bruta nas constantes.
Python 2 , 22 bytes
lambda s:hash(s)%683%2
Experimente online!
-1 graças a ovs , que usou o grau extra de liberdade proporcionado pelo invólucro de entrada flexível para salvar um byte.
Jelly , 21 14 12 10 bytes
“dʋ»e€µṪ<Ẹ
Experimente online!
Aceita a entrada em minúsculas. Adaptação do método de Neil
Golfe:
- -10 bytes mudando a string compactada
- -5 bytes adaptando o método coltim
- -2 bytes usando o método de Neil
Como funciona
“dʋ»e€µṪ<Ẹ - Main link. Takes S on the left
“dʋ» - Compressed string; Yield "dep"
€ - For each character in "dep":
e - Is it in S?
µ - Use this triplet as the new argument
Ṫ - Take the final element (1 if p is present, else 0)
Ẹ - Are either "d" or "e" in S?
< - The tail is 0 and either "d" or "e" are in S
Gelatina , 8 7 bytes
9ịe“\Ṙ»
Experimente online!
Pegue o nono caractere (quebra automática) e verifique se ele está na string compactada “\Ṙ»= “albedo”.
Porto da minha resposta Haskell. caird salvou um byte: a coincidência de que albedo é uma palavra em inglês na verdade ganha bytes 9ịe“albedoou 9ịḟ“rwpc, devido ao dicionário de compressão de Jelly.
R , 35 28 27 26 bytes
Editar: -1 byte graças a Dom Hastings e -1 byte graças a caird coinheringaahing
!grepl("ro|p|c",scan(,''))
Experimente online!
Verificação de expressão regular.
'marrom' + 'marrom' contêm ambos 'ro', 'roxo' e 'rosa' contêm 'p'e 'ciano' contém 'c'.
Perl 5 , 13 12 bytes
Editar: -1 byte retornando string nula como falsa, graças a Nahuel Fouilleul
$_=!/ro|p|c/
Experimente online!
Mesma abordagem que minha resposta R (com ajuda de Dom Hastings + Caird Coinheringaahing), mas provavelmente mais adequada para [Perl] ...
(Edit: percebeu que portar resposta Retina de Neil é realmente mais curto a também a apenas agora ligeiramente mais longo em 13 bytes )
Pyth , 9 bytes
%%Cz283 2
Experimente online!
Respondendo minha própria pergunta agora que outros me venceram ... (Para sua informação, resolvi isso após postar)Explicação:
- Converte para int com base 256
- Módulo que por 283
- Módulo por 2.
1 se cor do arco-íris, 0 se não.
Japt -! , 13 9 8 bytes
g8 k`þ
Tente
Carvão , 10 9 bytes
›⁶³﹪⍘Sβ⁹⁴
Experimente online! O link é para a versão detalhada do código. Aceita a entrada em minúsculas. A saída é um booleano Charcoal, ou seja, -se for arco-íris, nada se não for. Explicação:
S Input word
⍘ β Decoded as base 26 using lowercase alphabet
﹪ ⁹⁴ Modulo literal 94
›⁶³ Check whether 63 is greater than the result
Implicitly print
Python 3 , 71 56 44 bytes
-15 bytes graças a @Scott
-12 bytes graças a @ovs
lambda s:(s[0]<'c'<'r'==s[1])==(s[0]in'pcm')
Experimente online!
R , 60 44 bytes
!scan(,"")%in%colors()[c(547,32,536,68,455)]
Experimente online!
-13 graças a Robin Ryder.
Aceita a entrada em letras minúsculas. Verifica se a cor não é uma das cores excluídas.
Superado por Robin Ryder e Dominic van Essen .
C (gcc) , 34 bytes
A função recebe uma cor em minúsculas e retorna 1se for a cor do arco-íris, caso contrário 0.
Para economizar espaço, eu hash os primeiros quatro caracteres da cor com módulo 81 (o primeiro número que não teve colisões e tinha todos os restos imprimíveis) e procuro por isso na lista de hashes para as cores não-arco-íris. Se não houver correspondência, é uma cor do arco-íris.
f(int*s){s=!index("D@M1&",*s%81);}
Experimente online!
Eu poderia economizar dois bytes se retornar 0para uma cor de arco-íris e diferente de zero para um não-arco-íris fosse permitido:
f(int*s){!index("D@M1&",*s%81);}
Experimente online!
JavaScript (ES6), 20 bytes
s=>!/ro|p|c/.test(s)
Experimente online!
Como funciona: obtenha um valor verdadeiro se roestiver presente, pestiver presente ou cestiver presente e, em seguida, inverta esse valor para que, se estiverem presentes, o resultado é falso, caso contrário, o resultado é verdadeiro
Veja o regex aqui (Regex101.com)
JavaScript (ES6), 22 bytes
s=>!/p|[^e]n$/.test(s)
Experimente online!
Como funciona: obtenha um valor verdadeiro se começar pou terminar nsem um eantes. O !inverte esse valor para que ele retorne verdadeiro se não houver correspondência e falso se houver correspondência. Eu tentei várias outras regexs que acabaram tendo o mesmo comprimento, então optei por esta, pois é fácil de explicar.
Veja o Regex aqui (Regex101.com)
Formato de texto WebAssembly , 111 bytes
(func(result i32)i32.const 0 i32.load i32.const 8 i32.load i32.add i32.const 13 i32.rem_s i32.const 7 i32.le_s)
Esta função opera em uma matriz de memória inteira, que deve começar pré-preenchida com a cor escolhida (em caixa do título) como uma lista de pontos de código ascii. (strings não podem ser fornecidas como argumentos de função normais em webassembly). A função retornará 1 se for uma cor do arco-íris ou 0 se não for.
A lógica real por trás da função é efetivamente o seguinte: return (mem[0] + mem[8]) % 13 <= 7. (cada caractere da cor ocupa 4 bytes no array de memória, então o índice de bytes 8 se refere a um índice de caracteres 2). O formato de texto WebAssembly real é projetado para parecer uma máquina de pilha, portanto, instruções como i32.const 8colocar um 8 na pilha enquanto retirará i32.adddois itens da pilha, os adicionará e colocará o resultado novamente.
A seguir está um arquivo WebAssembly completo com a função acima embutida.
(module
(import "api" "mem" (memory 1))
(func(result i32)i32.const 0 i32.load i32.const 8 i32.load i32.add i32.const 13 i32.rem_s i32.const 7 i32.le_s)
(export "check" (func 0))
)
Isso pode ser compilado em um binário WebAssembly (um arquivo wasm binário pode ser gerado e baixado por meio de ferramentas de conversão wat to wasm online como esta ).
O seguinte javascript executa o binário compilado. Ele contém a lógica para criar o array de memória, pré-preenchido com uma cor. Por conveniência, ele tem o binário WebAssembly incorporado.
// Byte array generated by putting the WAT text into https://mbebenita.github.io/WasmExplorer/
// then downloading the resulting wasm file
// then running [...require('fs').readFileSync('path/to/file.wasm')]
const bytes = new Uint8Array([0,97,115,109,1,0,0,0,1,133,128,128,128,0,1,96,0,1,127,2,140,128,128,128,0,1,3,97,112,105,3,109,101,109,2,0,1,3,130,128,128,128,0,1,0,6,129,128,128,128,0,0,7,137,128,128,128,0,1,5,99,104,101,99,107,0,0,10,153,128,128,128,0,1,147,128,128,128,0,0,65,0,40,2,0,65,8,40,2,0,106,65,13,111,65,7,76,11])
// Alternativly, you can read from the raw wasm file after generating it.
// const bytes = require('fs').readFileSync('./output.wasm')
async function initWaModule() {
const mem = new WebAssembly.Memory({initial:1})
const { instance } = await WebAssembly.instantiate(bytes, { api: {mem}, })
return {
isRainbowColor(color) {
// Insert color param into memory
const i32Array = new Uint32Array(mem.buffer);
i32Array.fill(0)
const colorAsCodePoints = [...color].map(c => c.charCodeAt(0))
i32Array.set(colorAsCodePoints)
// Run webassembly function
return !!instance.exports.check()
}
}
}
const TRUE_COLORS = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet']
const FALSE_COLORS = ['Purple', 'Brown', 'Pink', 'Cyan', 'Maroon']
;(async () => {
const { isRainbowColor } = await initWaModule()
console.log('These should be true')
TRUE_COLORS.forEach(color => console.log(color, isRainbowColor(color)))
console.log('These should be false')
FALSE_COLORS.forEach(color => console.log(color, isRainbowColor(color)))
})()
05AB1E , 14 8 bytes
-6 bytes graças a @ovs .
'•³€å¤-à
Experimente online!
'•³€å¤-à # full program
- # subtract...
¤ # last element of...
å # is...
€ # each character of...
# implicit input...
å # in...
'•³ # "deep"...
- # from...
# (implicit) each element of...
å # is...
€ # each character of...
# implicit input...
å # in...
'•³ # "deep"
à # greatest element of list
# implicit output
JavaScript (ES9), 23 bytes
Semelhante à resposta Retina de Neil , mas com um olhar negativo para trás para evitar que haja correspondência.purple
s=>/d|(?<!pl)e/.test(s)
Experimente online!
JavaScript (ES6), 25 bytes
O caso não importa. Retorna um valor booleano.
s=>parseInt(s,35)%385%3>1
Experimente online!
Python 3.8 (pré-lançamento) PYTHONHASHSEED=2537 , 18 bytes
lambda x:hash(x)%2
Experimente online!
Tenho certeza de que isso é permitido. Uma variável de ambiente é como uma opção de linha de comando, portanto, é considerada uma linguagem de programação separada do Python normal. Entrada em minúsculas, saídas 1ou 0.
Canvas , 12 bytes
{c]∑“N*.[„;%
Experimente aqui!
mesmo método da resposta de pxeger.
Ruby -n , 18 bytes
p 255969480%$_.sum
Experimente online!
Entrada em caixa de título, a saída é um inteiro verdadeiro ou zero falsey.
\ $ 255969480 \ $ é o menor múltiplo comum das somas de todas as sequências verdadeiras Title Cased, que também não é um múltiplo de nenhuma das somas das sequências falsey Title Cased. A razão pela qual eu uso a caixa de título é porque as somas compartilham muitos fatores comuns, reduzindo o comprimento do número. Isso definitivamente poderia ser transferido para várias linguagens de golfe para economizar muitos bytes, o que eu poderia fazer. ver abaixo!
05AB1E , 14 10 bytes
ÇO•F;_â•s%
Experimente online!
Mesmo método que o anterior - entrada em caixa do título, saída como 0 para falso ou um inteiro positivo para verdadeiro
C (gcc) , 46 42 41 bytes
Economizei 4 bytes graças ao gastropner !!!
Salvo um byte graças a Samathingamajig !!!
f(char*s){s=*s-80&&*s-77&&*s-67&s[3]-87;}
Experimente online!
Insere a cor toda em maiúsculas e retorna \$1\$para uma cor do arco-íris ou \$0\$ de outra forma.
código de máquina x86, 8 bytes
Hexdump:
6b 01 e7 c1 e8 0a d6 c3
Multiplica o valor de 32 bits no início da string -25e extrai o bit 9 do resultado. Retorna al = -1para cores do arco-íris e al = 0para cores fora do padrão.
Desmontagem:
6B 01 E7 imul eax,dword ptr [ecx],0FFFFFFE7h
C1 E8 0A shr eax,0Ah
?? ?? ??
C3 ret
Aqui, ?? ??representa a SALCinstrução "não documentada" .
GAWK,
18
16 bytes
( -2 graças a Dominic van Essen )
2>$0=/[de]/*!/p/
Experimente online!
Tradução da has "d" or "e" but not "p"lógica de Neil . Usa "2>"para garantir que a condição seja sempre verdadeira para qualquer entrada e define $0como truthy / falsey para que a ação padrão, que é print $0, produza o resultado.
05AB1E , 16 bytes
.•4W'bÓ´€‚Γ•I2£å
Experimente online!
Isso usa o fato de que existe um conjunto fixo de entradas possíveis.