Hitung tiket keberuntungan dalam rentang yang diberikan

18

Di Rusia kami memiliki sesuatu seperti tradisi: kami ingin mencari tiket keberuntungan.

Seperti apa bentuk tiket reguler:

tiket bus

Seperti yang Anda lihat, tiket memiliki nomor enam digit.

Angka enam digit dianggap beruntung jika jumlah dari tiga digit pertama sama dengan jumlah dari tiga digit terakhir.

Nomor pada foto tidak beruntung:

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

Tantangan

Dengan batas tertentu (termasuk), kembalikan jumlah nomor tiket keberuntungan yang terkandung di dalamnya.

Parameter

  • Input: 2 bilangan bulat: bilangan bulat pertama dan terakhir dalam kisaran
  • Input akan termasuk antara 0 dan 999999 inklusif
  • Output: 1 integer: berapa banyak angka keberuntungan dalam kisaran
  • Anda dapat mengambil input dan mengembalikan output dalam format apa pun yang dapat diterima
  • Asumsikan nol terdepan untuk angka kurang dari 100000.

Contohnya

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

Ini adalah sehingga jawaban terpendek dalam byte di setiap bahasa menang.

Perbarui: ini yang beruntung orang yang beruntung

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

Jawaban:

10

05AB1E , 8 (atau 10?) 11 (atau 13?) Byte

Ÿʒ₄n+¦S3ôOË

Cobalah secara online atau verifikasi beberapa kasus uji lagi .

CATATAN: Dalam string dan bilangan bulat 05AB1E dapat dipertukarkan, sehingga nomor output tidak mengandung angka nol di depan. Namun ini bisa diperbaiki dengan 1 byte tambahan ( 12 byte ):

Ÿ₄n+€¦ʒS3ôOË

Cobalah secara online atau verifikasi beberapa kasus uji lagi .

+3 byte untuk memperbaiki bug angka dengan panjang 3 atau kurang (kisaran [000000, 000999]).

Penjelasan:

Ÿ          # 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: Sepertinya saya (dan sebagian besar jawaban lainnya) sedikit salah membaca tantangan dan jumlah angka yang ditanyakan alih-alih angka itu sendiri dalam kisaran. Dalam hal ini sebuah trailing }gdapat ditambahkan (tutup filter; dan dapatkan jumlah angka yang tersisa dalam daftar yang difilter), jadi sebagai gantinya 10 13 byte :

Ÿʒ₄nS3ôOË}g

Cobalah secara online atau verifikasi beberapa kasus uji lagi .

Kevin Cruijssen
sumber
Untuk rentang yang dimulai di bawah 1000 (Misalnya [0; 1000]), hasil Anda tampaknya sedikit tidak aktif (1000 angka keberuntungan ditemukan).
frosqh
1
Jika saya memahami tantangan dengan benar, menambahkan 1.000.000 ke setiap nomor dan menghapus karakter pertama akan menyelesaikan masalah ini. Itu juga akan menyingkirkan menggunakan R.
Adnan
@ Adnan Terima kasih, itu memang cara yang cukup bagus untuk menanganinya.
Kevin Cruijssen
Ini adalah hitungan yang diperlukan (dan output tidak memerlukan angka nol di depan), jadi 13.
Jonathan Allan
9

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

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])

Cobalah online!

18 byte untuk using System.Linq;. Saya kira format input dan output bisa fleksibel. Jadi saya mengambil dua bilangan bulat sebagai input (kisaran, inklusif).

Beberapa hasil tes:

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
sumber
8

JavaScript (ES6), 66 byte

Mengambil input dalam sintaks currying (m)(n), di mana m adalah batas atas inklusif eksklusif dan n adalah batas bawah inklusif.

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

Cobalah online!

Bagaimana?

Kami menguji setiap nomor dengan berjalan melalui digit d i dan memperbarui total t :ndsayat

  • jika setidaknya ada 3 digit tersisa setelah initt-dsaya
  • sebaliknyatt+dsaya

Jika kita memiliki pada akhir proses, maka n adalah angka keberuntungan.t=0n


JavaScript (ES6), 67 byte

Format input yang sama.

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

Cobalah online!

Bagaimana?

n

  • 100038937 --> 38.937
  • memaksa ke string dan membagi: ['3','8','.','9','3','7']
  • bergabung dengan +:"3+8+.+9+3+7"
  • ganti +.dengan ^:"3+8^+9+3+7"
  • 0241119

