Letras de banho de espuma

19

Se você tem um filho pequeno em sua casa, pode ter encontrado letras de banho de espuma. Estes podem ser umedecidos e colados em superfícies planas, como azulejos e na lateral do banho, para criar palavras e mensagens.

A gama de palavras e mensagens é um pouco limitado, se você tiver apenas um set, porém, desde que você só tem 36 caracteres: letras maiúsculas AZ e dígitos 0-9: ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789. No entanto, você pode ser astuto e abusar de algumas das letras e dígitos para formar cópias extras de outras letras:

3: E
1: I
7: L (when rotated)
M: W (when rotated)
0: O
2: S (when flipped)
5: S
W: M (when rotated)
2: Z
5: Z (when flipped)
O: 0
6: 9 (when rotated)
L: 7 (when rotated)
9: 6 (when rotated)

Observe que nem todos são bidirecionais, pois é mais fácil ler um dígito como parte de uma palavra do que uma letra como parte de um número.

Cada conjunto também vem em uma variedade de cores, onde cada letra é colorida em sequência. Por exemplo, se o seu conjunto tiver três cores, vermelho, amarelo e azul, ele será como:

  • Vermelho: ADGJMPSVY147
  • Amarelo: BEHKNQTWZ258
  • Azul: CFILORUX0369

Sua tarefa, portanto, é usar três parâmetros (de qualquer maneira adequada) indicando uma palavra ou frase, o número de cores a serem usadas e o número de conjuntos que você possui e, em seguida, gerar uma representação da palavra ou frase, em um conjunto de cores adequadas, utilizando substituições, se necessário. Se não for possível criar a palavra ou frase com o número de conjuntos, digite "Nope" nas cores apropriadas.

Exemplos

Em todos esses, o primeiro parâmetro é a palavra ou frase, o segundo é o número de cores e o terceiro é o número de conjuntos disponíveis.

["bath", 3, 1]

BANHO

["programming", 3, 2]

PROGRAMAÇÃO

["puzzles", 3, 1]

PUZ2LES

["code golf", 5, 1]

CÓDIGO G0LF

["willow tree", 1, 1]

WIL7OM TRE3

["impossible phrase", 8, 1]

NÃO - existe apenas 1 P em um conjunto e nenhuma substituição válida

Notas

  • Você pode usar como padrão 1 conjunto, se isso ajudar (por exemplo, um valor de parâmetro padrão 1), mas você deve suportar vários conjuntos, se solicitado. O número de conjuntos que você possui sempre será um número inteiro positivo diferente de zero.
  • Se você tiver vários conjuntos, todos serão coloridos da mesma maneira: se A for vermelho no primeiro conjunto, também será vermelho no segundo conjunto. As cores são aplicadas por conjunto, não para todos os conjuntos em uma determinada chamada
  • Você deve suportar 1 a 36 cores - 1 significa que todos os caracteres são da mesma cor, 36 significa que todos são distintos. Só haverá números inteiros de cores.
  • Você pode usar todas as cores, desde que sejam visualmente distintas - se estiver produzindo para o terminal, poderá usar uma combinação de primeiro plano e plano de fundo como uma "cor", embora não deva usar a mesma cor para primeiro plano e plano de fundo
  • Sua saída deve usar os caracteres que você realmente usa, não os caracteres da entrada. Por exemplo, se você tivesse ["salgueiro", 1, 1] como entrada, poderia produzir WIL7OMcom 7 e M girados 180 graus
  • Você deve usar as letras corretas primeiro e depois substituir: MI7LOWestá incorreto para ["willow", 1, 1]
  • Você pode usar qualquer substituição para um determinado personagem: SO5e SO2com um 2 invertido, ambos são válidos para "SOS"
  • Múltiplas invocações do seu código para a mesma entrada não precisam produzir saída idêntica
  • A saída deve estar em maiúscula, mas a entrada pode estar em qualquer combinação de maiúsculas e minúsculas
  • Deveria ser óbvio, mas um espaço não tem uma cor

