Діапазон дат цифр


16

ПРИМІТКА. Оскільки я сам голландський, усі дати є в голландському dd-MM-yyyyформаті в описі випробувань та тестових випадках.

Виклик:

Введення:
дата початку ; Кінцева дата ; Цифроваsen

Виходи:
Усі дати в межах [s,e] (включаючи обидві сторони), які містять n кількість унікальних цифр у їх даті.

Приклад:

Вихідні дані: Дата початку: 12-11-1991; Кінцева дата 02-02-1992:; Цифра:4

Вихідні дані:
З найпопулярнішими 0-х днів за місяцями:

[20-11-1991, 23-11-1991, 24-11-1991, 25-11-1991, 26-11-1991, 27-11-1991, 28-11-1991, 30-11-1991, 01-12-1991, 02-12-1991, 09-12-1991, 10-12-1991, 13-12-1991, 14-12-1991, 15-12-1991, 16-12-1991, 17-12-1991, 18-12-1991, 20-12-1991, 23-12-1991, 24-12-1991, 25-12-1991, 26-12-1991, 27-12-1991, 28-12-1991, 31-12-1991, 01-01-1992, 02-01-1992, 09-01-1992, 10-01-1992, 11-01-1992, 12-01-1992, 19-01-1992, 20-01-1992, 21-01-1992, 22-01-1992, 29-01-1992, 01-02-1992, 02-02-1992]

Без провідних 0 за дні / місяці:

[20-11-1991, 23-11-1991, 24-11-1991, 25-11-1991, 26-11-1991, 27-11-1991, 28-11-1991, 30-11-1991, 3-12-1991, 4-12-1991, 5-12-1991, 6-12-1991, 7-12-1991, 8-12-1991, 10-12-1991, 13-12-1991, 14-12-1991, 15-12-1991, 16-12-1991, 17-12-1991, 18-12-1991, 20-12-1991, 23-12-1991, 24-12-1991, 25-12-1991, 26-12-1991, 27-12-1991, 28-12-1991, 31-12-1991, 3-1-1992, 4-1-1992, 5-1-1992, 6-1-1992, 7-1-1992, 8-1-1992, 10-1-1992, 13-1-1992, 14-1-1992, 15-1-1992, 16-1-1992, 17-1-1992, 18-1-1992, 20-1-1992, 23-1-1992, 24-1-1992, 25-1-1992, 26-1-1992, 27-1-1992, 28-1-1992, 31-1-1992]

