Letras de baño de espuma

19

Si tiene un niño pequeño en su casa, es posible que haya encontrado letras de espuma de baño. Estos pueden humedecerse y adherirse a superficies planas como azulejos y al costado del baño para formar palabras y mensajes.

La gama de palabras y mensajes es algo limitado si sólo tiene un juego sin embargo, ya que sólo recibe 36 caracteres: letras mayúsculas A a la Z, y los dígitos 0-9: ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789. Sin embargo, puede ser astuto y abusar de algunas letras y dígitos para formar copias adicionales de otras 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)

Tenga en cuenta que estos no son todos bidireccionales, ya que tiende a ser más fácil leer un dígito como parte de una palabra que una letra como parte de un número.

Cada conjunto también viene en una gama de colores, donde cada letra se colorea en secuencia. Por ejemplo, si su conjunto tiene 3 colores, rojo, amarillo y azul, su conjunto sería como:

  • Rojo: ADGJMPSVY147
  • Amarillo: BEHKNQTWZ258
  • Azul: CFILORUX0369

Su tarea, por lo tanto, es tomar tres parámetros (de cualquier manera adecuada) que indiquen una palabra o frase, la cantidad de colores que se utilizarán y la cantidad de conjuntos que tiene, para luego generar una representación de la palabra o frase, en un conjunto de colores adecuados, haciendo uso de sustituciones si es necesario. Si no es posible crear la palabra o frase dada la cantidad de juegos, en su lugar, escriba "No", en los colores apropiados.

Ejemplos

En todos estos, el primer parámetro es la palabra o frase, el segundo es el número de colores y el tercero es el número de conjuntos disponibles.

["bath", 3, 1]

BAÑERA

["programming", 3, 2]

PROGRAMACIÓN

["puzzles", 3, 1]

PUZ2LES

["code golf", 5, 1]

CÓDIGO G0LF

["willow tree", 1, 1]

WIL7OM TRE3

["impossible phrase", 8, 1]

NOPE - solo hay 1 P en un conjunto y no hay sustituciones válidas

Notas

  • Puede establecer un valor predeterminado de 1 conjunto si esto ayuda (por ejemplo, un valor de parámetro predeterminado de 1), pero debe admitir varios conjuntos si se solicita. El número de conjuntos que tiene siempre será un entero positivo distinto de cero.
  • Si tiene varios conjuntos, todos están coloreados de la misma manera: si A es rojo en el primer conjunto, también será rojo en el segundo conjunto. Los colores se aplican por conjunto, no a todos los conjuntos en una invocación dada
  • Debe admitir de 1 a 36 colores: 1 significa que todos los caracteres son del mismo color, 36 significa que todos son distintos. Solo habrá números enteros de colores.
  • Puede usar cualquier color, siempre que sean visualmente distintos: si está enviando a la terminal, puede usar una combinación de primer plano y fondo como "color", aunque no debe usar el mismo color para primer plano y fondo
  • Su salida debe usar los caracteres que realmente usa, no los caracteres de la entrada. Por ejemplo, si tuviera ["sauce", 1, 1] como entrada, podría salir WIL7OMcon 7 y M girado 180 grados
  • Primero debe usar las letras correctas, luego sustituir: MI7LOWes incorrecto para ["sauce", 1, 1]
  • Puede usar cualquier sustitución para un personaje dado: SO5y SO2con un 2 invertido, ambos son válidos para "SOS"
  • Las invocaciones múltiples de su código para la misma entrada no tienen que producir una salida idéntica
  • La salida debe estar en mayúsculas, pero la entrada puede estar en cualquier combinación de mayúsculas y minúsculas
  • Debería ser obvio, pero un espacio no tiene color

Reglas

  • Este es el código de golf, pero con salida semigrafica (no estoy seguro de si puede hacer texto invertido en una terminal, pero estoy interesado en ver si Pyth tiene incorporado)
  • Se aplican lagunas estándar
  • No hay bonificaciones por funciones, pero vote por respuestas interesantes
  • Incluya algunas capturas de pantalla de su salida en sus respuestas

Desafíos relacionados

  • Alfabeto de mi hija : un inverso parcial de este desafío, que busca encontrar un conjunto mínimo de letras para escribir un rango de oraciones
  • ¿Una letra cabe dentro de la otra? - sobre un tipo diferente de letras de espuma, pero con una alternativa similar al tema de letras
Mateo
fuente
1
¿Qué pasa si no es posible generar "NOPE" dados los conjuntos?
Rɪᴋᴇʀ
@Riker Un conjunto contiene los 36 caracteres dados. ¿Cuándo sería imposible dar salida NOPE?
mypetlion
@mypetlion cuando no hay sets ...
Rɪᴋᴇʀ
@Riker Read "El número de conjuntos que tiene siempre será un entero positivo distinto de cero".
mypetlion
1
Las cartas de baño de espuma son una buena introducción a leet speak ...
Arnauld

Respuestas:

1

HTML / JavaScript (con jQuery) / CSS - no competidor / no golfizado

Solo para que la pelota ruede y demuestre que no es imposible, aquí hay una implementación no competitiva y que no juega al golf que tiene un enfoque ingenuo para la tarea.

