Restaurante taquigrafia

8

Objetivo

Às vezes, os menus do jantar podem ter nomes longos. É muito mais fácil para o garçom escrever uma abreviação que identifica inequivocamente o prato.

Por exemplo, dada esta lista:

beef burger
chicken burger
chicken nuggets

A abreviação c ncorresponde chicken nuggets.
A abreviação burcorresponde a beef burgere chicken burger.

Escreva um programa de função que identifique um ou mais itens que correspondam a uma abreviação.

Entrada

  1. A sequência abreviada para encontrar.
  2. Uma lista de itens para pesquisar.

Você pode alterar essa ordem e usar qualquer tipo de dados adequado.

Resultado

  • Se a abreviação não corresponder a nenhum item: Not found
  • Se a abreviação corresponder inequivocamente a um item: produza o item não abreviado.
  • Se a abreviação corresponder ambiguamente a vários itens: produza uma lista de palavras separadas por vírgula que tornariam a seleção inequívoca, seguida por um ponto de interrogação. A ordem não é importante. Espaços extras são permitidos.

Regras de correspondência

Cada palavra na abreviação e os itens são considerados separadamente. Se uma palavra abreviada corresponder ao início de uma palavra do item, o item será uma correspondência potencial. Se nenhuma das palavras de um item começar com nenhuma das palavras abreviadas, esse item não corresponderá.

Palavras abreviadas podem estar em qualquer ordem.

Uma palavra abreviada não pode ser usada para corresponder a várias palavras de itens e vice-versa.

As abreviações correspondem apenas ao início das palavras.

Suponha que nenhum item contenha todas as palavras de outro item. Por exemplo, você nunca terá beef burgere beef cheese burger.

Casos de teste

Dada esta lista:

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

Essas abreviações fornecem a saída 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?

Pontuação

Isso é código de golfe. A resposta mais curta em bytes em 12 dias ganha aceitação. (Eu teria conseguido uma semana, mas não estarei por perto.)

Mão-E-Comida
fonte
Não sei por que uma palavra abreviada não pode ser usada para corresponder a várias palavras do item seria importante se vcorresponder vanilla cone.
Dennis
Relacionados
Alex A.
1
@Dennis, se uma palavra abreviada corresponder a várias palavras de itens, c bcorresponderia ao crispy chicken burgerinvés de ser ambígua. Quando digo "palavra", quero dizer uma sequência de caracteres delimitada por um espaço, g c btrês palavras também.
Hand-E-Food
Se a abreviação corresponder ambiguamente a vários itens: produza uma lista de palavras separadas por vírgula que tornaria a seleção inequívoca. Isso se refere a uma palavra que, por si só, permitiria escolher entre as opções correspondentes ou além das abreviações? Com a primeira interpretação, crispy,grilled,nuggets,chocolatedeve ser válido para o chcaso de teste? Com a segunda interpretação, chicken,grilleddeve ser válida para o c bcaso de teste. o que estou perdendo?
Dennis
Dada a entrada, b b beef burger battered baconqual seria a saída aceitável?
Peter Taylor

Respostas:

1

Python 2 - 181 bytes

Ele transforma a sequência abreviada em uma expressão regular e tenta corresponder grupos da lista de pesquisa.

A operação ternário ife elses é de 14 bytes. Tentei recortá-lo em uma lista e acessar um dos itens com base no estado de r, mas ainda não há nada mais curto que isso.

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'

Ligue para 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
fonte