Порахуйте щасливі квитки в межах даного діапазону


18

У Росії у нас є щось на зразок традиції: ми любимо шукати вдалі квитки.

Ось як виглядає звичайний квиток:

квиток на автобус

Як бачите, у квитка є шестизначний номер.

Шестицифрове число вважається щасливим, якщо сума перших трьох цифр дорівнює сумі останніх трьох цифр.

Номер на фотографії не пощастило:

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

Виклик

Враховуючи обмеження діапазону (включно), поверніть кількість щасливих номерів квитків, що містяться в ньому.

Параметри

  • Вхід: 2 цілих числа: перше і останнє ціле число в діапазоні
  • Вхід буде від 0 до 999999 включно
  • Вихід: 1 ціле число: скільки щасливих чисел у діапазоні
  • Ви можете взяти входи та повернути вихід у будь-якому прийнятному форматі
  • Припустимо провідні нулі для чисел менше 100000.

Приклади

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

Це тому найкоротша відповідь у байтах на всіх мовах виграє.

Оновлення: ось щасливчик щасливчик


Відповіді:


10

05AB1E , 8 (або 10?) 11 (або 13?) Байт

Ÿʒ₄n+¦S3ôOË

Спробуйте в Інтернеті або перевірте ще кілька тестових випадків .

ПРИМІТКА: У 05AB1E рядки та цілі числа є взаємозамінними, тому вихідні числа не містять провідних нулів. Однак це може бути виправлено одним додатковим байтом ( 12 байт ):

Ÿ₄n+€¦ʒS3ôOË

Спробуйте в Інтернеті або перевірте ще кілька тестових випадків .

+3 байт для виправлення помилок чисел довжиною 3 або менше (діапазон [000000, 000999]).

Пояснення:

Ÿ          # 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: Здається, я (і більшість інших відповідей) трохи неправильно прочитав виклик, і кількість запитуваних запитань замість самих чисел у межах діапазону. У такому випадку }gможна додати кінцевий слід (закрийте фільтр; і отримайте кількість номерів, залишених у відфільтрованому списку), тож натомість це 10 13 байт :

Ÿʒ₄nS3ôOË}g

Спробуйте в Інтернеті або перевірте ще кілька тестових випадків .


Для діапазону, що починається від 1000 (наприклад, [0; 1000]), ваш результат, здається, трохи відхилений (знайдено 1000 щасливих чисел).
frosqh

1
Якщо я правильно розумію виклик, додавання 1.000.000 до кожного числа та видалення першого символу вирішило б цю проблему. Це також позбудеться використання R.
Аднан

@Adnan Спасибі, це справді досить приємний спосіб впоратися.
Кевін Кройсейсен

Саме підрахунок необхідний (а вихід не вимагає провідних нулів), тому 13.
Джонатан Аллан

9

C # (.NET Core) , 93 + 18 = 111 байт

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

Спробуйте в Інтернеті!

18 байт для using System.Linq;. Я вважав, що формати введення та виведення можуть бути гнучкими. Тому я беру два цілі числа як вхідні (діапазон, включно).

Деякі результати тесту:

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)

8

JavaScript (ES6), 66 байт

Приймає вхід в синтаксис каррі (m)(n), де m - виключна включна верхня межа, а n - нижня межа включно.

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

Спробуйте в Інтернеті!

Як?

Ми перевіряємо кожне число , провівши його цифри d i та оновивши загальну t :ndit

  • якщо після цієї є щонайменше 3 цифриttdi
  • іншому випадкуtt+di

Якщо ми маємо в кінці процесу, то n - щасливе число.t=0n


JavaScript (ES6), 67 байт

Той самий формат введення.

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

Спробуйте в Інтернеті!

Як?

Для кожного числа :n

  • розділити його на : напр100038937 --> 38.937
  • примусити до рядка і розділити: ['3','8','.','9','3','7']
  • приєднатися до +:"3+8+.+9+3+7"
  • замінити +.на ^:"3+8^+9+3+7"
  • оцінити як JS-код і перевірити, чи є результат : ( 11 XOR 19 )0241119

