Restaurante Taquigrafía

8

Objetivo

A veces los menús de la cena pueden tener nombres largos y sin aliento. Es mucho más fácil para el camarero escribir una abreviatura que identifique inequívocamente el plato.

Por ejemplo, dada esta lista:

beef burger
chicken burger
chicken nuggets

La abreviatura c ncoincide chicken nuggets.
La abreviatura burcoincide beef burgery chicken burger.

Escriba un programa de función que identifique uno o más elementos que coincidan con una abreviatura.

Entrada

  1. La cadena abreviada para encontrar.
  2. Una lista de elementos para buscar.

Puede cambiar este orden y usar cualquier tipo de datos adecuado.

Salida

  • Si la abreviatura no coincide con ningún elemento: Not found
  • Si la abreviatura coincide inequívocamente con un elemento: envíe el elemento sin abreviar.
  • Si la abreviatura coincide ambiguamente con varios elementos: genera una lista de palabras separadas por comas que harían que la selección no fuera ambigua, seguida de un signo de interrogación. El orden no es importante. Se permiten espacios adicionales.

Reglas a juego

Cada palabra en la abreviatura y los elementos se consideran por separado. Si una palabra abreviada coincide con el comienzo de una palabra de elemento, el elemento es una coincidencia potencial. Si ninguna de las palabras de un elemento comienza con ninguna de las palabras abreviadas, ese elemento no coincide.

Las palabras abreviadas pueden estar en cualquier orden.

Una palabra abreviada no se puede usar para hacer coincidir varias palabras de artículos y viceversa.

Las abreviaturas solo coinciden con el inicio de las palabras.

Suponga que ningún elemento contendrá todas las palabras de otro elemento. Por ejemplo, nunca tendrás beef burgery beef cheese burger.

Casos de prueba

Dada esta lista:

beef burger
crispy chicken burger
grilled chicken burger
chicken nuggets
chocolate cone
strawberry cone
vanilla cone

Estas abreviaturas dan la salida especificada:

fish           Not found
cones          Not found
chicken cone   Not found
nilla          Not found
v              vanilla cone
be             beef burger
c n            chicken nuggets
b b            beef burger
c b c          crispy chicken burger
c b            crispy,grilled?
bu             beef,crispy,grilled?
            or beef,crispy chicken,grilled chicken?
ch             crispy,grilled,nuggets,cone?
            or crispy chicken,grilled chicken,nuggets,cone?

Puntuación

Este es el código de golf. La respuesta más corta en bytes en 12 días gana aceptación. (Lo habría hecho una semana, pero no voy a estar ahí para eso).

Hand-E-Food
fuente
No estoy seguro de por qué una palabra abreviada no se puede utilizar para que coincida con varias palabras de elementos sería importante si vcoincide vanilla cone.
Dennis
Relacionado
Alex A.
1
@Dennis, si una palabra abreviada coincidiera con varias palabras de elementos, c bcoincidiría en crispy chicken burgerlugar de ser ambigua. Cuando digo "palabra" me refiero a una cadena de caracteres delimitados por un espacio, también lo g c bson tres palabras.
Hand-E-Food
Si la abreviatura coincide ambiguamente con varios elementos: genera una lista de palabras separadas por comas que harían que la selección no sea ambigua. ¿Se refiere a una palabra que, por sí sola, permitiría elegir entre las opciones de coincidencia, o además de las abreviaturas? Con la primera interpretación, ¿ crispy,grilled,nuggets,chocolatedebería ser válido para el chcaso de prueba? Con la segunda interpretación, chicken,grilleddebe ser válido para el c bcaso de prueba. ¿Qué me estoy perdiendo?
Dennis
Dada la entrada, b b beef burger battered bacon¿cuál sería la salida aceptable?
Peter Taylor

Respuestas:

1

Python 2 - 181 bytes

Convierte la cadena abreviada en una expresión regular e intenta unir grupos de la lista de búsqueda.

La operación ternaria ifyelse s son 14 bytes. Intenté reducirlo a una lista y luego acceder a uno de los elementos según el estado de r, pero todavía no tengo nada más corto.

import re
def s(a,l):
 r=[m.group(1)for e in l for m in[re.compile('^('+a.replace(' ','\w+ ')+'\w+)$').search(e)]if m]
 print','.join(r)+'?'if len(r)>1 else r[0]if r else'Not found'

Llamar con s(str, list):

s('c n', ['chicken burger', 'chicken nuggets', 'cheeseburger'])
>>> chicken nuggets
s('c n', ['chicken burger', 'chicken nuggets', 'cheeseburger', 'chicken nuggets with sauce', 'foobar'])
>>> chicken nuggets
s('c n', ['chicken burger', 'chicken nuggets', 'cheeseburger', 'chicken nuggets with sauce', 'foobar', 'cfoo nbar'])
>>> chicken nuggets,cfoo nbar?
Celeo
fuente