Генератор идентификаторов без соответствующих смежных пар


16

Учитывая 2 входа (m = минимальный начальный идентификатор , n = количество идентификаторов ), сгенерируйте последовательный список идентификаторов, начиная с> = m, состоящий из цифр 0-9, где нет двух одинаковых последовательных чисел, например, 1232 хорошо, 1233 нет (содержит 2 '3 рядом друг с другом).

пример

для m = 985, n = 6, ниже показано, какие идентификаторы будут сгенерированы / пропущены

...
985 - ok, 1st
986 - ok, 2nd
987 - ok, 3rd
# skip 0988 (contains '88')
989 - ok, 4th
# Skip 099x (contains '99')
# Skip 100x (contains '00')
1010 - ok, 5th
# Skip 1011 (contains '11')
1012 - ok, 6th
...

Выход

Каждый идентификатор должен быть напечатан в новой строке, как в приведенной выше последовательности:

985
986
987
989
1010
1012

правила

Стандартные правила игры в гольф, побеждает наименьшее количество байт


14
Добро пожаловать в PPCG! Каждый идентификатор должен быть напечатан в новой строке. Я настоятельно не рекомендую явно ограничивать вывод определенным форматом.
Эрик Outgolfer

3
Можно ли возвращать список идентификаторов (т. Е. Одномерный массив целых чисел) вместо вывода на стандартный вывод?
JungHwan Мин

4
@ user202729 В этом случае ответы не будут признаны недействительными.
Эрик Outgolfer

2
@ user202729 Это не делает ответы недействительными ... Во всяком случае, ответы либо будут исправлены, либо они просто следуют старым правилам.
полностью человек

3
Для тех, которые написаны на языках игры в гольф, изменение правила, разрешающее большее количество форматов вывода, не повлияет на них В остальном вы можете просто оставить комментарий о том, что формат вывода больше не ограничен.
Брэд Гилберт b2gills

Ответы:


3

Желе , 6 байт

DIẠµ#Y

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

Как это устроено?

DIẠµ # Y - Полная программа. Аргумент: два целых числа, X и Y.

   µ # - вернуть первые Y целых чисел, больших или равных X, которые удовлетворяют:
 Я - Приращения ...
D - ... из их базовых 10 цифр ...
  Ạ - ... все не 0. 
     Y - присоединиться к результату по новым строкам.

8

Брахилог , 11 10 байт

{≤ṫẹ~ḅẉ}ᶠ⁾

Ввод представляет собой список из двух чисел. Попробуйте онлайн!

объяснение

Встроенный берет список или строку, как "1000220", и разбивает его на блоки равных смежных элементов, как["1","000","22","0"] . В этой программе я применяю ~к нему оператор, поэтому он работает в обратном порядке: он берет список строк, проверяет, что каждая строка состоит из повторений одного символа и соседние строки имеют разные символы, и объединяет список. Предикат перечисляет числа, начиная с первого ввода, в возрастающем порядке, и я проверяю условие на них, печатая те, которые его удовлетворяют, и останавливаюсь, когда я нахожу достаточно.

{≤ṫẹ~ḅẉ}ᶠ⁾  Input is a pair, say [M=988,N=3].
{      }ᶠ⁾  Apply this predicate to M and compute the first N results.
 ≤          Take a number that is greater than or equal to M (first up is 988).
  ṫ         Convert it to string: "988"
   ẹ        Split it into substrings of length 1: ["9","8","8"]
     ~ḅ     Apply ḅ in reverse: fails, try next number.
       ẉ    If ḅ succeeds, print the resulting string and a newline.
            This counts as a result of the predicate.

6

05AB1E , 9 байт

µÐÔQi=¼}>

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

Exlpanation

µ           # loop until counter equals n
 Ð          # triplicate current value (initially m)
  Ô         # connected uniqueified on the copy at the top of the stack
   Q        # compare to unmodified for equality
    i  }    # if true
     =      # print current value while leaving it on the stack
      ¼     # increment the counter
        >   # increment current value

4

Java 8, 83 байта

(m,n)->{for(;n>0;m++)if(!(m+"").matches(".*(.)\\1.*")){System.out.println(m);n--;}}

