Quantas vezes uma torre sineira tocará?


24

Introdução

Uma torre sineira tocará seus sinos a cada hora, nvezes, nsendo a hora atual em um relógio de 12 horas.

Por exemplo, um sino toca 5 vezes às 17h e 10 vezes às 10h.

Tarefa

Dado duas vezes em um formato adequado, digite o número de vezes que a campainha tocará, incluindo os horários de início e término

Exemplos

"10am-12pm"
10+11+12= 33

[01:00, 05:00]
1+2+3+4+5 = 15

[11, 15]
11+12+1+2+3 = 29

[10:00pm, 10:00am]
10+11+12+1+2+3+4+5+6+7+8+9+10 = 88

Se o início é o mesmo que o final, você simplesmente calcula o número de sinos para essa hora:

[5pm, 5pm]
5 = 5

Como você pode ver, você pode escolher um método de entrada, mas a saída deve ser um número inteiro por si só (ou uma alternativa aceitável) novas linhas e espaços à direita / à direita.

Nota:

  • as entradas podem variar da tarde de um dia até a manhã do dia seguinte.
  • a diferença entre os dois tempos nunca será superior a 24 horas.
  • A entrada é flexível, desde que você indique claramente qual o formato da sua entrada.
  • sua entrada deve ter uma distinção clara entre AM e PM.

2
Escolhemos nosso próprio método de entrada ou ele precisa suportar todos os mencionados?
anonymous2

11
Você pode escolher o método de entrada
Shaun selvagem

11
Você deve deixar mais claro que as entradas podem ir de pmpara am, passando para o segundo dia.
mbomb007

3
A meia-noite será dada como 0 ou 24?
Xnor

4
Incentivamos o uso do Sandbox para solucionar quaisquer problemas com desafios antes que eles sejam publicados no site principal.
Mego3

Respostas:


12

JavaScript (ES6), 38 35 bytes

f=(x,y)=>~-x%12-~(x-y&&f(x%24+1,y))

Adiciona recursivamente o número atual de toques de campainha ao total. Chamado como f(11,15); meia-noite é representada como 24. Eu recebi parte do ~-truque da resposta Python do @ xnor .

Snippet de teste

Versão não recursiva (Firefox 30+), 56 bytes

(x,y,t=0)=>[for(_ of Array((y-x+25)%24))t+=x++%12||12]|t

Equivalente à seguinte função ES6:

(x,y,t=0)=>[...Array((y-x+25)%24))].map(_=>t+=x++%12||12)|t

7

Python 2, 46 bytes

f=lambda x,y:(x%12or 12)+(x-y and f(-~x%24,y))

Com base na minha resposta JS. A fórmula recursiva f para a solução é definida da seguinte forma:

  1. Comece com dois números inteiros x e y .
  2. Tome x mod 12 ; se for 0, pegue 12 em seu lugar.
  3. Se x! = Y , adicione o resultado de f (x + 1 mod 24, y) .

6

Python 2, 59 54 bytes

a=lambda x,y:sum(1+i%12for i in range(x-1,y+24*(x>y)))
Equivalente a
summ=0
if start > end:
    end+=24
for hour in range(start-1,end):
    summ +=1+hour%12
print summ

3
Eu acho que você não precisa da a=parte.
Acrolith 03/10

@daHugLenny ele precisa ser um pleno funcionamento (utilizável)
Rod

(y + 24)% 24 é apenas y
Vladimir Cravero 03/10

11
@ Rod Você não precisa a=. É permitido ser um lambda puro.
Yytsi 04/10/19

11
@VladimirCravero Claro que não. É o mesmo que y%24.
Erik the Outgolfer 04/10


3

Python, 42 bytes

f=lambda a,b:~-a%12-~(b-a and f(-~a%24,b))

Uma função recursiva que leva dois números de 0 a 23. A expansão das ~x's para -x-1

f=lambda a,b:(a-1)%12+1+(b-a and f((a+1)%24,b))

