Conte os bilhetes da sorte dentro do intervalo especificado

18

Na Rússia, temos algo como uma tradição: gostamos de procurar bilhetes da sorte.

Veja como é um ticket normal:

bilhete de autocarro

Como você pode ver, o ticket tem um número de seis dígitos.

Um número de seis dígitos é considerado de sorte se a soma dos três primeiros dígitos for igual à soma dos três últimos.

O número da foto não tem sorte:

038937
038 937
0 + 3 + 8 = 11
9 + 3 + 7 = 19
11 != 19

Desafio

Dado os limites de um intervalo (inclusive), retorne o número de números de bilhetes sorteados contidos nele.

Parâmetros

  • Entrada: 2 números inteiros: o primeiro e o último número inteiro no intervalo
  • As entradas estarão entre 0 e 999999, inclusive
  • Saída: 1 inteiro: quantos números da sorte estão no intervalo
  • Você pode pegar as entradas e retornar a saída em qualquer formato aceitável
  • Suponha zeros à esquerda para números menores que 100000.

Exemplos

0, 1 => 1
100000, 200000 => 5280
123456, 654321 => 31607
0, 999999 => 55252

Isso é então a resposta mais curta em bytes em todos os idiomas vence.

Atualização: aqui está o sortudo pessoa de sorte

Дмитрий Архипенко
fonte
2
Relacionado .
user202729

Respostas:

10

05AB1E , 8 (ou 10?) 11 (ou 13?) Bytes

Ÿʒ₄n+¦S3ôOË

Experimente online ou verifique mais alguns casos de teste .

NOTA: No 05AB1E, cadeias e números inteiros são intercambiáveis, portanto, os números de saída não contêm zeros à esquerda. No entanto, isso pode ser corrigido com 1 byte adicional ( 12 bytes ):

Ÿ₄n+€¦ʒS3ôOË

Experimente online ou verifique mais alguns casos de teste .

+3 bytes para corrigir erros com um comprimento igual ou inferior a 3 (intervalo [000000, 000999]).

Explicação:

Ÿ          # Create an inclusive (on both sides) range from the two inputs
           #  i.e. 038920 and 038910 → 
           #   [38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920]
 ʒ         # Filter this list by:
  n+      #  Add 1,000,000 to the number
     |     #  And remove the leading 1
           #   i.e. 38910 → 1038910 → '038910'
  S        #  Transform it to a list of digits
           #   i.e. '038910' → ['0','3','8','9','1','0']
   3ô      #  Split it into chunks of length 3
           #   i.e. ['0','3','8','9','1','0'] → [['0','3','8'],['9','1','0']]
     O     #  Sum the digits in both parts
           #   i.e. [['0','3','8'],['9','1','0']] → [11,10]
      Ë    #  Check if they are equal (if they are, they remain in the filtered list)
           #   i.e. [11,10] → 0

EDIT: Parece que eu (e a maioria das outras respostas) interpretou mal o desafio e a quantidade de números está sendo solicitada em vez dos números dentro do intervalo. Nesse caso, um final }gpode ser adicionado (feche o filtro e obtenha a quantidade de números restantes na lista filtrada); portanto, são 10 13 bytes :

Ÿʒ₄nS3ôOË}g

Experimente online ou verifique mais alguns casos de teste .

Kevin Cruijssen
fonte
Para o intervalo que começa abaixo de 1000 (por exemplo [0; 1000]), seu resultado parece um pouco desativado (são encontrados 1000 números da sorte).
Frosqh
1
Se eu entendi o desafio corretamente, adicionar 1.000.000 a cada número e remover o primeiro caractere resolveria esse problema. Ele também se livraria do uso do R.
21418 Adnan
@ Adnan Obrigado, essa é realmente uma maneira muito agradável de lidar com isso.
Kevin Cruijssen
É a contagem que é necessária (e a saída não requer zeros à esquerda), portanto 13.
Jonathan Allan
9

C # (.NET Core) , 93 + 18 = 111 bytes

a=>b=>Enumerable.Range(a,b-a+1).Select(e=>$"{e:D6}").Count(e=>e[0]+e[1]+e[2]==e[3]+e[4]+e[5])