Объяснение:

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

(m,n)->{                      // Method with two integer parameters and no return-type
  for(;n>0;                   //  Loop as long as `n` is larger than 0
      m++)                    //    After every iteration: increase `m` by 1
    if(!(m+"").matches(".*(.)\\1.*")){
                              //   If there are no repeated adjacent digits:
      System.out.println(m);  //    Print `m`
      n--;}}                  //    And decrease `n` by 1

Очень хорошо. Из любопытства, где был бы подходящий форум для этого вопроса, где задача была бы не "байтами", а "эффективностью"?
Беиртипол

1
@beirtipol Под самым эффективным вы подразумеваете самое быстрое время выполнения? В этом случае, вероятно, также здесь, на PPCG, с тегами code-challenge и fasttest -code . Несмотря на то, что опубликовать точно такой же вызов сейчас и изменить код-гольф на самый быстрый код, вероятно, все равно будет закрыто как обман.
Кевин Круйссен

3

PowerShell , 59 байт

param($m,$n)for(;$n){if("$m"-notmatch"(.)\1"){$m;$n--}$m++}

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

В основном похожи на другие ответы. Выполняет циклы, пока у нас осталось число для print ( for(;$n)), проверяет, есть ли у нас совпадение регулярного выражения с двузначным числом, и если нет, оно помещает это в конвейер и уменьшает $n. Затем мы увеличиваем $mи повторяем цикл снова. Элементы извлекаются из конвейера, и неявное Write-Outputдает нам вывод с разделителями новой строки бесплатно.


3

R , 111 92 71 байт