Jika , tidak ada titik desimal yang dihasilkan dan ekspresi yang dievaluasi hanyalah jumlah positif (falsy), kecuali (benar). Ini adalah hasil yang diharapkan dalam kedua kasus.n = 0n0(mod1000)n=0

Arnauld
sumber
Itu dibuat inklusif.
Jonathan Allan
7

Ruby , 56 54 byte

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

Cobalah online!

Metode:

  1. Untuk setiap angka, buat array angka (yang dibalik)
  2. Membandingkan jumlah dari 3 digit pertama dalam array (3 terakhir dalam jumlah) dikalikan 2 dengan jumlah seluruh array
  3. Menghitung angka yang jumlah keduanya sama
Asone Tuhid
sumber
6

Japt , 38 15 byte

õV Ëì ò3n)mx r¥

-23 terima kasih kepada Shaggy!

Pengajuan Japt pertama saya; terima kasih kepada Shaggy untuk semua bantuannya!

Cobalah online!

Amfibologis
sumber
Selamat Datang di Japt! :)
Shaggy
@Shaggy, terima kasih! Ini bahasa yang cukup rapi!
Amfibologis
Untuk membantu Anda memulai . Jangan ragu untuk melakukan ping ke saya di obrolan jika Anda memiliki pertanyaan.
Shaggy
@ Shaggy Itu luar biasa. Saya benar-benar belajar banyak dari itu. Apakah Anda berencana mempostingnya sebagai jawaban Anda sendiri? Kamu harus!
Amfibologis
Tidak, Anda dapat memilikinya :) Seperti yang saya katakan, untuk membantu Anda memulai.
Shaggy
6

Python 3, 117 113 106 135 byte

Ini adalah jawaban pertama saya, jadi saya yakin ada ruang untuk perbaikan.

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 byte terima kasih kepada WW
  • -7 byte berkat Asone Tuhid
  • +29 byte untuk membuat fungsi

Mendapat tiga digit pertama melalui divisi integer, dan tiga digit terakhir melalui modulo. Bilangan bulat pertama dan terakhir dalam kisaran yang diinput sebagai argumen dari xfungsi, seperti adan b, masing-masing. Keluaran ndicetak.

Tidak Disatukan:

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)
pengguna8276
sumber
1
Anda tidak perlu lekukan setelah btw if. Juga mungkin akan lebih murah untuk mengonversi ke string sebelum Anda mengambil 3 digit pertama atau terakhir.
Wheat Wizard
2
Selamat datang di PPCG! Lihat kiat untuk bermain golf di Python untuk kiat dan trik, ada utas serupa untuk sebagian besar bahasa jika Anda tertarik. Selain itu, praktik yang baik untuk menyertakan tautan TIO sebagai demonstrasi.
Asone Tuhid
Saya sarankan mengganti n=n+1dengan n+=1dan memindahkannya tepat setelah pernyataan if ( if...:n+=1)
Asone Tuhid
Anda tidak dapat mengambil adan bsebagai variabel yang dideklarasikan sebelumnya. Anda harus memiliki fungsi atau membawanya melalui input
Jo King
1
Jika Anda menyimpannya sebagai fungsi, Anda dapat memindahkan n=0bagian ke header, sepertidef x(a,b,n=0)
Jo King
6

R , 93 86 byte

Logika yang lebih pendek di akhir pujian dari @ Giuseppe /

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

Cobalah online!

Input integer. Pad dengan mereka 0. Konversikan ke enam poin kode ASCII. Menyalahgunakan Fbuiltin.

ngm
sumber
Saya mendapatkan NA yang dikembalikan dari fungsi itu.
Robert S.
Saya telah memutar kembali hasil edit. Versi baru gagal pada 0 karena scipenmasalah. Baiklah.
ngm
91 byte
Giuseppe
86 byte
Giuseppe
6

Sekam , 12 byte

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

Cobalah online!

Penjelasan

#(§¤=Σ↓↑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
ბიმო
sumber
Tampaknya solusi Anda memiliki kelemahan yang sama dengan versi awal saya: [000000, 001001]harus menghasilkan 2( 000000dan 001001), tetapi menghasilkan 1001sebaliknya. (Saya menambahkan 1,000,000dan menghapus trailing 1sebagai perbaikan untuk itu, tidak yakin seberapa mudah / byte-efisien yang ada di Husk.)
Kevin Cruijssen
1
@KevinCruijssen: Saya pikir saya dapat mengingat tantangan ini pada awalnya tidak jelas, saya tidak punya waktu untuk memeriksanya, jadi saya hanya memutar kembali ke pengiriman awal saya yang sepertinya benar.
ბიმო
5