A expressão (a+1)%12+1converte um tempo no número de toques 1em 12. Então, o limite inferior é incrementado no módulo 24 e a função para o resultado recursivo é adicionada. Ou seja, a menos que a hora atual seja a hora final, nesse caso, paramos.

Eu tenho tentado escrever uma solução puramente aritmética, mas até agora só encontrei expressões longas e confusas.


Ah, entendi: é basicamente a mesma técnica da minha resposta em Python, mas com uma maneira realmente inteligente de contornar a or. Agradável!
ETHproductions

3

Haskell, 48 43 bytes

s%e=sum[mod x 12+1|x<-[s-1..e+23],x<e||s>e]

O uso é startHour % endHour, com as duas entradas fornecidas no formato de 24 horas.

edit: adicionada melhoria do @ xnor, economizando 5 bytes


Em vez de alterar equando e<s, você pode filtrar o intervalo s%e=sum[mod(x-1)12+1|x<-[s..e+24],x<=e||s>e]. Em seguida, ele salva um byte para mudança de x para baixo por 1: s%e=sum[mod x 12+1|x<-[s-1..e+23],x<e||s>e].
Xnor

3

C #, 73 bytes

a=>b=>{int x=0;for(;;){x+=(a%=24)>12?a-12:a<1?12:a;if(a++==b)return x;}};

Entrada aceitável: números inteiros na faixa [0,23].

Esta solução não usa o LINQ.


Programa completo com casos de teste:

using System;

namespace HowManyTimesABellTowerRings
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int,Func<int,int>>f= a=>b=>{int x=0;for(;;){x+=(a%=24)>12?a-12:a<1?12:a;if(a++==b)return x;}};

            Console.WriteLine(f(10)(12));   //33
            Console.WriteLine(f(1)(5));     //15
            Console.WriteLine(f(11)(15));   //29
            Console.WriteLine(f(22)(10));   //88
            Console.WriteLine(f(10)(10));   //10
            Console.WriteLine(f(11)(10));   //156
            Console.WriteLine(f(0)(23));    //156
            Console.WriteLine(f(22)(1));    //34
        }
    }
}

3

Geléia , 17 16 15 14 bytes

>×24+⁹⁸r’%12‘S

TryItOnline

Quão?

>×24+⁹⁸r’%12‘S - Main link: a, b (24 hr integers, midnight may be 0 or 24)
>              - a>b? (1 if true, 0 if false)
 ×24           - times 24 (24 if a>b, else 0)
    +⁹         - add to b (b+24 if a>b, else b)
      ⁸        - a
       r       - range(a, b+24 or b) ([a,a+1,...,b+24 or b])
        ’      - decrement (vectorises) ([a-1,a,...,b+23 or b-1])
         %12   - mod 12 (vectorises) (number of tolls at each occurrence - 1)
            ‘  - increment (vectorises) (number of tolls at each occurrence)
             S - sum

2

MATL , 14 bytes

yy>24*+&:12X\s

O formato de entrada é como no terceiro exemplo do desafio, ou seja, dois números no formato de 24 horas.

Experimente online!

Explicação

Tome entradas 22, 10como um exemplo.

yy      % Take two inputs implicitly. Duplicate both
        %   STACK: 22, 10, 22, 10
>       % Is the first greater than the second?
        %   STACK: 22, 10, 1
24*     % Multiply by 24
        %   STACK: 22, 10, 24
+       % Add
        %   STACK: 22, 34
&:      % Binary range
        %   STACK: [22 23 24 25 26 27 28 29 30 31 32 33 34]
12X\    % Modulo 12, 1-based
        %   STACK: [10 11 12 1 2 3 4 5 6 7 8 9 10]
s       % Sum of array
        %   STACK: 88
        % Implicitly display

2

PHP, 90 bytes

Formato de entrada '[1,24]' entre 1 e 24

Neste desafio, eu odeio o fato de o PHP perder contra outras linguagens. Eu prefiro mostrar todas as minhas idéias. Talvez um outro PHP Crack encontre uma solução mais curta.