Experimente online!

18 bytes para using System.Linq;. Supus que os formatos de entrada e saída pudessem ser flexíveis. Então, tomo dois números inteiros como entrada (o intervalo, inclusive).

Alguns resultados do teste:

a=1000
b=1100

Lucky numbers = 3 [001001, 001010, 001100]

a=2000
b=2100

Lucky numbers = 3 [002002, 002011, 002020]

a=222000
b=222100

Lucky numbers = 7 [222006, 222015, 222024, 222033, 222042, 222051, 222060]

a=0
b=999999

Lucky numbers = 55252 (that's 5.5% of the total numbers)
Charlie
fonte
8

JavaScript (ES6), 66 bytes

Toma entrada em currying sintaxe (m)(n), em que m é o exclusivo inclusiva limite superior e n é o limite inferior inclusivo.

m=>g=n=>n<=m&&![...n+=''].reduce((t,d,i)=>t-=n[i+3]?d:-d,0)+g(-~n)

Experimente online!

Quão?

Testamos cada número percorrendo seus dígitos d ie atualizando um total de t :ndEut

  • se houver pelo menos 3 dígitos restantes após estett-dEu
  • caso contráriott+dEu

Se tivermos no final do processo, então n é um número da sorte.t=0 0n


JavaScript (ES6), 67 bytes

Mesmo formato de entrada.

m=>g=n=>n<=m&&!eval([...n/1e3+''].join`+`.split`+.`.join`^`)+g(n+1)

Experimente online!

Quão?

n

  • 100038937 --> 38.937
  • coagir a uma string e dividir: ['3','8','.','9','3','7']
  • junte-se a +:"3+8+.+9+3+7"
  • substitua +.por ^:"3+8^+9+3+7"
  • 0 0241119

n0 0(mod1000)n=0 0

Arnauld
fonte
Foi feito inclusivo.
27618 Jonathan Allan
7

Ruby , 56 54 bytes

->a,b{(a..b).count{|i|j=i.digits;j[0,3].sum*2==j.sum}}

Experimente online!

Método:

  1. Para cada número, cria uma matriz de dígitos (que sai invertida)
  2. Compara a soma dos 3 primeiros dígitos da matriz (os últimos 3 no número) multiplicados por 2 com a soma de toda a matriz
  3. Conta os números para os quais as duas somas são iguais
Asone Tuhid
fonte
6

Japonês , 38 15 bytes

õV Ëì ò3n)mx r¥

23 graças a Shaggy!

Minha primeira submissão em japonês; obrigado a Shaggy por toda a ajuda!

Experimente online!

Anfibológico
fonte
Bem-vindo ao Japt! :)
Salsicha
@Shaggy thanks! É uma linguagem bem legal!
Amphibological
Para ajudar você a começar . Sinta-se à vontade para me enviar um bate-papo no chat se tiver alguma dúvida.
Shaggy
@ Shaggy Isso é incrível. Eu definitivamente aprendi muito com isso. Você está planejando publicá-lo como sua própria resposta? Você deve!
Amphibological
Não, você pode ter :) Como eu disse, para ajudar você a começar.
Shaggy
6

Python 3, 117 113 106 135 bytes

Esta é minha primeira resposta, então tenho certeza de que há espaço para melhorias.