Arang , 15 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Saya awalnya berpikir bahwa itu adalah daftar angka keberuntungan yang diperlukan. Ini dapat dilakukan dalam 14 byte (dengan menghapus , yang membutuhkan panjang daftar), atau dalam 20 byte jika Anda menginginkan beberapa format yang bagus:

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

    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
sumber
4

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

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

Cobalah online!


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

Sebaliknya, untuk menghasilkan setiap tiket adalah +1 byte:

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

Cobalah online!

Dom Hastings
sumber
3

Python 3 , 89 86 byte

-2 Terima kasih kepada Tn. Xcoder.

-3 Menginspirasi dari jawaban 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))

Hasil tes:

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 

Cobalah online!

frosqh
sumber
1
Dalam versi penghitungan, sumdapat membuat generator apa pun sehingga kurung [...] tidak diperlukan
Tn. Xcoder
range(a,b+1)spec sekarang menyatakan "inklusif" (jika bukan Anda bisa menggunakan *rsebagai gantinya a,b- lihat jawaban Python 2 saya). Perhatikan juga bahwa spesifikasi sekarang mengkonfirmasi bahwa memang seharusnya jumlah yang dihasilkan.
Jonathan Allan
3

MATL , 24 byte

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

Cobalah online!

(-2 byte terima kasih kepada Luis Mendo.)

&: - Buat rentang inklusif antara dua angka yang diberikan

1e3&\ - 'divrem' - bagi dengan 1000 dan dapatkan pengingat dan negosiasi dasar dalam dua array.

, - lakukan dua kali

!'03d'&V - transpos dan konversi setiap nilai menjadi string tiga-lebar tanpa-empuk

&s - jumlahkan nilai setiap baris

w - aktifkan untuk mengeluarkan array pengingat dan lakukan ini lagi

] - akhir lingkaran

= - periksa kesetaraan (mengembalikan 1s di tempat-tempat di mana arraynya sama)

s - jumlah mereka untuk mendapatkan hitungan (output implisit)

sundar - Pasang kembali Monica
sumber
3

Kotlin , 152 119 byte

{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()}

Cobalah online!

Mengambil dua bilangan bulat dari mengubahnya menjadi enam string simbol dan menghitung.

Dioptimalkan berkat mazzy dan solusinya hingga 119 byte.

{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')}}

Cobalah online!

YGolybev
sumber
1
Anda dapat memadatkannya hingga 133 byte{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 byte

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

Membawa dua argumen dari tumpukan kosong, output ke atas tumpukan.

Cobalah online!

Bit pintar di sini adalah penggunaan makro yang tidak disebutkan namanya (yaitu, tidak disimpan) yang diduplikasi sebelum eksekusi untuk menjalankan salinan dirinya pada bagian tiga digit lainnya.

Penjelasan

Makro dalam [rA~rA~++rx]memiliki efek "menghitung jumlah digit dari angka tiga digit yang kedua-ke-atas pada tumpukan, kemudian jalankan bagian atas tumpukan yang asli sebagai makro".

Program utama:

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
sumber
3

Pascal (FPC) , 163 153 byte

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.

Cobalah online!

Penjelasan

Berikut ini beberapa kode yang terlihat normal:

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.

Cobalah online!

Lalu saya menyalahgunakan perilaku for for:

  • nilai-nilai loop diatur sebelumnya (dari ake b), sehingga adapat digunakan kembali sebagai variabel loop, menjatuhkan i;
  • pada akhir for loop, variabel loop dibiarkan pada nilai akhir (nilai bsebelum loop). Saya menggunakan bsebagai wadah, menambahkannya ketika nomor keberuntungan ditemukan dan pada akhir loop bjauh dari nilai lamanya dengan jumlah angka keberuntungan, sehingga b-amemberikan hasil yang benar. Ini jatuh s.

Mengganti ddengan operasi langsung pada amemperpendek loop. Mengganti cdengan operasi langsung pada adosis tidak mempersingkat loop, tetapi, setelah menjatuhkan d, loop begindan endtidak perlu dan saya berakhir dengan hanya menggunakan 2 variabel :)

$memulai konstanta heksadesimal dalam kode golf. Meskipun mereka tidak menyimpan byte, mereka menghilangkan ruang yang dibutuhkan sebelum konstanta desimal.

AlexRacer
sumber
3

Java (OpenJDK 8) , 162 byte

... meminjam dari contoh Kotlin di atas.

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();

Cobalah online!

Membandingkan jumlah byte String sama baiknya dengan menjumlahkan digit yang sebenarnya.

Christoph
sumber
2
Anda dapat menyimpan byte dengan currying ( a->b->), tetapi Anda harus memenuhi syarat sepenuhnya IntStreamkarena tidak ada di java.lang.
Jakob
Selamat datang di PPCG! Seperti @Jakob sebutkan, impor adalah bagian dari byte-count, jadi Anda harus menambahkan java.util.stream.di depan IntStreamkode dan byte-count Anda. Seperti yang disebutkan oleh Jakob , Anda dapat menyimpan byte dengan menggunakan a->b->, dan Anda juga dapat menyimpan beberapa byte tambahan dengan mengubah String.formatke "".format. Cobalah online: 139 byte . Jawaban pertama yang bagus. +1 dari saya. Selamat menikmati!
Kevin Cruijssen
2

PHP , 131 byte

<?$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;

Untuk menjalankannya:

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

Contoh:

php -n lucky_tickets.php 100 100000

Atau Coba online!

Night2
sumber
2

Perl 6 , 51 49 byte

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

Cobalah online!

Blok kode anonim yang mengambil dua angka dan mengembalikan jumlah yang beruntung. Waktu habis untuk input yang lebih besar

Jo King
sumber
2

Jelly ,  9  8 byte

-1 berkat Dennis ( rµ...E)S-> r...E€Skarena semuanya vektorisikan.)

