没有匹配的连续对的ID生成器


16

给定2个输入(m = 最小起始id,n = id的数量),生成从> = m开始的id的顺序列表,该列表由数字0-9组成,其中没有2个连续的数字相同,例如1232是好吧,1233不是(彼此相邻包含2'3')。

对于m = 985,n = 6,下面显示了将生成/跳过的ID

...
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
...

输出量

按照上述顺序,每个ID应换行打印:

985
986
987
989
1010
1012

规则

标准代码高尔夫球规则,最低字节数获胜


14
欢迎来到PPCG!每个ID都应打印在新行上,我强烈建议不要将输出明确限制为特定格式。
暴民埃里克(Erik the Outgolfer)'18年

3
是否可以返回ID列表(即一维整数数组),而不是将其打印到stdout?
JungHwan Min

4
@ user202729在这种情况下,答案将不会无效。
Erik the Outgolfer

2
@ user202729不会使答案无效...如果有的话,答案将得到固定或仅遵循旧规则。
–totalhuman

3
对于用高尔夫球场语言编写的规则,更改规则以允许更多输出格式不会影响它们。对于其余的内容,您只需发表评论,说输出格式不再受限制。
布拉德·吉尔伯特b2gills '18

Answers:


3

果冻,6个字节

DIẠµ#Y

在线尝试!

怎么运行的?

DIẠµ#Y –完整程序。参数:X和Y这两个整数。

   µ#–返回满足以下条件的前X个大于或等于X的Y整数:
 I –增量...
D – ...以10为基数的数字...
  Ạ– ...均为非0。 
     Y –用换行符将结果合并。

8

Brachylog11个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=¼}>

在线尝试!

扩展

µ           # 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

非常好。出于好奇,挑战不是“字节”而是“效率”的问题的合适论坛在哪里?
beirtipol

1
@beirtipol最有效的意思是最快的执行时间?在那种情况下,PPCG上也可能带有标签code-challenge和fast -code。虽然现在发布的确切同样的挑战和不断变化的代码高尔夫发展最快的代码仍然可能会被关闭的欺骗..
凯文Cruijssen

3

PowerShell,59个字节

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

在线尝试!

基本上类似于其他答案。只要我们有剩余的数字要打印(for(;$n)),就进行循环,测试是否有正则表达式与两位数匹配,如果没有,则将其放在管道上并减小$n。然后我们增加$m并再次循环。这些元素是从管道中提取的,而隐式Write-Output则免费为我们提供换行符分隔的输出。


3

R111 92 71字节

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

在线尝试!

用于grepl搜索重复的数字。


您不会通过换行符加入结果,并且如果允许的话,OP也没有响应(尽管我希望这会很好)
Xcoder先生18年

@ Mr.Xcoder啊,对了,我注意到了,然后复制并粘贴了错误的版本:(
Giuseppe



2

Perl 6、56字节

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

尝试一下

展开:

{  # 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`
.+
*

在线尝试!nm为在不同的行的输入。说明:

.0A`

关闭自动输出并n从工作缓冲区中删除。

"$+"{

重复n次数。

\

m在以下循环组的末尾打印的值。

/(.)\1/{`

有连续数字时循环播放。

.+
*

转换为一元。

)C`

计算空字符串的数量,该数量比字符数多一,因此加1并转换回十进制。这样就结束了内部循环。

.+
*

打印后m,以相同的方式再次加1。(最后一行不需要a,C`因为这是最后一行的默认阶段类型。)外循环隐式结束。

请注意,转换为一进制然后再转换为十进制有点慢。39字节,该版本不进行任何转换:

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

在线尝试!说明:$.(计算其余替换的长度,方便地进行而不实际扩展它;由于的长度*_是隐式匹配的值,而的长度_当然是1,因此只会增加该值。


2

Perl 5.10.0 + -n40 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
您可以消除“ m”以保存一个字节。
Xcali

@Xcali谢谢,不知道我在想什么...
wastl

2

Perl 5-ln 33个字节

在STDIN上输入2行,首先输入ID,然后计数

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

在线尝试!


我不知道这种方法能$n.=<>像这样工作,尤其是在-=...
Dom Hastings

@DomHastings不幸的是,我必须将其回滚,因为$n0它们一起做是错误的
Ton Hospel



1

Stax9 8 字节CP437

ç@F6╕↔┤ú

在线尝试!

碰巧在Jelly答案中与@ Mr.Xcoder的算法一致。

@recursive每个注释-1个字节。

说明

使用解压缩格式进行解释。

{$:-|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个字节。隐式评估适用于多个值,只要它们在标准输入的第一行即可。
递归

@recursive谢谢,尽管有文档记录,但我没有注意到。

1

哈斯克尔94 93 91字节

-1个字节,感谢Laikoni
-2个字节,感谢Zgarb

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高尔夫。


1
欢迎参加Haskell打高尔夫球!group(show a)可以group$show a
Laikoni '18

2
(<2).length可以是null.tail
Zgarb'18


0

JavaScript(ES6),50个字节

以currying语法接受输入(m)(n)

m=>g=n=>n?/(.)\1/.test(m++)?g(n):~-m+`
`+g(n-1):''

在线尝试!




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功能,因此无法很有效地用于此应用程序。

因此,这是增加ID计数器,在每个字符处分割计数器,循环遍历字符以查看是否有任何字符与前一个字符相同的非常简单的方法。如果找不到重复的字符,请打印ID计数器并增加打印的ID数。

我将尽量避免按照“ 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.