一致する連続ペアのないIDジェネレーター


16

2つの入力(m = 最小開始ID、n = IDの数)が与えられると、> = mで始まる、0から9の数字で構成されるIDの連続リストを生成します。わかりました、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は新しい行印刷する必要があります。出力を特定の形式に明示的に制限することは強くお勧めしません。
エリックアウトゴルファー

3
stdoutに出力する代わりに、IDのリスト(整数の1次元配列)を返すことはできますか?
ジョンファンミン

4
@ user202729この場合、回答は無効になりません。
エリックアウトゴルファー

2
@ user202729これは回答を無効にしません...何かあれば、回答は修正されるか、古いルールに従っているだけです。
完全に人間の

3
ゴルフ言語で書かれたものでは、より多くの出力形式を許可するようにルールを変更しても、影響はありません。残りについては、出力形式がもう制限されていないというコメントを残すことができます。
ブラッドギルバートb2gills

回答:


3

ゼリー、6バイト

DIẠµ#Y

オンラインでお試しください!

使い方?

DIẠµ#Y –完全なプログラム。引数:2つの整数、XおよびY。

   µ#–次の条件を満たすX以上の最初のY整数を返します。
 I –増分...
D – ... 10進数の...
  Ạ– ...すべて非0です。 
     Y –結果を改行で結合します。

8

Brachylog11 10バイト

{≤ṫẹ~ḅẉ}ᶠ⁾

入力は2つの数字のリストです。 オンラインでお試しください!

説明

組み込みはのようなリストまたは文字列を取り、"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最も効率的に言うと、実行時間は最短ですか?その場合、おそらくcode-challengeタグと最速コードのタグが付いたPPCGでもここにあります。...今、まったく同じ課題を掲示し、最速のコードにコードゴルフを変更するが、おそらくまだだまされやすい人としてクローズされます
ケビンCruijssen

3

PowerShell、59バイト

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

オンラインでお試しください!

基本的に他の回答と同様です。印刷する数値が残っている限りループします(for(;$n))、2桁の正規表現に一致するかどうかをテストし、一致しない場合はパイプラインに配置して減少し$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

@ Mr.Xcoderああ、そうだと気付いたので、間違ったバージョンをコピーして貼り付けました:(
ジュゼッペ



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多いため、1を追加して10進数に変換し直します。これで内部ループが終了します。

.+
*

印刷したらm、同じようにもう一度1を追加します。(最後の行はC`、最後の行のデフォルトのステージタイプなので、必要ありません。)外側のループは暗黙的に終了します。

単項への変換と10進数への変換は少し遅いことに注意してください。39バイトの場合、変換を行わないバージョン:

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

オンラインでお試しください!説明:$.(実際に展開せずに、置換の残りの長さを計算します。の長さ*_は暗黙的に一致した値であり、長さ_はもちろん1であるため、これは値をインクリメントするだけです。


2

Perl 5.10.0 + -n40 39バイト

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

オンラインでお試しください!

Xcaliのおかげで-1バイト

最初にn、次にmの2行で入力します。mの後に改行がないことを確認してください。

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

1
「m」を削除してバイトを保存できます。
-Xcali

@Xcaliおかげで、...私が考えていたかわからない
wastl

2

Perl 5の-ln33のバイト

STDINに2行を入力し、最初にIDを開始してからカウントします

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

オンラインでお試しください!


私がいることを知らなかった$n.=<>、特にで、そのように働いた-=...
ドムヘイスティングス

@DomHastings残念ながら、両方を一緒に行うのは間違っている$n可能性がある0ため、ロールバックする必要があります
トンホスペル


1

Haskell、70バイト

nimiのおかげで-19バイト。

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

オンラインでお試しください!

改行で区切るための17バイト。



改行で結果に参加せず、これがまだ許可されている場合、OPは応答しませんでした(うまくいけばいいのですが)
Xcoder氏18

@ Mr.Xcoder Agh、修正
...-完全に人間の

1
あなたは使用することができるmapMprintオンラインでお試しください!
-nimi

1

スタックス9 8 バイトCP437

ç@F6╕↔┤ú

オンラインでお試しください!

彼のゼリーの回答で@ 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それは文書化されていますが、気づかなかったものです。
ウェイジュン周






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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.