Gere entrada lenta de microondas

18

Relacionado: Programe meu forno de microondas e Gere valores preguiçosos .

Meu colega é tão preguiçoso que nem se incomoda em mexer o dedo ao programar o forno de microondas. (Isso é verdade!)

Ajude-o a encontrar a entrada de microondas que permita o tempo mais próximo do que ele deseja, mas onde todos os dígitos são iguais. Se duas entradas resultarem na mesma diferença horária do tempo desejado, escolha aquela com menos dígitos. Se ambos tiverem o mesmo número de dígitos, escolha o menor - para que ele não precise esperar tanto.

Input é o número inteiro que um perfeccionista digitaria, por exemplo, 430é de 4 minutos e 30 segundos enquanto 100e 60cada um é de 1 minuto. Será maior que 0 e não excederá 9999.

A saída deve ser um número inteiro, por exemplo, 4444 minutos e 44 segundos e 5555 segundos.

Tanto a entrada quanto a saída podem ser realizadas apenas em segundos simples (sem minutos) se o tempo total for inferior a 1 minuto e 40 segundos.

Isso é , portanto, seu código deve ser o mais curto possível.

Casos de teste:

  30 →   33
  60 →   55
  70 →  111
  90 →   88
 100 →   55
 101 →   66
 120 →   77
 130 →   88
 200 →   99
 201 →  222
 500 →  444
 700 →  666
1000 →  888
1055 →  999
1056 → 1111
1090 → 1111
Adão
fonte
3
Eu gosto da abordagem meio preguiçosa . Continue pressionando o botão "adicionar 30 segundos" até ele chegar: D
Geobits 23/02
@Geobits Grande quantidade de impressoras até as 11:30. Enfim, o fato é que ele usa o método que escrevi acima ...:
Adám 23/02/16
2
Sim, eu normalmente apenas digito por qualquer coisa durante alguns minutos. É um delicado equilíbrio entre o número de prensas e distância dedo-viagem;)
Geobits
A entrada / saída é permitida em número de segundos?
CalculadoraFeline
2
Meu colega é tão preguiçoso que nem se incomoda em mexer o dedo ao programar o forno de microondas. Não esperar menos de alguém que trabalha na sede Dyalog APL ... :)
Lynn

Respostas:

3

Geléia, 26 bytes

bȷ2ḅ60
³ÇạÇ,
9Rẋ€4R¤ḌFÇ€ṂṪ

Explicação:

bȷ2ḅ60             f(x) = x tobase 100 frombase 60
³ÇạÇ,              g(x) = (abs(f(arg) - f(x)), x)
9Rẋ€4R¤            main(arg) = [1..9] repeat each with [1..4],
       ḌF           then get digits and flatten,
         ǀ         then map g,
           Ṃ        then minimum,
            Ṫ       then last element.

Experimente online!

Lynn
fonte
2

JavaScript (ES6), 112 bytes

n=>{c=n=>n*3+n%100*2;d=n=c(n);for(r=i=0;i<1e4;i++)/^(.)\1*$/.test(i)&(m=c(i)-n,m<0?m=-m:m)<d&&(d=m,r=i);return r}

Usa uma função auxiliar cque calcula cinco vezes o número real de segundos decorridos.

Neil
fonte
1

Dyalog APL , 37 bytes

{⍵⊃⍨⊃⍋⊃|-/(60⊥0 100∘⊤)¨⎕⍵}⍎¨,⎕D∘./⍨⍳4

⍳41 2 3 4
⎕D"0123456789"
∘./⍨tabela de repetição (como uma tabela de multiplicação, mas onde cada célula contém B repetições de A em vez de A × B)
,transforma a tabela em lista de cadeias de caracteres
⍎¨transforma cada número em cadeia (Agora, temos uma lista de todos os possíveis resultados.)
{}função em que o argumento é representado pelo
⎕⍵argumento precedente com entrada solicitada
(aplica-se a cada um dos dois (o argumento e a lista) ...
0 100∘⊤converte em base-100
60⊥converte em base-60
-/calcule a diferença entre os dois valores
|absolutos
lista de extração de valor (porque -/encapsulou seu resultado)
ordem de classificação (Não classifica, retorna apenas a ordem na qual os argumentos devem ser alcançados. Se dois elementos forem iguais, eles permanecerão na ordem atual. Como nossa lista possui elementos de tamanho crescente, isso cuida dos vínculos.)
o primeiro, ou seja, aquele com a menor diferença absoluta da entrada, ⍵⊃⍨retira esse elemento da lista de argumentos (a lista de resultados possíveis)

Agradecemos ao colega em questão por reduzir um byte.


Nota: Eu não tinha nenhuma solução no momento da postagem do OP.

Adão
fonte