Якщо не утворюється десяткова крапка, і оцінене вираження є лише позитивною сумою (хибною), якщо n = 0 (truthy). Це очікуваний результат в обох випадках.n0(mod1000)n=0


Це зроблено включно.
Джонатан Аллан

7

Рубі , 56 54 байти

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

Спробуйте в Інтернеті!

Спосіб:

  1. Для кожного числа створює масив цифр (який виходить зворотним)
  2. Порівняє суму перших 3 цифр у масиві (останніх 3 у кількості), помножену на 2, на суму всього масиву
  3. Підраховує числа, за якими дві суми рівні

6

Japt , 38 15 байт

õV Ëì ò3n)mx r¥

-23 завдяки Шаггі!

Моє перше подання Japt; дякую Шаггі за всю допомогу!

Спробуйте в Інтернеті!


Ласкаво просимо в Japt! :)
Shaggy

@Shaggy дякую! Це досить акуратна мова!
Амфібологічний

Щоб допомогти вам розпочати роботу . Якщо у вас виникли запитання, не соромтеся надіслати мене в чаті .
Shaggy

@Shaggy Це дивовижно. Я, безумовно, багато чого навчився з цього. Плануєте розмістити це як власну відповідь? Ти повинен!
Амфібологічний

Ні, ви можете це мати :) Як я вже сказав, щоб допомогти вам почати.
Кудлатий

6

Python 3, 117 113 106 135 байт

Це моя перша відповідь колись, тому я впевнений, що є місце для вдосконалення.

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 байти завдяки WW
  • -7 байт завдяки Асоне Тухід
  • +29 байт для створення функції

Отримує перші три цифри через ціле ділення, а останні три - за модулем. Перше і останнє ціле число в діапазоні вводяться як аргументи xфункції, як aі b, відповідно. Вихід є n, друкується.

Безголовки:

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)

1
Вам не потрібні відступи після if btw. Також, ймовірно, буде дешевше перетворити на рядок, перш ніж взяти перші чи останні три цифри.
Опублікувати Rock Garf Hunter

2
Ласкаво просимо до PPCG! Ознайомтеся з порадами щодо гольфу в Python, щоб отримати поради та рекомендації. На більшості мов є подібна нитка, якщо вас цікавить. Крім того, добре включити TIO-посилання як демонстрацію.
Асона Тухід

Я б запропонував замінити n=n+1з n+=1і переміщаючи його відразу після , якщо заяву ( if...:n+=1)
Asone Tuhid

Ви не можете приймати aі bяк попередньо оголошені змінні. Ви або повинні мати функцію або приймати їх через вхід
Jo King

1
Якщо ви зберігаєте її як функцію, ви можете перемістити її n=0частину в заголовок, наприкладdef x(a,b,n=0)
Jo King

6

R , 93 86 байт

Коротша логіка в кінці компліментів @ Giuseppe /

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

Спробуйте в Інтернеті!

Цілі входи. Pad їх 0. Перетворити на шість ASCII-кодів. Зловживайте Fвбудованим.


Я отримую НС, що повернувся з цієї функції.
Роберт С.

Я відкрутив правки. Нова версія не працює при 0 через scipenпроблему. Що ж, добре.
ngm



6

Лушпиння , 12 байт

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

Спробуйте в Інтернеті!

Пояснення

#(§¤=Σ↓↑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

