Usando qualquer linguagem de programação que suporte funções, tenha a função
is_enough(strArr)
aquela tomada strArr
que será uma matriz composta pelos seguintes elementos:
N
qual será o número de postos de gasolina em uma rota circular- e cada elemento subsequente será a string
g:c
em queg
é a quantidade de gás em galões naquele posto de gasolina ec
será a quantidade de galões de gás necessária para chegar ao seguinte posto de gasolina.
Por exemplo, strArr
pode ser:
["4","3:1","2:2","1:2","0:1"].
Seu objetivo é retornar o índice do posto de gasolina inicial que permitirá que você viaje ao longo de todo o percurso uma vez; caso contrário, retorne a string "impossível" .
Para o exemplo acima, existem 4 postos de gasolina e seu programa deve retornar a string "1" porque:
Começando na estação 1, você recebe 3 galões de gasolina e gasta 1 na próxima estação.
Então você tem 2 galões + mais 2 na próxima estação e você gasta 2 para ter 2 galões quando chegar à 3ª estação.
Você tem 3, mas gasta 2 chegando à estação final,
Na estação final, você recebe 0 galões e gasta seu galão final chegando ao ponto de partida.
Começar em qualquer outro posto de gasolina tornaria impossível a locomoção da rota, então a resposta é "1" .
Se houver vários postos de gasolina em que é possível iniciar, retorne o menor índice (do posto de gasolina). N
será >= 2
.
Resultados corretos da amostra:
Input: ["4","1:1","2:2","1:2","0:1"]
Output: "impossible"
Input: ["4","0:1","2:2","1:2","3:1"]
Output: "4"
O vencedor será aquele que usar o código mais curto, embora seja longo.
N+1
elementos precisosstrArr
? Isso seriaN
redundante caso a linguagem já forneça uma maneira de obter o comprimento da matriz, certo? (ainda seria útil para, por exemplo, C).is_enough
(9 caracteres); três estão usando um nome de caractere único e um não nomeia a função. Você poderia esclarecer o que é permitido?Respostas:
APL (70)
Explicação:
1↓⍵
: solte o primeiro elemento (comprimento), não precisamos dele{
...}¨
: para cada posto de gasolina ...⎕ML←3
: definido⎕ML
como 3 na função interna (altera o comportamento de⊂
)⍵⊂⍨⍵≠':'
: divida a string em:
⍎¨
: avalie cada parte-/
: subtrair o segundo número do primeiro (fornecendo efeito líquido para cada posto de gasolina)K←
: armazene-os em KZ←⍳⍴K
: obtenha os índices para o posto de gasolina (1
comprimento deK
), armazene emZ
⌽∘K¨Z
: gireK
por cada valor deZ
, fornecendo uma matriz de matrizes¯1⌽
: gire esse array para a esquerda por 1 (para colocar o inalterado primeiro em vez de por último)+\¨
: faça uma soma em execução para cada matriz interna0∧.≤¨
: para cada soma em execução, veja se há valores negativosZ/⍨
: selecioneZ
aqueles elementos para os quais a soma em execução não tinha valores negativos×⍴G←
: armazenar emG
. SeG
possui algum elemento::⊃G
: retorna o primeiro elemento deG
.⋄'impossible'
: caso contrário, retorneimpossible
.fonte
Bash
178170161157Um pouco direto.
Espaçados:
fonte
Ruby, 111
Aqui está uma solução Ruby usando
eval
:Exemplo de uso:
EDIT : Nome da função e tipo de retorno corrigidos.
fonte
Ruby 132
Teste:
fonte
Python, 131
Acho essa frase bastante satisfatória.
fonte
reduce()
aqui? Estou recebendo um erroNameError: name 'reduce' is not defined
reduce
ainda está na biblioteca padrão, mas foi movido para ofunctools
módulo.from functools import reduce
graças`i`
aqui é equivalente astr(i)
em Python 3.GolfScript (72 caracteres)
Demonstração online
Isso executa a abordagem óbvia da força bruta. O bit IMO mais interessante é a determinação de se as somas parciais de uma matriz de combustível delta caem abaixo de 0:
Isso economiza 1 caractere sobre o mais óbvio
Se a saída fosse indexada em 0 e não em 1, seria preferível uma abordagem alternativa para girar a matriz:
Mas essa abordagem não é facilmente adotada para indexação em 1:
ou
fonte