É uma cor do arco-íris?

Nov 03 2020

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:

  1. 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
  2. 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
  3. Falhas padrão não permitidas

Casos de teste:

Verdade:

  • red
  • orange
  • yellow
  • green
  • blue
  • indigo
  • violet

Falsy:

  • purple
  • brown
  • pink
  • cyan
  • maroon

 

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

33 Lynn Nov 03 2020 at 22:21

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
9 Neil Nov 03 2020 at 22:09

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.

9 coltim Nov 03 2020 at 21:50

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 se null, ou seja, converta nulos em 1e índices reais em0
8 Sisyphus Nov 04 2020 at 02:44

Gelatina , 6 bytes

,2ḥ93Ḃ

Experimente online!

Usa a função de hash Jelly. 5 pode ser possível.

6 ovs Nov 03 2020 at 23:10

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?
6 RobinRyder Nov 03 2020 at 22:53

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.

6 G.Sliepen Nov 05 2020 at 15:02

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.

4 Sisyphus Nov 03 2020 at 22:00

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.

3 cairdcoinheringaahing Nov 03 2020 at 21:32

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
3 Lynn Nov 03 2020 at 22:23

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.

3 DominicvanEssen Nov 04 2020 at 11:18

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'.

3 DominicvanEssen Nov 04 2020 at 14:20

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 )

2 Scott Nov 03 2020 at 23:36

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:

  1. Converte para int com base 256
  2. Módulo que por 283
  3. Módulo por 2.

1 se cor do arco-íris, 0 se não.

2 Shaggy Nov 03 2020 at 22:02

Japt -! , 13 9 8 bytes

g8 k`þ

Tente

2 Neil Nov 03 2020 at 22:16

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
2 aidan0626 Nov 03 2020 at 23:21

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!

2 Giuseppe Nov 03 2020 at 22:01

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 .

2 ErikF Nov 05 2020 at 04:20

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!

2 Samathingamajig Nov 06 2020 at 20:15

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)

2 ScottyJamison Nov 11 2020 at 05:37

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)))
})()

2 Makonede Dec 06 2020 at 19:35

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
1 Arnauld Nov 03 2020 at 22:40

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!

1 pxeger Nov 04 2020 at 08:40

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.

1 Razetime Nov 04 2020 at 13:44

Canvas , 12 bytes

{c]∑“N*.[„;%

Experimente aqui!

mesmo método da resposta de pxeger.

1 pxeger Nov 04 2020 at 08:35

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

1 Noodle9 Nov 03 2020 at 23:12

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.

1 anatolyg Dec 07 2020 at 14:47

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" .

1 cnamejj Dec 06 2020 at 22:30

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.

Lyxal Nov 03 2020 at 21:34

05AB1E , 16 bytes

.•4W'bÓ´€‚Γ•I2£å

Experimente online!

Isso usa o fato de que existe um conjunto fixo de entradas possíveis.