Regras

  • Este é um código de golfe, mas com saída semi-gráfica (não tenho certeza se você pode fazer texto invertido em um terminal, mas estou interessado em ver se o Pyth está embutido nele)
  • Aplicam-se brechas padrão
  • Não há bônus para funções, mas vote em respostas interessantes
  • Inclua algumas capturas de tela da sua saída nas suas respostas

Desafios relacionados

Mateus
fonte
11
E se não for possível gerar "NOPE" dados os conjuntos?
Rɪᴋᴇʀ
@Riker Um conjunto contém 36 caracteres. Quando seria impossível produzir NOPE?
mypetlion
@mypetlion quando não há jogos ...
Rɪᴋᴇʀ
@Riker Read "O número de conjuntos que você possui sempre será um número inteiro positivo diferente de zero."
mypetlion
11
Letras de banho de espuma são uma boa introdução para falar leet ...
Arnauld

Respostas:

1

HTML / JavaScript (com jQuery) / CSS - não-concorrente / não-golfe

Apenas para fazer a bola rolar e mostrar que não é impossível, aqui está uma implementação não-golfe e não-competitiva que adota uma abordagem ingênua para a tarefa.

Primeiro, ele cria uma sequência de todos os caracteres possíveis ( tempalph), juntando quantas cópias do alfabeto houver conjuntos. Em seguida, ele percorre a frase, colocando cada letra da frase em uma variável de saída e apagando a primeira instância dessa letra tempalph. Se não puder (a letra não existe), verifica se a letra é substituível por algo deixado na string. Se isso também falhar, gera uma saída predefinida "NOPE". Supondo que ele não atinja o caso "NOPE", ele retorna a string de saída e a coloca em um DIV na página.

Em seguida, ele percorre a seqüência de caracteres do alfabeto base e, se uma letra tiver sido usada, atribui a ela uma classe CSS apropriada, cada uma com um conjunto de cores predefinido.

Ele usa entradas HTML para entrada e atualizações sobre a inserção nelas.

Experimente no JSFiddle

Exemplo para ["BATH", 3, 1]:

Banho

JS:

var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

função getPhrase (frase, conjuntos) {
    var modphrase = "";
  var nope = 'NOPE';
  var re = / ^ [A-Z0-9] + $ /;
  if (re.test (frase)) {
    // pode ser válido - é necessário verificar se há caracteres suficientes disponíveis
    // Neste ponto, é necessário analisar especificamente quais caracteres são necessários

    var tempalph = "";
    for (var i = 0; i '+ char +' ';
        if (tempalph.indexOf (char)! = -1) {
        tempalph = tempalph.replace (char, "#");
      } outro {
        switch (char) {
            caso "E":
            if (tempalph.indexOf ("3")! = -1) {
                    tempalph = tempalph.replace ("3", "#");
              modchar = '3';
                } outro {
                return nope;
            }
            pausa;
          caso "I":
            if (tempalph.indexOf ("1")! = -1) {
                    tempalph = tempalph.replace ("1", "#");
              modchar = '1';
                } outro {
              return nope;
            }
            pausa;
          caso "L":
            if (tempalph.indexOf ("7")! = -1) {
                    tempalph = tempalph.replace ("7", "#");
              modchar = '7';
                } outro {
              return nope;
            }
            pausa;
          caso "M":
            if (tempalph.indexOf ("W")! = -1) {
                    tempalph = tempalph.replace ("W", "#");
              modchar = 'W';
                } outro {
              return nope;
            }
            pausa;
          caso "O":
            if (tempalph.indexOf ("0")! = -1) {
                    tempalph = tempalph.replace ("0", "#");
              modchar = '0';
                } outro {
              return nope;
            }
            pausa;
          caso "W":
            if (tempalph.indexOf ("M")! = -1) {
                    tempalph = tempalph.replace ("M", "#");
              modchar = 'M';
                } outro {
              return nope;
            }
            pausa;
          caso "0":
            if (tempalph.indexOf ("O")! = -1) {
                    tempalph = tempalph.replace ("O", "#");
              modchar = 'O';
                } outro {
              return nope;
            }
            pausa;
          caso "6":
            if (tempalph.indexOf ("9")! = -1) {
                    tempalph = tempalph.replace ("9", "#");
              modchar = '9';
                } outro {
              return nope;
            }
            pausa;
          caso "7":
            if (tempalph.indexOf ("L")! = -1) {
                    tempalph = tempalph.replace ("L", "#");
              modchar = 'L';
                } outro {
              return nope;
            }
            pausa;
          caso "9":
            if (tempalph.indexOf ("6")! = -1) {
                    tempalph = tempalph.replace ("6", "#");
              modchar = '6';
                } outro {
              return nope;
            }
            pausa;

          caso "S":
            if (tempalph.indexOf ("5")! = -1) {
                    tempalph = tempalph.replace ("5", "#");
              modchar = '5';
                } else if (tempalph.indexOf ("2")! = -1) {
                    tempalph = tempalph.replace ("2", "#");
              modchar = '2';
                } outro {
              return nope;
            }
            pausa;
                    caso "Z":
            if (tempalph.indexOf ("2")! = -1) {
                    tempalph = tempalph.replace ("2", "#");
              modchar = '2';
                } else if (tempalph.indexOf ("5")! = -1) {
                    tempalph = tempalph.replace ("5", "#");
              modchar = '5';
                } outro {
              return nope;
            }
            pausa;
          case "":
            pausa;
          padrão:
            return nope;
          }

      }
        modphrase + = modchar;
    }

    retornar modphrase;
  } outro {
    // contém outros caracteres, então definitivamente não é válido
    return nope;
  }
}