function(m,n)while(F<n){if(!grepl("(.)\\1",m)){cat(m,'
');F=F+1}
m=m+1}

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

Используется greplдля поиска повторяющихся цифр.


Вы не присоединяетесь к результату с помощью новых строк, и ОП не ответил, если это еще разрешено (хотя я надеюсь, что все будет хорошо)
г-н Xcoder

@ Mr.Xcoder ах, верно, я заметил это, а затем скопировал и вставил неправильную версию :(
Джузеппе



2

Perl 6 , 56 байт

{.put for grep({none .comb Zeq.comb.skip},$^a..*)[^$^b]}

Попытайся

Expanded:

{  # bare block lambda with placeholder params $a $b

  .put for

  grep(

    {
      none          # create a none junction (True if all are False)

        .comb       # the input split into digits
        Zeq         # Zip using &infix:«eq» operator
        .comb.skip  # the input split into digits starting at second one
    },

    $^a .. *        # a Range starting at the first argument

  )[ ^ $^b ]        # take the first $b values
}

2

Сетчатка , 34 байта

.0A`
"$+"{\/(.)\1/{`.+
*
)C`
.+
*

Попробуйте онлайн! Берет nи в mкачестве ввода по отдельным строкам. Объяснение:

.0A`

Выключите автоматический вывод и удалите nиз рабочего буфера.

"$+"{

Повторите nраз.

\

Выведите значение mв конце следующей зацикленной группы.

/(.)\1/{`

Цикл пока есть смежные цифры.

.+
*

Преобразовать в одинарный.

)C`

Посчитайте количество пустых строк, которое на один больше, чем количество символов, добавив, таким образом, 1 и преобразовав обратно в десятичную. На этом заканчивается внутренний цикл.

.+
*

Распечатав m , добавьте 1 снова таким же образом. (Последняя строка не нужна, C`потому что это тип сцены по умолчанию для последней строки.) Внешний цикл неявно завершен.

Обратите внимание, что преобразование в унарное и обратно в десятичное немного медленное; для 39 байтов - версия, которая не выполняет никакого преобразования:

.0A`
"$+"{\/(.)\1/+`.+
$.(*__
.+
$.(*__

Попробуйте онлайн! Пояснение: $.(вычисляет длину остальной части замещения, удобно без фактического ее расширения; поскольку длина *_неявно совпадает со значением, а длина, _конечно, равна 1, это просто увеличивает значение.


2

Perl 5.10.0 + -n, 40 39 байт

for(;$i;$_++){!/(.)\1/&&$i--&&say}$i=$_

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

-1 байт благодаря Xcali

Ввод в две строки, сначала n, затем m. Убедитесь, что после m нет новой строки.

(echo '6'; echo -n '985') | perl -nE 'for(;$i;$_++){!/(.)\1/&&$i--&&say}$i=$_'

1
Вы можете исключить «м», чтобы сохранить байт.
Xcali

@Xcali Спасибо, не знаю, о чем я думал ...
wastl

2

Perl 5 ,-ln 33 байта

Введите 2 строки в STDIN, сначала начальный идентификатор, затем счет

#!/usr/bin/perl -ln
$n-=!/(.)\1/&&say,$_++while$n.=<>

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


Я не знал, что так $n.=<>работает, особенно с -=...
Дом Гастингс

@DomHastings К сожалению, мне придется откатить его назад, потому что $nможет быть 0так, что делать их вместе вместе - неправильно
Тон Хоспел


1

Haskell , 70 байт

-19 байт благодаря Ними.

s#n=unlines$map show$take n$filter(and.(zipWith(/=)=<<tail).show)[s..]

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

17 байтов, предназначенных для разделения на новые строки.



Вы не присоединяетесь к результату с помощью новых строк, и ОП не ответил, если это еще разрешено (хотя я надеюсь, что все будет хорошо)
г-н Xcoder

@ Mr.Xcoder Ага, исправляю ...
полностью человек

1
Вы можете использовать mapMи print. Попробуйте онлайн!
Ними

1

Stax , 9 8 байтов CP437

ç@F6╕↔┤ú

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

Случается совпадение с алгоритмом @ Mr.Xcoder в его ответе Jelly.

-1 байт за комментарий @recursive.

объяснение

Использует распакованный формат для объяснения.

{$:-|A}gn
{     }gn    Generator, generate given number of values, using block as a filter
                 And implicit output, one element on a line.
             In Stax, only 0 and [] is falsy.

 $           Convert the number to string
  :-         Difference between contiguous digit
    |A       All of them are truthy (may use `:*` as well)

staxlang.xyz/… дает 8 байтов. Неявный eval работает с несколькими значениями, если они находятся в первой строке стандартного ввода.
рекурсивный

@recursive Спасибо, это то, что я не заметил, хотя это задокументировано.
Вейцзюнь Чжоу,

1

Haskell , 94 93 91 байт

-1 байт благодаря Лайкони
-2 байт благодаря Згарбу

import Data.List
a!0=[]
a!b|all(null.tail)$group$show a=show a++'\n':(a+1)!(b-1)|c<-a+1=c!b

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

Первый Haskell Golf.


1
Добро пожаловать в гольф Haskell! group(show a)может быть group$show a.
Лайкони

2
(<2).lengthможет бытьnull.tail
Zgarb





0

AWK , 90 байт

{for(j=$1;k<$2;j++){for(a=b=d;++b<=(n=split(j,A,""))&&a!=c=A[b];a=c);if(n<b&&++k)print j}}

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

Это намного страшнее, чем я думал. Я обнаружил, что AWKв его gensubфункции есть только обратное замещение, что делает его не очень эффективным для использования в этом приложении.

Так что это очень простой подход - увеличить счетчик идентификаторов, разделить счетчик на каждом символе, циклически проходить по символам, чтобы увидеть, совпадает ли какой-либо символ с предыдущим. Если повторяющихся символов не найдено, напечатайте счетчик идентификаторов и увеличьте количество напечатанных идентификаторов.

Я постараюсь воздержаться от заявлений в духе "AWK должен иметь возможность делать более надежные регулярные выражения», но это будет сложно.




0

Пип , 22 байта

--aLb{W`(.)\1`N++a0Pa}

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

объяснение

--aLb{W`(.)\1`N++a0Pa}
                        a,b are command-line arguments
--a                     Decrement a
   Lb{               }  Loop b times:
       `(.)\1`           Regex matching a character followed by itself
      W       N++a       While that regex matches in incremented a:
                  0       No-op
                   Pa    When the while loop exits, a is a valid ID; print it
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.