def x(a,b):
    n=0
    for i in range(a,b+1):
        if sum(map(int,str(i//1000)))==sum(map(int,str(i%1000))):n+=1
    print(n)
  • -4 bytes graças a WW
  • -7 bytes graças a Asone Tuhid
  • +29 bytes para criar uma função

Obtém os três primeiros dígitos pela divisão inteira e os três últimos pelo módulo. O primeiro e o último número inteiro no intervalo são inseridos como argumentos da xfunção, como ae b, respectivamente. A saída é nimpressa.

Ungolfed:

def x(a, b):
    n = 0
    for i in range(a, b + 1):
        if sum(map(int, str(i // 1000))) == sum(map(int, str(i % 1000))):
            n += 1
    print(n)
user8276
fonte
1
Você não precisa do recuo após o if btw. Além disso, provavelmente será mais barato converter em string antes de inserir os primeiros ou os últimos três dígitos.
Assistente de trigo
2
Bem-vindo ao PPCG! Confira Dicas para jogar golfe no Python para dicas e truques. Existe um tópico semelhante para a maioria dos idiomas, se você estiver interessado. Além disso, é uma boa prática incluir um link TIO como demonstração.
Asone Tuhid
Eu sugiro a substituição n=n+1com n+=1e movendo-o logo após a instrução if ( if...:n+=1)
asone Tuhid
Você não pode aceitar ae bcomo variáveis ​​pré-declaradas. Você tem que ter uma função ou levá-los através da entrada
Jo rei
1
Se você o mantiver em função, poderá mover a n=0peça para o cabeçalho, comodef x(a,b,n=0)
Jo King
6

R , 93 86 bytes

Uma lógica mais curta no final complementa @ Giuseppe /

function(a,b){for(i in sprintf("%06d",a:b)){x=utf8ToInt(i);F=F+!sum(x[1:3]-x[4:6])}
F}

Experimente online!

Entradas inteiras. Almofada-los com 0. Converta para os seis pontos de código ASCII. Abuse o Fbuiltin.

ngm
fonte
Estou recebendo um NA retornado dessa função.
Robert S.
Revirei a edição. A nova versão falha em 0 devido ao scipenproblema. Ah bem.
Ng
91 bytes
Giuseppe
86 bytes
Giuseppe
6

Casca , 12 bytes

#ȯ§¤=Σ↓↑3↔d…

Experimente online!

Explicação

#(§¤=Σ↓↑3↔d)…  -- example input: 100000 101000
            …  -- inclusive range: [100000,100001..100999,101000]
#(         )   -- count elements where (example with 100010)
          d    -- | digits: [1,0,0,0,1,0]
         ↔     -- | reversed: [0,1,0,0,0,1]
  §     3      -- | fork elements (3 and [0,1,0,0,0,1])
       ↑       -- | | take: [0,1,0]
      ↓        -- | | drop: [0,0,1]
   ¤=          -- | > compare the results by equality of their
     Σ         -- | | sums 1 == 1
               -- | : 1
               -- : 3
ბიმო
fonte
Parece que sua solução tem a mesma falha da minha versão inicial: [000000, 001001]deve resultar em 2( 000000e 001001), mas resulta em 1001vez disso. (Eu adicionei 1,000,000e removeu a fuga 1como correção para isso, não tenho certeza o quão fácil / byte-eficiente que está em Palha de milho, no entanto.)
Kevin Cruijssen
1
@KevinCruijssen: Acho que me lembro que esse desafio inicialmente não estava claro, não tenho tempo para analisá-lo, então acabei de voltar à minha apresentação inicial, que parece estar certa.
ბიმო
5

Carvão , 15 bytes

ILΦ…·NN⁼Σι⊗Σ÷ιφ

Experimente online! Link é a versão detalhada do código. Edit: Eu originalmente pensei que era a lista de números da sorte que era necessária. Isso pode ser feito em 14 bytes (removendo o , que ocupa o comprimento da lista) ou em 20 bytes, se você desejar uma boa formatação:

EΦ…·NN⁼Σι⊗Σ÷ιφ﹪%06dι

Experimente online! Link é a versão detalhada do código. Explicação:

    NN                  Input the range endpoints
  …·                    Inclusive range
 Φ                      Filter
        ι               Current value
       Σ                Sum of digits
            ι           Current value
             φ          Predefined variable 1000
           ÷            Integer divide
          Σ             Sum of digits
         ⊗              Doubled
      ⁼                 Equals
E                       Map over results
                   ι    Current value
               %06d     Literal string
              ﹪         Format value
                        Implicitly print each result on its own line
Neil
fonte
4

Perl 5 + -pl -MList::Util+(sum), 49 bytes

@F=/./g,$\+=sum@F[5,4,3]==sum@F[2,1,0]for$_..<>}{

Experimente online!


Perl 5 + -nl -MList::Util+(sum) -M5.010, 50 bytes

A saída de cada ticket é +1 byte:

@F=/./g,sum@F[5,4,3]-sum(@F[2,1,0])||say for$_..<>

Experimente online!

Dom Hastings
fonte
3

Python 3 , 89 86 bytes

-2 graças ao Sr. Xcoder.

-3 inspirador das respostas de Asone Tuhid.

lambda a,b:sum(sum(map(int,str(i)))==2*sum(map(int,str(i)[-3:]))for i in range(a,b+1))

Resultados dos testes:

Example 1 : 
a = 0
b = 1
Lucky numbers : 1 

Example 2 : 
a = 100000
b = 200000
Lucky numbers : 5280 

Example 3 : 
a = 123456
b = 654321
Lucky numbers : 31607 

Example 3 : 
a = 0
b = 999999
Lucky numbers : 55252 

Experimente online!

frosqh
fonte
1
Na versão de contagem, sumpode fazer qualquer gerador de modo que os suportes [...] não são necessários
Mr. Xcoder
range(a,b+1)spec agora declara "inclusivo" (se não fosse, você poderia usar *rno lugar do a,bcaminho - veja minha resposta do Python 2). Observe também que as especificações agora confirmam que de fato deve ser a contagem que é emitida.
22618 Jonathan Allan
3

MATL , 24 bytes

&:1e3&\,!'%03d'&V2&sw]=s

Experimente online!

(-2 bytes graças a Luis Mendo.)

&: - Faça um intervalo inclusivo entre os dois números dados

1e3&\ - 'divrem' - divida por 1000 e obtenha os lembretes e quocientes de piso em duas matrizes.

, - faça duas vezes

!'03d'&V - transponha e converta cada valor em uma sequência de três larguras preenchida com zero

&s - soma os valores de cada linha

w - alterne para exibir o array de lembretes e faça isso novamente nesse

] - loop final

= - verifique a igualdade (retorna 1s em locais onde as matrizes são iguais)

s - some aqueles para obter a contagem (saída implícita)

sundar - Restabelecer Monica
fonte
3

Kotlin , 152 119 bytes

{a:Int,b:Int->(a..b).map{String.format("%06d",it)}.filter{it[0].toInt()+it[1].toInt()+it[2].toInt()==it[3].toInt()+it[4].toInt()+it[5].toInt()}.count()}

Experimente online!

Usando dois números inteiros, converta-o em seis cadeias de símbolos e conte.

Otimizado graças ao mazzy e sua solução para 119 bytes.

{a:Int,b:Int->(a..b).count{val d="%06d".format(it);(d[0]-'0')+(d[1]-'0')+(d[2]-'0')==(d[3]-'0')+(d[4]-'0')+(d[5]-'0')}}

Experimente online!

YGolybev
fonte
1
Você pode compactar até 133 bytes{a:Int,b:Int->(a..b).map{"%06d".format(it)}.filter{(it[0]-'0')+(it[1]-'0')+(it[2]-'0')==(it[3]-'0')+(it[4]-'0')+(it[5]-'0')}.count()}
mazzy
3

dc , 44 bytes

sb[d]sD[dA00~[rA~rA~++rx]dx=D1+dlb!<L]dsLxkz

Recebe dois argumentos de uma pilha vazia, que sai para o topo da pilha.

Experimente online!

O ponto inteligente aqui é o uso de uma macro sem nome (isto é, sem armazenamento) que é duplicada antes da execução para executar uma cópia de si mesma na outra parte de três dígitos.

Explicação

A macro interna [rA~rA~++rx]tem o efeito "calcular a soma de dígitos do número de três dígitos que é segundo na parte superior da pilha e, em seguida, execute a parte superior original da pilha como uma macro".

Programa principal:

sb             Saves the upper bound as b so we'll know when to quit
[d]sD          Defines the macro D, which contextually is "increment stack depth"
[              Start the main loop - the next number to test is on top 
  d              Make a copy to increment later for loop purposes
  A00            The literal "1000"
  ~              Quotient and remainder, so "123456" is now "123 456"
  [rA~rA~++rx]d  Stack is now "123 456 M M", where M is the anonymous macro
  x              Run M on the stack "123 456 M", which (see definition 
                 above) ends up running M on the stack "123 15", which
                 leaves "15 6" (and executes the 6, which is a no-op)
  =D             If the two sums were equal, increment the stack depth
  1+             Increment the current test number
  dlb!<L         Loop unless the test number is now larger than b
]dsLx          Name and start the loop
kz             Current depth is 1+answer, so throw away top and return
Sophia Lechner
fonte
3

Pascal (FPC) , 163 153 bytes

var a,b:Int32;begin read(a,b);for a:=a to b do if a div$186A0+a div$2710mod$A+a div$3E8mod$A=a div$64mod$A+a div$Amod$A+a mod$Athen b:=b+1;write(b-a)end.

Experimente online!

Explicação

Aqui está um código de aparência normal primeiro:

var a,b,i,s,c,d:Int32;
begin
  read(a,b);
  s:=0;
  for i:=a to b do begin
    c:=i div 1000;
    d:=i mod 1000;
    if c div 100+(c div 10) mod 10+c mod 10=d div 100+(d div 10) mod 10+d mod 10 then begin s:=s+1; {writeln(i)} end;
  end;
  write('There are ',s,' numbers');
end.

Experimente online!

Então eu abusei do comportamento do loop for:

  • os valores do loop são definidos previamente (de apara b), para que apossam ser reutilizados como a variável do loop, caindo i;
  • no final do loop for, a variável do loop é deixada no valor final (valor de bantes do loop). Eu usei bcomo um contêiner, incrementando-o quando um número da sorte é encontrado e no final do loop bestá longe de seu valor antigo pela quantidade de números da sorte, b-afornecendo o resultado correto. Isso caiu s.

Substituir dpor operações diretamente areduz o loop. Substituir cpor operações diretamente na adose não diminui o loop, mas, depois de soltar d, os loop begine endsão desnecessários e eu terminei usando apenas 2 variáveis ​​:)

$inicia constantes hexadecimais no código golfed. Enquanto eles não salvam bytes, eles eliminam os espaços necessários antes das constantes decimais.

AlexRacer
fonte
3

Java (OpenJDK 8) , 162 bytes

... empresta do exemplo de Kotlin acima.

import java.util.stream.IntStream;

(a,b)->IntStream.range(a,b+1).mapToObj(i->String.format("%06d",i).getBytes()).filter(c->c[0]+c[1]+c[2]==c[3]+c[4]+c[5]).count();

Experimente online!

Comparar a soma dos bytes da String é tão bom quanto resumir os dígitos reais.

Christoph
fonte
2
Você pode salvar um byte fazendo currying ( a->b->), mas precisará se qualificar totalmente, IntStreampois ele não está java.lang.
21418 Jakob
Bem-vindo ao PPCG! Como o @Jakob mencionou, as importações fazem parte da contagem de bytes, então você precisará adicionar a java.util.stream.frente do IntStreamcódigo e a contagem de bytes. Como também mencionado por Jakob , você pode salvar um byte usando a->b->e também pode salvar alguns bytes adicionais alterando String.formatpara "".format. Experimente online: 139 bytes . Boa primeira resposta, no entanto. +1 de mim. Aproveite sua estadia!
Kevin Cruijssen
2

PHP , 131 bytes

<?$f='array_sum(str_split(str_split(sprintf("%06d",$i),3)[';for($i=$argv[1]-1;$i++<$argv[2];)eval("\$a+=$f 0]))==$f 1]));");echo$a;

Para executá-lo:

php -n <filename> <from> <to>

Exemplo:

php -n lucky_tickets.php 100 100000

Ou Experimente online!

Night2
fonte
2

Perl 6 , 51 49 bytes

{+grep {[==] .flip.comb[^3,3..*]>>.sum},$^a..$^b}

Experimente online!

Bloco de código anônimo que recebe dois números e retorna o número de sortudos. Tempo limite para entradas maiores

Brincadeira
fonte
2

Geléia ,  9  8 bytes

-1 graças a Dennis ( rµ...E)S-> r...E€Sjá que tudo vetoriza.)

rdȷD§E€S

Um link diádico que aceita os dois pontos finais do intervalo (de qualquer maneira) que gera a contagem de tíquetes da sorte.

Experimente online! Ou veja uma suíte de testes

Quão?

1000000N1000
X=N1000

Y=Nmod1000
N=1000×X+Y

XYN

rdȷD§E€S - Link: integer a; integer b
r        - inclusive range [a,b] (either [a,a+1,a+2,...,b] or [a,a-1,a-2,...,b])
         -                              e.g.: 0       or 78        or 7241
  ȷ      - literal 1000
 d       - divmod (vectorises)                [0,0]      [0,78]       [7,241]
   D     - to decimal lists (vectorises)      [[0],[0]]  [[0],[7,8]]  [[7],[2,4,1]]
    §    - sum each (vectorises)              [0,0]      [0,15]       [7,7]
     E€  - for €ach: all equal?               1          0            1
       S - sum (counts the 1s in the resulting list)
Jonathan Allan
fonte
E€Ssalva o µ.
22418 Dennis
@ Dennis ah sim, eu estava trabalhando com outra solução que não vetorizou tudo ao longo do caminho!
Jonathan Allan
2

Powershell, 85 bytes

($args[0]..$args[1]|%{'{0:D6}'-f$_}|?{+$_[0]+$_[1]+$_[2]-eq+$_[3]+$_[4]+$_[5]}).count

Script de teste:

$f = {

($args[0]..$args[1]|%{'{0:D6}'-f$_}|?{+$_[0]+$_[1]+$_[2]-eq+$_[3]+$_[4]+$_[5]}).count

}

@(
    ,((0,1), 1)
    ,((1000,2000), 3)
    ,((2000,3000), 6)
    ,((10000, 20000), 282)
    ,((101000, 102000), 6)
    ,((201000, 202000), 10)
    ,((901000, 902000), 63)
    ,((100000, 200000), 5280)
    ,((123456, 654321), 31607)
    #,((0, 999999), 55252)
) | % {
    $c, $e = $_
    "      $c"
    $r = &$f $c[0] $c[1]
    "$($e-eq$r): actual=$r expected=$e"
}

Resultado:

      0 1
True: actual=1 expected=1
      1000 2000
True: actual=3 expected=3
      2000 3000
True: actual=6 expected=6
      10000 20000
True: actual=282 expected=282
      101000 102000
True: actual=6 expected=6
      201000 202000
True: actual=10 expected=10
      901000 902000
True: actual=63 expected=63
      100000 200000
True: actual=5280 expected=5280
      123456 654321
True: actual=31607 expected=31607
confuso
fonte
Powershell? Eu realmente não vi esse chegando: D
Дмитрий Архипенко
2

Kotlin, 95 bytes

{a:Int,b:Int->(a..b).count{val d="%06d".format(it);d.chars().sum()==2*d.take(3).chars().sum()}}

.kt para teste:

var  f = {a:Int,b:Int->(a..b).count{val d="%06d".format(it);d.chars().sum()==2*d.take(3).chars().sum()}}

fun main(args: Array<String>) {
    println(f(0,1))             // 1
    println(f(1000,2000))       // 3
    println(f(2000,3000))       // 6
    println(f(101000, 102000))  // 6
    println(f(201000, 202000))  // 10
    println(f(901000, 902000))  // 63
    println(f(10000, 20000))    // 282
    println(f(100000, 200000))  // 5280
    println(f(123456, 654321))  // 31607
    println(f(0, 999999))       // 55252
}

Explicação

Contar números do intervalo em que a soma de todos os dígitos numéricos é igual à soma dupla dos 3 primeiros dígitos.

confuso
fonte
1

Python 2 ,  83  80 bytes

-3 usando a observação de Asone Tuhid - vá dar crédito!

lambda a,b:sum(sum(map(int,`v/1000`))*2==sum(map(int,`v`))for v in range(a,b+1))

Experimente online!

Muito parecido com a minha resposta Jelly (mas as entradas devem ser classificadas aqui, ie a<=b)


75 bytes para entrada a, b+1(ou seja, o intervalo exclui o limite direito):

lambda*r:sum(sum(map(int,`v/1000`))*2==sum(map(int,`v`))for v in range(*r))

Tente este

Jonathan Allan
fonte
1

Clojure, 102 bytes

#(count(for[i(range %(inc %2)):when(=(let[d(map int(format"%06d"i))](apply +(map -(drop 3 d)d)))0)]i))

Misturar cordas e matemática não é muito divertido.

NikoNyrh
fonte
1

C (gcc), 90 88 bytes

l=10;u(c,k,y){for(y=0;c<=k;)c++%l+c/l%l+c/100%l-c/1000%l-c/10000%l-c/100000%l?:++y;c=y;}

Porta da minha resposta Java . Experimente online aqui . Obrigado ao ceilingcat por jogar dois bytes.

Ungolfed:

l=10; // constant, we will be using the number 10 rather a lot
u(c, k, // function returning an integer and taking two integer arguments: lower and upper bound
  y) { // abusing the argument list to declare a variable of type integer: the number of lucky tickets found in the range
    for(y = 0; c <= k; ) // set count to 0 and loop through the range
        c++ %l + c/l %l + c/100 %l // if the digit sum of the second half of the ticket number ...
        - c/1000 %l - c/10000 %l - c/100000 %l // ... is the same as the digit sum of the first half ...
        ?: ++y; // ... it's a lucky ticket: increment the count
    c = y; // return the count
}
OOBalance
fonte
Sugira em L'✐'vez de 10000e atribua 10a uma variável.
ceilingcat
@ceilingcat Gosto que ele me dê um nome de variável extra, mas não pude salvar bytes atribuindo 10: bit.ly/2O5ND2Y Quanto ao L'…'truque, é legal; mas salva bytes? Parece-me que é um caractere de vários bytes, portanto, ao salvar caracteres, ele não pode salvar bytes ... ou pode?
OOBalance
@ceilingcat Meu erro, é possível salvar dois bytes atribuindo 10 a uma variável. Obrigado.
OOBalance
1

Java 8, 101 99 bytes

u->l->{int n=0,d=10;for(;l<=u;)if(l++%d+l/d%d+l/100%d==l/1000%d+l/10000%d+l/100000%d)++n;return n;}

Uma abordagem diferente da outra resposta Java . Em vez de usar fluxos e Strings, isso usa um loop e avalia os números diretamente. Experimente online aqui .

Obrigado ao ceilingcat por jogar dois bytes.

Ungolfed:

u -> l -> { // lambda taking two integer arguments in currying syntax and returning an integer
    int n = 0, // the counter
        d = 10; // auxiliary constant, we will be using the number 10 rather a lot
    for(; l <=u ; ) // loop over all ticket numbers in the range
        if(l++ %d + l/d %d + l/100 %d // if the digit sum of the second half of the number ...
           == l/1000 %d + l/10000 %d + l/100000 %d) // ... is the same as the digit sum of the first half ...
            ++n; // ... it's a lucky ticket, add 1 to the counter
    return n; // return the count
}
OOBalance
fonte
1

VBA (Excel), 159 bytes

Usando Janela Imediata e Células [A1] [A2]como entrada.

c=[A1]-[A2]:d=IIf(c<0,[A1],[A2]):For x=d To d+Abs(c):e=String(6-Len(x),"0")&x:For y=1To 3:i=i+Mid(e,y,1):j=j+Mid(e,7-y,1):Next:z=IIf(i=j,z+1,z):i=0:j=0:Next:?z
remoel
fonte
1

F #, 110 bytes

let t=string>>Seq.sumBy(int>>(-)48)
let r s e=Seq.where(fun n->t(n/1000)=t(n-(n/1000)*1000)){s..e}|>Seq.length

Experimente online!

tconverte a string em números e os resume. rpega o intervalo de números de saté ee filtra os números que não têm sorte. Os três primeiros dígitos são coletados por n/1000. Os segundos três dígitos são calculados por n-(n/1000)*1000.

Ciaran_McCarthy
fonte