Правила виклику:

  • Дати введення та виведення можуть бути у будь-якому розумному (дата-) форматі. Це може бути рядок у будь-якому dMyформаті (включаючи необов'язкові роздільники), список трьох цілих чисел, рідний об'єкт дати вашої мови тощо. Виведенням може бути список / масив / потік, надрукований на STDOUT, окремий обмежений рядок тощо.
  • Ви можете включати або виключати провідні 0 на дні / місяці у своїх результатах. Будь ласка, вкажіть, яке з двох ви використовуєте у своїй відповіді , оскільки це призведе до різних результатів. Тобто 1-1-1991є 2 унікальних цифри, але 01-01-1991як 3 унікальних цифри.
  • Вам не доведеться мати справу з високосними роками та відмінностями календарів Григоріана проти Юліана. Можна припустити, що діапазони дат, наведені в тестових випадках, ніколи не перевищуватимуть 28 лютого / 1 березня протягом років, розділених на 4.
  • Гарантована вхідна цифра знаходиться в діапазоні , тому робота з не визначена (повернення порожнього списку було б найрозумнішим, але і помилка чи неправильний результат також чудово; ви виграли мені не доведеться мати справу з цим вкладом).n[1,8]n=0

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам з кодовим гольфом відштовхувати вас від публікації відповідей з мов, що не кодують гольф. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Для вашої відповіді застосовуються стандартні правила з правилами вводу / виводу за замовчуванням , тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу повернення. Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду (тобто TIO ).
  • Також настійно рекомендується додавати пояснення до своєї відповіді.

Тестові приклади:

Inputs: [12-11-1991, 02-02-1992], 4
Outputs with leading 0s:    [20-11-1991, 23-11-1991, 24-11-1991, 25-11-1991, 26-11-1991, 27-11-1991, 28-11-1991, 30-11-1991, 01-12-1991, 02-12-1991, 09-12-1991, 10-12-1991, 13-12-1991, 14-12-1991, 15-12-1991, 16-12-1991, 17-12-1991, 18-12-1991, 20-12-1991, 23-12-1991, 24-12-1991, 25-12-1991, 26-12-1991, 27-12-1991, 28-12-1991, 31-12-1991, 01-01-1992, 02-01-1992, 09-01-1992, 10-01-1992, 11-01-1992, 12-01-1992, 19-01-1992, 20-01-1992, 21-01-1992, 22-01-1992, 29-01-1992, 01-02-1992, 02-02-1992]
Outputs without leading 0s: [20-11-1991, 23-11-1991, 24-11-1991, 25-11-1991, 26-11-1991, 27-11-1991, 28-11-1991, 30-11-1991, 3-12-1991, 4-12-1991, 5-12-1991, 6-12-1991, 7-12-1991, 8-12-1991, 10-12-1991, 13-12-1991, 14-12-1991, 15-12-1991, 16-12-1991, 17-12-1991, 18-12-1991, 20-12-1991, 23-12-1991, 24-12-1991, 25-12-1991, 26-12-1991, 27-12-1991, 28-12-1991, 31-12-1991, 3-1-1992, 4-1-1992, 5-1-1992, 6-1-1992, 7-1-1992, 8-1-1992, 10-1-1992, 13-1-1992, 14-1-1992, 15-1-1992, 16-1-1992, 17-1-1992, 18-1-1992, 20-1-1992, 23-1-1992, 24-1-1992, 25-1-1992, 26-1-1992, 27-1-1992, 28-1-1992, 31-1-1992]

Inputs: [19-09-2019, 30-09-2019], 5
Outputs (same with and without leading 0s): [23-09-2019, 24-09-2019, 25-09-2019, 26-09-2019, 27-09-2019, 28-09-2019, 30-09-2019]

Inputs: [19-09-2019, 30-09-2019], 8
Output (same with and without leading 0s): []

Inputs: [20-06-1749, 30-06-1749], 8
Outputs with leading 0s:    [23-06-1749, 25-06-1749, 28-06-1749]
Outputs without leading 0s: []

Inputs: [10-12-1969, 12-01-1970], 6
Outputs (same with and without leading 0s): [30-12-1969]

Inputs: [10-12-1969, 12-01-1970], 5
Outputs with leading 0s:    [10-12-1969, 13-12-1969, 14-12-1969, 15-12-1969, 17-12-1969, 18-12-1969, 20-12-1969, 23-12-1969, 24-12-1969, 25-12-1969, 27-12-1969, 28-12-1969, 31-12-1969, 02-01-1970, 03-01-1970, 04-01-1970, 05-01-1970, 06-01-1970, 08-01-1970, 12-01-1970]
Outputs without leading 0s: [10-12-1969, 13-12-1969, 14-12-1969, 15-12-1969, 17-12-1969, 18-12-1969, 20-12-1969, 23-12-1969, 24-12-1969, 25-12-1969, 27-12-1969, 28-12-1969, 31-12-1969, 2-1-1970, 3-1-1970, 4-1-1970, 5-1-1970, 6-1-1970, 8-1-1970, 12-1-1970]

Inputs: [11-11-1111, 11-11-1111], 1
Output (same with and without leading 0s): [11-11-1111]

Я знаю, що це конкретно не потрібний тут формат, але я просто коментую тут, щоб "поширити слово": існує міжнародний стандарт, який програмісти повинні намагатися використовувати для дат (у журналах, назви файлів тощо): en.wikipedia.org / wiki / ISO_8601 . (використовує 'T' для дезамбування (без T дата і час може бути зовсім іншим) і вказує роздільники, які слід використовувати, і коли не можна використовувати роздільники [тобто пропонує інший варіант (від короткого до довгого] того самого стандартна]: головна істота:, YYYY-MM-DDThh:mm:ss.mmm +hh:mm+ hh: mm - зміщення часу у вашому регіоні від UTC.)
Олів'є

Відповіді:


2

Japt , 23 байти

Приймає введення дат як часові позначки Unix, виводить масив рядків з форматуванням і провідними 0s залежно від вашої мови. Буде на 1 байт коротшим у Japt v2, але, здається, є помилка при перетворенні Dateоб'єктів у рядки.

òV864e5@ÐX s7Ãf_¬â ʶWÄ

Спробуй це

òV864e5@ÐX s7Ãf_¬â ʶWÄ     :Implicit input of integers U=s,V=e & W=n
òV                          :Range [U,V]
  864e5                     :  With step 86,400,000 (24*60*60*1000)
       @                    :Map each X
        ÐX                  :  Convert to Date object
           s7               :  Convert to locale date string
             Ã              :End map
              f             :Filter
               _            :By passing each through the following function
                ¬           :  Split
                 â          :  Deduplicate
                   Ê        :  Length
                    ¶       :  Is equal to
                     WÄ     :  W+1, to account for the inclusion of the delimiting "/" or "-"


3

Червоний , 93 байти

func[a b n][until[if n = length? exclude d: rejoin[a/4"-"a/3"-"a/2]"-"[print d]b < a: a + 1]]

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

Без ведучих 0 на дні / місяці.

Шкода , що Червоний перетворює всередині 09-10-2019до 9-Oct-2019- ось чому мені потрібно витягти день / місяць / рік в індивідуальному порядку .


Я не знайомий з Red, але, здається, є багато пробілів, які можна вирізати з цього. Пробачте мене, якщо я помиляюся.
connectyourcharger

@connectyourcharger Немає проблем! Здається, є кілька непотрібних пробілів, але вони потрібні для розділення жетонів. Слова (ідентифікатори) червоного кольору можуть містити -=+*<>?!~&, тому потрібен пробіл (або (...)[...]"...").
Гален Іванов

2

Python 3.8 (передвипуск) , 84 байти

-6 байт завдяки Gloweye

lambda s,e,n:[d for i in range((e-s).days+1)if-len(set(d:=str(s+type(e-s)(i))))==~n]

Неназвана функція, яка повертає список рядків (підрахунок / включаючи провідні нулі), який приймає три аргументи:

  • s, початок - datetime.dateоб’єкт;
  • e, кінець - datetime.dateпредмет; і
  • n, кількість днів - intоб’єкт.

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

Примітка: Оскільки функція приймає datetime.dateоб'єкти, я не рахував для цього імпортного коду (і працював навколо імпорту datetime.timedeltaоб'єкта, оскільки він опосередковано доступний шляхом віднімання цих вхідних об'єктів).


1
type(obj)на 3 байти коротше obj.__class__.
Gloweye

@Gloweye чудовий спасибі!
Джонатан Аллан

@Gloweye економить 6 у підсумку (крапка йде, і дужки вже є)
Джонатан Аллан

1
Я ще не проаналізував цю глибину, просто побачив __class__та зробив швидкий коментар. Завжди радий допомогти.
Gloweye

1

JavaScript (ES6), 91 байт

Вводиться як такий (n)(end)(start), де очікуються дати як часові позначки Unix у мілісекундах. Повертає у форматі розділений пробілом список дат yyyy-mm-dd.

Ведучі 0 включаються.

n=>b=>g=a=>a>b?'':(new Set(d=new Date(a).toJSON().split`T`[0]).size+~n?'':d+' ')+g(a+864e5)

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


1
Цей фрагмент, ймовірно, не вдасться, якщо сталося зміщення DST (у такому випадку а + 864e5 може бути не завтра). Але, на щастя, tio використовує часовий пояс UTC, який не має DST. - від кого - то , хто використовує ту ж логіку , на веб - сайті продукту і реалізувати що - то неправильно , поки DST не зрушити ...
TSH

1

PHP , 90 байт

for([,$s,$e,$n]=$argv;$s<=$e;)$n-count(count_chars($d=date(Ymd,86400*$s++),1))||print$d._;

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

Це з ведучими 0. Вхідні дані - це аргументи команди ( $argv), а дати - часові позначки Unix у днях (в основному стандартні секунди / 86400), я використовував цей формат, оскільки нам не потрібен час у цьому виклику, і це дозволило мені переграти ще 1 байт. Тримає додавання в день , щоб почати , поки він не досягне кінця і друкує будь-які дати з $nунікальними цифрами в ньому, розділених _в Ymdформаті.

Також є альтернатива 89 байт, яка друкує дати для виведення у такому ж форматі, що і введення (часові позначки Unix у днях).


1

Java (JDK) , 86 байт

(s,e,n)->s.datesUntil(e.plusDays(1)).filter(d->(""+d).chars().distinct().count()==n+1)

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

Я вирішив використовувати провідні 0s.

Кредити


1
Можливо, я не повинен був робити це включно з обох кінців, тоді ви могли використовувати Java 9 datesUntilдля 103 байтів . ;) Гарна відповідь. Я не бачу нічого, що могло б особисто пограти в гольф.
Kevin Cruijssen