<?list($f,$g)=$_GET[b];for($i=$f;$i-1!=$g|$f>$g&!$c;$s+=$i++%12?:12)$i<25?:$c=$i=1;echo$s;

99 bytes

<?for($i=($b=$_GET[b])[0],$c=($d=$b[1]-$b[0])<0?25+$d:$d+1;$c--;$s+=$i++%12?:12)$i<25?:$i=1;echo$s;

113 bytes de uma maneira com min e max

<?for($i=min($b=$_GET[b]);$i<=$m=max($b);)$s+=$i++%12?:12;echo($b[0]>$b[1])?156-$s+($m%12?:12)+($b[1]%12?:12):$s;

bem essa idéia maluca trabalha com uma variedade de 149 Bytes preenche a matriz $y[0]e $y[1]se $_GET["b"][0]<=$_GET["b"][1] se $y[1]é nullque podemos resumir esta matrizarray_diff_key($y[0],array_slice($y[0],$b[1],$b[0]-$b[1]-1,1))

<?for(;++$i<25;)$y[$i>=($b=$_GET[b])[0]&$i<=$b[1]][$i]=$i%12?:12;echo array_sum($y[1]??array_diff_key($y[0],array_slice($y[0],$b[1],$b[0]-$b[1]-1,1)));

Isso poderia ser diminuído em 124 bytes

<?for(;++$i<25;)$x[($v=($b=$_GET[b])[0]>$b[1])?$i<$b[0]&$i>$b[1]:$i>=$b[0]&$i<=$b[1]][$i]=$i%12?:12;echo array_sum($x[!$v]);

Agora, neste ponto, podemos reduzir a matriz com apenas duas polegadas 101 bytes. Faça 2 somas $x[0]e$x[1]

list($f,$g)=$_GET[b];

se, em $v=($f>$g seguida, agregar valor, caso $x[$i<$f&$i>$g] contrário, agregar valor à $x[$i>=$f&$i<=$g] saída será encontrado caso a casoecho$x[!$v];

<?list($f,$g)=$_GET[b];for(;++$i<25;)$x[($v=$f>$g)?$i<$f&$i>$g:$i>=$f&$i<=$g]+=$i%12?:12;echo$x[!$v];

Depois disso, encontrei uma maneira de calcular o resultado diretamente 112 Bytes

<?list($x,$y)=$_GET[t];echo(($b=$x>$y)+(($x-($s=$x%12?:12)^$y-($t=$y%12?:12))xor$b))*78-($s*($s-1)-$t*($t+1))/2;

103 bytes recursivos

<?list($x,$y)=$_GET[t];function f($x,$y){return($x%12?:12)+($x-$y?f(++$x<25?$x:1,$y):0);}echo f($x,$y);

2

PHP, 69 bytes

list(,$i,$a)=$argv;for($a+=$i>$a?24:0;$i<=$a;)$n+=$i++%12?:12;echo$n;

A extração da lista foi inspirada na resposta de Jörg Hülsermann, mas o restante das semelhanças é resultado de uma evolução convergente e porque é bem mais curto e os condicionais no loop são diferentes o suficiente. Estou publicando como uma resposta separada.

Recebe a entrada como 24 horas (multa com 0 ou 24). Executar como:

php -r "list(,$i,$a)=$argv;for($a+=$i>$a?24:0;$i<=$a;)$n+=$i++%12?:12;echo$n;" 9 18

$i>$a?24:0tem o mesmo tamanho que ($i>$a)*24 wiki.php.net/rfc/short_list_syntax Talvez você queira usar a sintaxe da lista curta que é nova em 7.1-2 [$x,$i,$a]=$argv;Bytes Antes de eu testar, não o usaria. Bem agora, eu me odeio mais do que não encontrei.
Jörg Hülsermann 4/16

obrigado, eu sabia sobre a próxima sintaxe da lista curta, mas como o php 7.1 ainda não foi lançado corretamente (ainda no candidato a lançamento 3 no momento da redação), presumi que ainda não era permitido nas respostas do PPCG.
user59178

2

Java, 72 71 78 76 bytes

Usage: 
    pm:    true if first time is past 11am
    time:  first time%12
    pm2:   true if second time is past 11am
    time2: second time%12

Editar :

  • -1 byte desativado. Graças a @ 1Darco1
  • Cabeça de função fixa. +7 bytes em.
  • -2 bytes desativados. Obrigado a @Kevin Cruijssen
  • +2 bytes em. Agora e/ clocké inicializado.

(a,b,c,d)->{int e=0;b+=a?12:0;d+=c?12:0;for(;b!=d;e+=b%12,b=++b%24);return e;}

Ungolfed:

public static int clock(boolean pm, int time, boolean pm2, int time2){
  int clock=0;
  time+=pm?12:0;
  time2+=pm2?12:0;
  while(time!=time2){
    clock+=time%12;
    time=++time%24;
  }
  return clock;
}

Onde você define a, e d, e b? O método completo faz sentido, mas, a menos que eu esteja sentindo falta de alguma coisa, acho que você precisa olhar novamente para o seu lambda golfado e realmente tentar executá-lo. Para mais golfe: (time+1)pode se tornar ++time.
precisa saber é o seguinte

Há um erro na parte do golfe: a+=a?deveria ser b+=a?. Além disso, você pode jogá-lo em 2 bytes alterando o whilepara um sem corpo forcomo este:(a,b,c,d)->{int e;b+=a?12:0;d+=c?12:0;for(;b!=d;e+=b%12,b=++b%24);return e;}
Kevin Cruijssen

Desculpe. Eu escrevi essa abordagem no meu celular e não pude testá-la. Fixo. :)
Roman Gräf