função addColors (colcount) {
  var i = 0;
  for (deixe o caractere do alfabeto) {
    exclass = "." + char;
    newclass = "col" + i;
    if ($ (exclass) .length> 0) {
      $ (exclass) .addClass (nova classe);
    }
    i ++;
    if (i == colcount) {
        i = 0;
    } 
  }
}


$ ("# frase, # conjuntos, # cores"). on ("keyup", function () {
    var frase = $ ("# frase"). val (). toUpperCase ();
  frase = getPhrase (frase, $ ("# sets"). val ());
    $ ("# output"). html (frase);
  addColors ($ ("# colors"). val ());
})

HTML:

<label> Frase <input type = "text" id = "frase" /> </label>
<label> Cores <input type = "text" id = "colors" value = "3" /> </label>
<label> Define <input type = "text" id = "define" value = "1" /> </label>

<div id = "output">

</div>

CSS:

.col0 {color: # f00}
.col1 {color: # 0f0}
.col2 {color: # 00f}
.col3 {color: # 66CDAA}
.col4 {color: # EE82EE}
.col5 {color: # 7FFFD4}
.col6 {color: # 7FFFD4}
.col7 {color: #FFDEAD}
.col8 {color: # D8BFD8}
.col9 {color: # FF6347}
.col10 {color: # 8B4513}
.col11 {color: # 800000}
.col12 {color: # 00FFFF}
.col13 {color: # 32CD32}
.col14 {color: # 191970}
.col15 {color: # 1E90FF}
.col16 {color: # A0522D}
.col17 {color: # 808000}
.col18 {color: # DC143C}
.col19 {color: # 90EE90}
.col20 {color: # D2691E}
.col21 {color: # 48D1CC}
.col22 {color: # 008000}
.col23 {color: # 8B008B}
.col24 {color: # 6495ED}
.col25 {color: # 800080}
.col26 {color: # 000080}
.col27 {color: # DB7093}
.col28 {color: # 7FFF00}
.col29 {color: # 00FA9A}
.col30 {color: # 0000FF}
.col31 {color: # BC8F8F}
.col32 {color: # A52A2A}
.col33 {color: # 4169E1}
.col34 {color: # FFFF00}
.col35 {color: # FFA07A}

.rot {display: bloco em linha; transformar: girar (0,5 volta);}
.flip {display: bloco embutido; transform: rotateY (0.5turn);}

div {
  família de fontes: sans-serif;
  tamanho da fonte: 3em;
  cor de fundo: # 000;
  estofamento: 10 px;
}
Mateus
fonte
Eu acho que um candidato não sério deve ser incluído em questão, de acordo com este (mini) meta consenso.
user202729