Um gráfico de caule e folha exibe vários valores numéricos em grupos, que são determinados por todos, exceto o último dígito. Por exemplo, suponha que tenhamos esse conjunto de dados:
0, 2, 12, 13, 13, 15, 16, 20, 29, 43, 49, 101
Nós poderíamos produzir este tronco e folha plot:
0|02
1|23356
2|09
3|
4|39
5|
6|
7|
8|
9|
10|1
O caule da primeira linha é 0, então suas "folhas" - os dígitos após o |
- representam os valores entre 0 inclusivo e 10 exclusivo. As folhas em cada haste são classificadas. Hastes sem folhas (como 3) ainda aparecem na plotagem. O valor de 101 está entre 100 inclusivo e 110 exclusivo, portanto, seu tronco é 10 (100 dividido por 10).
Seu desafio é verificar se um pedaço de texto é um gráfico de caule e folha válido. Um gráfico válido satisfaz estas regras:
- Possui exatamente uma linha para cada haste (ou seja, grupo com 10 largos) no intervalo de dados (incluindo hastes no meio do intervalo sem folhas)
- Não tem hastes fora do intervalo
- Todas as folhas são ordenadas ascendendo à direita
- Todas as hastes são classificadas em ordem crescente
- Possui apenas caracteres numéricos (além do separador
|
)
Você não precisa lidar com números que possuem partes fracionárias. Você pode aprovar ou rejeitar zeros à esquerda extras nas hastes, mas uma haste em branco não é permitida. Haverá pelo menos um valor. Você só pode assumir espaços extras após as folhas em cada linha. Você pode assumir uma nova linha inicial e / ou posterior. Todos os caracteres serão imprimíveis em ASCII.
Sua função ou programa deve retornar ou gerar (para a tela ou a saída padrão) um valor verdadeiro para um gráfico válido ou um valor falso para um gráfico inválido. Você pode receber entradas da entrada padrão, de um arquivo, como uma string grande, como uma matriz de strings - o que for mais conveniente.
Aqui estão alguns casos de teste que são gráficos válidos (separados por linhas em branco):
2|00003457
3|35
4|799
5|3
99|3
100|0556
101|
102|
103|8
0|0
Aqui estão alguns casos de teste que são gráficos inválidos, com comentários à direita:
|0 Blank stem
5|347 Missing a stem (6) in the range
7|9
4| Has a stem (4) outside the range
5|26
6|7
11|432 Leaves aren't sorted correctly
12|9989
5|357 Stems aren't sorted correctly
4|002
6|1
4|5 Duplicate stem
4|6
4|6
5|1
51114 No stem and leaf separator
609
1|2|03 Multiple separators
2|779|
4|8abcdefg9 Invalid characters
5|1,2,3
75 | 4 6 Invalid characters (spaces)
76 | 2 8 8 9
Isso é código de golfe, então o código mais curto vence! As brechas padrão não são permitidas.
fonte
1|2|3
esta.4|;5|26;6|7
que possui o primeiro tronco fora do intervalo, mas no final, ou seja12|3;13|4559;14|
.Respostas:
Perl, 47 bytes
Inclui +2 para
-0p
Dê entrada no STDIN
stem.pl
:fonte
$"
é muito bom!Pip ,
6058 + 1 = 59 bytesPrimeira facada no problema, provavelmente poderia usar mais golfe. Usa o
-r
sinalizador para ler as linhas de entrada do stdin. A saída verdadeira é1
, a saída falsa é0
ou uma sequência vazia.Explicação e suíte de testes pendentes, mas enquanto isso: Experimente online!
fonte
JavaScript, 189 bytes
Solução alternativa com o mesmo comprimento:
Define uma função anônima que recebe entrada como uma seqüência de linhas múltiplas.
Tenho certeza de que há mais para jogar golfe, então, deixe-me saber se você vê alguma melhoria possível.
Explicação:
A função verifica várias coisas ruins e, se alguma delas for verdadeira, ela retornará false (usando ORs lógicos e um NOT)
Na solução alternativa, a verificação de vários
|
s em uma linha é feita como parte do primeiro regex.fonte
test
vez deexec
(você quase sempre deseja usartest
se precisar apenas de um resultado booleano`), provavelmente poderá usar bit a bit ou em vez de lógico ou.y.some((c,i,a)=>...
pory.some(c=>...
uma vezi
ea
não são utilizados. E parece quez!=z.sort((a,b)=>a-b)
não funciona pode ser substituído por''+z!=z.sort()
Lote, 409 bytes
Entra em STDIN, mas sai assim que vê um erro.
fonte