rdȷD§E€S

Sebuah dyadic Link yang menerima dua titik akhir dari kisaran (baik yang sebaliknya) yang menghasilkan jumlah tiket yang beruntung.

Cobalah online! Atau lihat test-suite

Bagaimana?

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
sumber
E€Smenyimpan µ.
Dennis
@ Dennis ah ya, saya sedang bekerja dari solusi lain yang tidak vektor semuanya di sepanjang jalan!
Jonathan Allan
2

Powershell, 85 byte

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

Skrip uji:

$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"
}

Keluaran:

      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
mazzy
sumber
Powershell? Saya benar-benar tidak melihat yang datang: D
Дмитрий Архипенко
2

Kotlin, 95 byte

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

.kt untuk tes:

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
}

Penjelasan

Hitung angka dari rentang di mana jumlah semua digit angka sama dengan jumlah ganda dari 3 digit pertama.

mazzy
sumber
1

Python 2 ,  83  80 byte

-3 dengan menggunakan pengamatan Asone Tuhid - pergi berikan kredit!

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

Cobalah online!

Sama seperti jawaban Jelly saya (tetapi input harus diurutkan di sini yaitu a<=b)


75 byte untuk input a, b+1(yaitu rentang tidak termasuk batas kanan):

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

Coba yang ini

Jonathan Allan
sumber
1

Clojure, 102 byte

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

Memadukan string dan matematika tidak terlalu menyenangkan.

NikoNyrh
sumber
1

C (gcc), 90 88 byte

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;}

Port jawaban Java saya . Cobalah online di sini . Berkat ceilingcat untuk bermain golf dua byte.

Tidak Disatukan:

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
}
Ketidakseimbangan
sumber
Sarankan L'✐'alih-alih 10000dan tetapkan 10ke variabel.
ceilingcat
@ceilingcat Saya suka itu memberi saya nama variabel tambahan, tapi saya tidak bisa menyimpan byte dengan menetapkan 10: bit.ly/2O5ND2Y Adapun L'…'triknya, itu rapi; tetapi apakah itu menghemat byte? Menurut saya itu adalah karakter multi-byte, jadi saat menyimpan karakter, ia tidak dapat menyimpan byte ... atau bukan?
OOBalance
@ceilingcat Kesalahan saya, dua byte dapat disimpan dengan menetapkan 10 ke variabel. Terima kasih.
OOBalance
1

Java 8, 101 99 byte

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;}

Pendekatan yang berbeda dari jawaban Java lainnya . Alih-alih menggunakan stream dan Strings, ini menggunakan loop dan mengevaluasi angka-angka secara langsung. Cobalah online di sini .

Berkat ceilingcat untuk bermain golf dua byte.

Tidak Disatukan:

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
}
Ketidakseimbangan
sumber
1

VBA (Excel), 159 byte

Menggunakan Jendela dan Sel Segera [A1] [A2]sebagai input.

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
sumber
1

F #, 110 byte

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

Cobalah online!

tmengubah string menjadi angka dan merangkumnya. rmengambil rentang angka dari shingga e, dan memfilter angka-angka yang tidak beruntung. Tiga digit pertama dikumpulkan oleh n/1000. Tiga digit kedua dihitung oleh n-(n/1000)*1000.

Ciaran_McCarthy
sumber