Здається, ваше рішення має той самий недолік, що і в моїй початковій версії: [000000, 001001]має призвести до 2( 000000і 001001), але 1001замість цього. (Я додав 1,000,000і видалив трейлінг 1як виправлення для цього, не впевнений, наскільки легкий / байт-ефективний, що є в
Хеск

1
@KevinCruijssen: Я думаю, що я пам'ятаю, що цей виклик спочатку був незрозумілим, я не встигаю розглянути його, тому я просто повернувся до свого первинного подання, яке, здається, є правильним.
ბიმო

5

Вугілля деревне , 15 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Редагувати: Спочатку я вважав, що це список потрібних номерів. Це можна зробити в 14 байт (видаливши , який займає довжину списку), або в 20 байтах, якщо ви хочете гарне форматування:

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

    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


3

Пітон 3 , 89 86 байт

-2 дякую містеру Xcoder.

-3 надихаючі відповіді Асони Тухід.

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

Результати тестів:

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 

Спробуйте в Інтернеті!


1
У підрахунковій версії sumможна зробити будь-який генератор, щоб дужки [...] не потрібні
Містер Xcoder

range(a,b+1)spec тепер заявляє "включно" (якби не ви , до речі, це можна використовувати *rзамість a,b- див. мою відповідь Python 2). Також зауважте, що специфікація зараз підтверджує, що це дійсно має бути кількість, яка виводиться.
Джонатан Аллан

3

MATL , 24 байти

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

Спробуйте в Інтернеті!

(-2 байти завдяки Луїсу Мендо.)

&: - Зробіть інклюзивний діапазон між двома заданими числами

1e3&\ - 'divrem' - розділіть на 1000 і отримайте нагадування та залишки на два масиви.

, - робіть двічі

!'03d'&V - транспоніруйте та перетворять кожне значення в обкладений нулем тристроковий рядок

&s - підсумовуйте значення кожного рядка

w - перемкнути, щоб вивести масив нагадування і зробити це знову на цьому

] - кінцева петля

= - перевірка рівності (повертає 1s у місцях, де масиви рівні)

s - підсумовуйте ті, щоб отримати підрахунок (неявний вихід)


3

Котлін , 152 119 байт

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

Спробуйте в Інтернеті!

Беручи два цілих числа, ніж перетворюємо їх у шість символьних рядків і рахуємо.

Оптимізовано це завдяки маззі та його вирішенню у 119 байт.

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

Спробуйте в Інтернеті!


1
Ви можете її компактнішати до 133 байт{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

постійний струм , 44 байти

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

Бере два аргументи з інакше порожнього стека, виводить на вершину стека.

Спробуйте в Інтернеті!

Розумний біт тут полягає у використанні неназваного (тобто незахованого) макроса, який дублюється перед виконанням, щоб запустити копію себе на іншій трицифровій частині.

Пояснення

Внутрішній макрос [rA~rA~++rx] має ефект "обчислити цифру суми трицифрового числа, яке знаходиться на другому рівні в стеку, а потім виконати початкову верхівку стека як макрос".

Основна програма:

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

3

Паскаль (FPC) , 163 153 байт

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.

Спробуйте в Інтернеті!

Пояснення

Ось спочатку звичайний вигляд коду:

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.

Спробуйте в Інтернеті!

Тоді я зловживав поведінкою циклу for:

  • значення циклу встановлюються заздалегідь (від - aдо b), тому aможуть бути повторно використані як змінні циклу, скидаючиi ;
  • в кінці циклу for, змінну циклу залишають на кінцевому значенні (значення bдо циклу). Я використовував bяк контейнер, збільшуючи його, коли знайдено вдале число і в кінці циклу bвідходить від його старого значення за кількістю вдалих чисел, тому b-aдає правильний результат. Це впало s.

Заміна dоперацій безпосередньо на aскорочує цикл. Заміна cоперацій безпосередньо на aдозі не скорочує цикл, а, після випадання d, петлі beginтаend непотрібні, і я закінчив із використанням лише 2 змінних :)

$запускає шістнадцяткові константи в коді для гольфу. Хоча вони не зберігають байти, вони усувають пробіли, необхідні перед десятковими константами.


3

Java (OpenJDK 8) , 162 байти

... запозичення з прикладу Котліна вище.

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

Спробуйте в Інтернеті!

Порівнювати суму байтів String так само добре, як підсумовувати фактичні цифри.


2
Ви можете зберегти байт за допомогою currying ( a->b->), але вам потрібно буде повністю кваліфікуватись, IntStreamоскільки його немає java.lang.
Якоб

