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


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]

Правила вызова:

  • Даты ввода и вывода могут быть в любом разумном (date-) формате. Может быть в виде строки в любом dMyформате (включая необязательные разделители), список из трех целых чисел, родной объект Date для вашего языка и т. Д. Выходными данными может быть список / массив / поток, напечатанный в 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+, чч: мм - это смещение времени вашей локали от UTC.)
Оливье Дюлак

Ответы:


2

Japt , 23 байта

Принимает ввод данных в виде временных меток Unix, выводит массив строк с форматированием и ведущими 0символами в зависимости от вашей локали. В Japt v2 будет короче на 1 байт, но при преобразовании 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 не сместился ...
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)

Попробуйте онлайн!

Я решил использовать ведущие 0с.

кредиты


1
Возможно, я не должен был делать это включительно с обеих сторон, тогда вы могли бы использовать Java 9 datesUntilдля 103 байтов . ;) Хороший ответ. Я не вижу ничего, что можно было бы сыграть в гольф лично.
Кевин Круйссен

1
@KevinCruijssen Ну, на самом деле, вы дали очень хороший способ игры в гольф! Просто добавьте .plusDays(1)и удалите, .forEach(System.out::println)и это очень удачный ответ, потому что, как вы писали, даты могут быть возвращены как объекты-значения, так и потоки разрешены. ;-) Я понятия не имел, что datesUntilдаже существует! Спасибо за это :-)
Оливье Грегуар

Woops, забыл о моих собственных правилах, разрешающих возврат потоков, хаха XD Я идиот. Но рад, что смог помочь тебе с моим идиотизмом. ; p
Кевин Круйссен

1

Рубин -rdate , 54 байта

Принимает 2 объекта Date и число в качестве входных данных и возвращает список объектов Date в качестве выходных данных. Обрабатывает високосные годы и использует ведущие нули.

->a,b,n{(a..b).select{|d|d.to_s.chars.uniq.size==n+1}}

Попробуйте онлайн!


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}

Без ведущих 0, принимает два java.time.LocalDateи a Long, возвращает a Streamиз LocalDates


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