1

QBIC , 90 47 bytes

Então, aqui está a resposta, imprimindo apenas o número total de campainhas:

::{c=a~c>12|c=c-12]d=d+c~a=b|_Xd]a=a+1~a>24|a=1

A entrada está dentro do intervalo 1-24 ; ae bsão as entradas ( ::no código), cmantém registro de am / pm, dé o número total de toques. Quando contamos todas as horas, _Xdencerra o programa, imprimindo dno processo.


OK, eu não entendi a pergunta e achei que o 1+2+3...=texto fazia parte do resultado, então escrevi o seguinte:

::{c=a~c>12|c=c-12]X=!c$Z=Z+X+@+| d=d+c~a=b|?left$$|(Z,len(Z)-1)+@ =|+!d$_X]a=a+1~a>24|a=1

Agora, eu vou codificar a resposta correta ...



1

C #, 76 bytes

(a,b)=>Enumerable.Range(a,Math.Abs(b-a)+1).Select(n=>n%12==0?12:n%12).Sum();

Isso não parece que envolve a meia-noite.
Neil

Todos os casos de teste foram bem
downrep_nation 04/04

Eu não perguntei isso.
Neil

Então, qual seu caso de teste falha com minha implementação?
downrep_nation

a=23e b=0parece ser o exemplo mais óbvio.
Neil

1

Perl, 36 bytes

Inclui +1 para -p

Dê a hora de início e de término no formato de 24 horas em uma linha cada, no STDIN:

toll.pl
11
15
^D

toll.pl:

#!/usr/bin/perl -p
$\+=$_%12||12for$_..$_+(<>-$_)%24}{

1

Java 7, 64 bytes

int c(int x,int y){return(x%12<1?12:x%12)+(x!=y?c(-~x%24,y):0);}

Método recursivo baseado na resposta Python 2 do @ETHproductions . Usa uma entrada de relógio de 24 horas.

Ungolfed & código de teste:

Experimente aqui.

class M{
  static int c(int x, int y){
    return (x%12 < 1
             ? 12
             : x%12)
         + (x != y
             ? c(-~x % 24, y)
             : 0);
  }

  public static void main(String[] a){
    System.out.println(c(10, 12));
    System.out.println(c(1, 5));
    System.out.println(c(11, 15));
    System.out.println(c(10, 22));
    System.out.println(c(5, 5));
  }
}

Saída:

33
15
29
88
5

1

Lote, 168 91 bytes

@cmd/cset/ax=(%1+23)%%24,y=x+(%2+24-%1)%%24,z=y%%12+1,(y/12-x/12)*78+z*-~z/2-(x%%=12)*-~x/2

Editar: economizou 77 bytes mudando para um formulário fechado para a resposta.

  • %1e %2são os dois parâmetros de linha de comando
  • @ Desabilitar o padrão do Lote, que é o eco do comando
  • cmd/c Engane o lote para imprimir imediatamente o resultado do cálculo
  • set/a Executar um cálculo numérico
  • x=(%1+23)%%24, Normalize a hora de início para ser o número de horas desde a 01:00 (13:00 também funcionaria, mas 11 não é menor que 23)
  • y=x+(%2+24-%1)%%24, Normalize a hora final para ficar à frente da hora inicial, avançando para o dia seguinte, se necessário
  • z=y%%12+1, Número de sinos tocados na hora final
  • (y/12-x/12)*78+ Número de sinos devido a meio dia extra
  • z*~-z/2- Número de sinos desde 1 até a hora final, inclusive
  • (x%%=12) Um a menos que o número de sinos tocados na hora de início
  • *-~x/2 Número de sinos que teriam sido tocados desde 1 hora até a hora inicial, mas não incluindo a hora inicial

1

C, 56 bytes

f(a,b,c=0){while(b-->a){c+=b>12?b-12:b;}printf("%d",c);}

1

> <> , 48 + 2 = 50 bytes

<v$&%$-&:$+}:*2c
{>:?!v1-}:1+
v?=1l<++1%c+b$
>n;

A entrada deve estar presente na pilha no início do programa, portanto, +2 bytes para o -vsinalizador. A entrada é dois números inteiros que especificam a hora no relógio de 24 horas; portanto, 10am - 10pmseria dado como 10 22.

Experimente online!


@LuisMendo Obrigado, está consertado agora #
Sok

1

Cubix , 45 44 bytes

Salvo 1 byte, graças a @ETHproductions

Minha primeira incursão no Cubix ...

)$424tU4OI0Iuq;;-!^;^%&21u+rr;ss!;sqU>&%r$@;

Ou cubificado:

      ) $ 4
      2 4 t
      U 4 O
I 0 I u q ; ; - ! ^ ; ^
% & 2 1 u + r r ; s s !
; s q U > & % r $ @ ; .
      . . .
      . . .
      . . .

Você pode experimentá-lo no intérprete online . A entrada está no formato de 24 horas, com o horário final primeiro. Por exemplo, das 17:00 às 01:00 a entrada deve ser 1 17.


Versão anterior, 45 bytes:

)$442t\/OI0Iuq;;-!^;^%&21u+rr;ss!;sqU>&%r$@.;

11
Obrigado por usar a minha língua, e grande trabalho :-) Eu vejo uma pequena byte você pode salvar rearranjando um pouco e deixar cair o no-op:)$424tU4OI0Iuq;;-!^;^%&21u+rr;ss!;sqU>&%r$@;
ETHproductions

0

Qbasic, 112 bytes

input "",a
input "",b
do
if a=25 then a=1
if a<=12 then
c=c+a
else
c=c+a-12
endif
a=a+1
loop until a=b+1
print c

Você não deve produzir 12 quando as horas inicial e final são zero?
Neil

0

Python, 73 bytes

Seria muito menor se não tivéssemos para apoiar pma am. Eu uso a recursão para apoiá-lo.

f=lambda a,b:sum([~-i%12+1for i in range(a,b+1)]*(a<b)or[f(a,24),f(1,b)])

Experimente online

Sem suporte pmpara am(45 bytes):

lambda a,b:sum(~-i%12+1for i in range(a,b+1))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.