1
@KevinCruijssen Ну, власне, ти дав надзвичайно приємний спосіб гольфу! Просто додайте .plusDays(1)та видаліть, .forEach(System.out::println)і це дуже відповідь на гольф, тому що, як ви писали, дати можна повернути, оскільки дозволені об’єкти та потоки. ;-) У мене не було поняття, що datesUntilнавіть існувало! Дякую за це :-)
Олів'є

Вуп, забув про власні правила, що дозволяють повернути потоки, ха-ха XD Я ідіот. Але радий, що я міг допомогти тобі зі своїм ідіотизмом. ; p
Кевін Круїссен


1

C # (інтерактивний компілятор Visual C #)

Без провідних 0, 104 , 103 байт

(s,e,n)=>new int[(e-s).Days+1].Select((x,i)=>s.AddDays(i)).Where(x=>$"{x:yyyMd}".Distinct().Count()>=n)

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

З провідними 0, 106 105 байт

(s,e,n)=>new int[(e-s).Days+1].Select((x,i)=>s.AddDays(i)).Where(x=>$"{x:yyyMMdd}".Distinct().Count()>=n)

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


Ви можете видалити пробіл x =>$"у обох версіях для -1. :)
Кевін Кройсейсен

@KevinCruijssen ах ебать дякую x) Я впевнений, що хтось теж може придумати коротше рішення, я цим не задоволений
Innat3

0

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

fun f(a:LocalDate,b:LocalDate,c:Long)=a.datesUntil(b.plusDays(1)).filter{it.toString().chars().distinct().count()==c+1}

Без провідних 0s, займає в два java.time.LocalDateі Long, повертає Streamз LocalDateї


Привіт, Ласкаво просимо до CCGC! Чи можете ви, можливо, додати спробувати онлайн- посилання з тестовим кодом, щоб перевірити, чи працює він? Крім того , я не знаю Котлін, але можна замінити it.toString()з , (it+"")щоб заощадити кілька байт? Я знаю, що це можливо в деяких інших мовах, таких як Java або .NET C #.
Kevin Cruijssen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.