Ласкаво просимо до PPCG! Як згадував @Jakob, імпорт є частиною підрахунку байтів, тому вам доведеться додати java.util.stream.перед IntStreamсвоїм кодом і кількість байтів. Як також згадував Якоб , ви можете зберегти байт за допомогою a->b->, а також можете зберегти деякі додаткові байти, змінивши String.formatна "".format. Спробуйте в Інтернеті: 139 байт . Хороша перша відповідь, хоча. +1 від мене. Насолодитися перебуванням!
Kevin Cruijssen

2

PHP , 131 байт

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

Щоб запустити його:

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

Приклад:

php -n lucky_tickets.php 100 100000

Або спробуйте в Інтернеті!



2

Желе ,  9  8 байт

-1 завдяки Деннісу ( rµ...E)S-> r...E€Sоскільки все векторизується.)

rdȷD§E€S

Дьядічне Посилання, що приймає дві кінцеві точки діапазону (в будь-якому напрямку), що дає кількість пощастилих квитків.

Спробуйте в Інтернеті! Або див тестовий набір

Як?

Зауважте, що для будь-якого невід’ємного цілого числа менше, ніж 1000000, N, ми можемо отримати два числа з цифрами, які відповідають сумі необхідних значень, щоб перевірити за допомогою цілого поділу на 1000
(поступаючись, скажімо, Х=N1000)
та його залишок
(скажімоY=Nмод1000)
... тобтоN=1000×Х+Y

Тепер ми хочемо порівняти суми цифр Х і Y для кожного N в діапазоні і порахуйте ті, що рівні.

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)

E€Sрятує µ.
Денніс

@ Денніс, так, я працював над іншим рішенням, яке не векторизувало все по дорозі!
Джонатан Аллан

2

Powershell, 85 байт

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

Тестовий сценарій:

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

Вихід:

      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

Powershell? Я справді не бачив того, хто приходить: D
Дмитрій Архипенко,

2

Котлін, 95 байт

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

.kt для тесту:

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
}

Пояснення

Підраховуйте числа з діапазону, де сума всіх цифр чисел дорівнює подвійній сумі перших трьох цифр.



1

Python 2 ,  83  80 байт

-3, використовуючи спостереження Асони Тухід - ідіть, дайте кредит!

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

Спробуйте в Інтернеті!

Настільки ж, як і моя відповідь «Желе» (але вводи повинні бути відсортовані тут, тобто a<=b)


75 байт для введення a, b+1(тобто діапазон виключає правильну межу):

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

Спробуйте це


1

Clojure, 102 байти

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

Змішування струн і математики не надто весело.



1

C (gcc), 90 88 байт

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

Порт моєї відповіді на Java . Спробуйте його онлайн тут . Завдяки стельовій кішці для гри в гольф на два байти.

Безголовки:

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
}

Запропонувати L'✐'замість 10000і призначити 10змінну.
стельовий кот

@ceilingcat Мені подобається, що це дає мені додаткову назву змінної, але я не зміг зберегти жоден байт, призначивши 10: bit.ly/2O5ND2Y Щодо L'…'трюку, це акуратно; але чи це економить байти? Мені здається, що це багатобайтовий символ, тож зберігаючи символи, він не може зберегти байти ... чи може?
OOBalance

@ceilingcat Моя помилка, два байти можна зберегти, призначивши 10 змінній. Дякую.
OOBalance

1

Java 8, 101 99 байт

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

Інший підхід, ніж інші відповіді Java . Замість використання потоків і рядків, це використовує цикл і безпосередньо оцінює числа. Спробуйте його онлайн тут .

Завдяки плафоні для гри в гольф на два байти.

Безголовки:

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
}

1

VBA (Excel), 159 байт

Використання негайного вікна та комірок [A1] [A2]як вхідних даних.

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

1

F #, 110 байт

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

Спробуйте в Інтернеті!

tперетворює рядок у числа та підсумовує їх. rприймає діапазон чисел від sдо eі відфільтровує числа, на які не пощастило. Перші три цифри збираються n/1000. Другі три цифри обчислюються n-(n/1000)*1000.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.