Primero crea una cadena de todos los caracteres posibles ( tempalph), uniendo tantas copias del alfabeto como conjuntos. Luego itera a través de la frase, colocando cada letra de la frase en una variable de salida y eliminando la primera instancia de esa letra tempalph. Si no puede (la letra no existe), verifica si la letra es reemplazable con algo que queda en la cadena. Si eso también falla, genera una salida predefinida "NOPE". Suponiendo que no llega al caso "NOPE", devuelve la cadena de salida y la coloca en un DIV en la página.

Luego recorre la cadena del alfabeto base y, si se ha usado una letra, le asigna una clase CSS apropiada, cada una de las cuales tiene un conjunto de colores predefinido.

Utiliza entradas HTML para la entrada, y las actualizaciones en keyup en ellas.

Pruébalo en JSFiddle

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

Bañera

JS:

var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

función getPhrase (frase, conjuntos) {
    var modphrase = "";
  var nope = 'NOPE';
  var re = / ^ [A-Z0-9] + $ /;
  if (re.test (frase)) {
    // podría ser válido; es necesario verificar que haya suficientes caracteres disponibles
    // En este punto, es necesario observar específicamente qué caracteres se necesitan

    var tempalph = "";
    para (var i = 0; i '+ char +' ';
        if (tempalph.indexOf (char)! = -1) {
        tempalph = tempalph.replace (char, "#");
      } más {
        interruptor (char) {
            caso "E":
            if (tempalph.indexOf ("3")! = -1) {
                    tempalph = tempalph.replace ("3", "#");
              modchar = '3';
                } más {
                volver no;
            }
            descanso;
          caso "I":
            if (tempalph.indexOf ("1")! = -1) {
                    tempalph = tempalph.replace ("1", "#");
              modchar = '1';
                } más {
              volver no;
            }
            descanso;
          caso "L":
            if (tempalph.indexOf ("7")! = -1) {
                    tempalph = tempalph.replace ("7", "#");
              modchar = '7';
                } más {
              volver no;
            }
            descanso;
          caso "M":
            if (tempalph.indexOf ("W")! = -1) {
                    tempalph = tempalph.replace ("W", "#");
              modchar = 'W';
                } más {
              volver no;
            }
            descanso;
          caso "O":
            if (tempalph.indexOf ("0")! = -1) {
                    tempalph = tempalph.replace ("0", "#");
              modchar = '0';
                } más {
              volver no;
            }
            descanso;
          caso "W":
            if (tempalph.indexOf ("M")! = -1) {
                    tempalph = tempalph.replace ("M", "#");
              modchar = 'M';
                } más {
              volver no;
            }
            descanso;
          caso "0":
            if (tempalph.indexOf ("O")! = -1) {
                    tempalph = tempalph.replace ("O", "#");
              modchar = 'O';
                } más {
              volver no;
            }
            descanso;
          caso "6":
            if (tempalph.indexOf ("9")! = -1) {
                    tempalph = tempalph.replace ("9", "#");
              modchar = '9';
                } más {
              volver no;
            }
            descanso;
          caso "7":
            if (tempalph.indexOf ("L")! = -1) {
                    tempalph = tempalph.replace ("L", "#");
              modchar = 'L';
                } más {
              volver no;
            }
            descanso;
          caso "9":
            if (tempalph.indexOf ("6")! = -1) {
                    tempalph = tempalph.replace ("6", "#");
              modchar = '6';
                } más {
              volver no;
            }
            descanso;

          casos":
            if (tempalph.indexOf ("5")! = -1) {
                    tempalph = tempalph.replace ("5", "#");
              modchar = '5';
                } else if (tempalph.indexOf ("2")! = -1) {
                    tempalph = tempalph.replace ("2", "#");
              modchar = '2';
                } más {
              volver no;
            }
            descanso;
                    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';
                } más {
              volver no;
            }
            descanso;
          caso "":
            descanso;
          defecto:
            volver no;
          }

      }
        modphrase + = modchar;
    }

    volver modfrase;
  } más {
    // contiene algunos otros caracteres, por lo que definitivamente no es válido
    volver no;
  }
}

función addColors (colcount) {
  var i = 0;
  para (let char of alphabet) {
    exclass = "." + char;
    nueva clase = "col" + i;
    if ($ (exclass) .length> 0) {
      $ (exclass) .addClass (nueva clase);
    }
    i ++;
    if (i == colcount) {
        i = 0;
    } 
  }
}


$ ("# frase, # conjuntos, # colores"). on ("keyup", function () {
    var frase = $ ("# frase"). val (). toUpperCase ();
  frase = getPhrase (frase, $ ("# conjuntos"). val ());
    $ ("# salida"). html (frase);
  addColors ($ ("# colores"). val ());
})

HTML:

<label> Frase <input type = "text" id = "frase" /> </label>
<label> Colores <input type = "text" id = "colors" value = "3" /> </label>
<label> Establece <input type = "text" id = "sets" value = "1" /> </label>

<div id = "salida">

</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: bloque en línea; transformar: rotar (0.5turn);}
.flip {display: bloque en línea; transform: rotateY (0.5turn);}

div {
  font-family: sans-serif;
  tamaño de fuente: 3em;
  color de fondo: # 000;
  acolchado: 10px;
}
Mateo
fuente
Creo que el contendiente no serio debe incluirse en cuestión, según este (mini) meta consenso.
user202729