オッズを教えてはいけない


38

入力

整数N(≥1)と桁D(整数ように0≤  D  ≤9)。

どちらの順序でも。stdinまたはparametersなどから; プログラムまたは機能へ。等

出力

10進表現に偶数dが含まれる1からnまでの整数(順番)。(つまり、リスト内の整数は、それぞれ偶数個のdを持つ整数です。)

標準形式など。特に、出力を10進数で表す必要はありません。

単一の文字列として出力する場合、整数を何らかの方法で区切る必要があります(スペース、コンマ、改行、nullバイトなど)。

in(d,n) ↦ out
1,12    ↦ 2 3 4 5 6 7 8 9 11
0,111   ↦ 1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,36,37,38,39,41,42,43,44,45,46,47,48,49,51,52,53,54,55,56,57,58,59,61,62,63,64,65,66,67,68,69,71,72,73,74,75,76,77,78,79,81,82,83,84,85,86,87,88,89,91,92,93,94,95,96,97,98,99,100,111

ありがとう

quintopiaタイトルのために。


0は偶数としてカウントされますか?
MilkyWay90

@ MilkyWay90、もちろん。
msh210

回答:


3

ゼリー、7バイト

RDċ€Ḃ¬T

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

使い方

RDċ€Ḃ¬T  Main link. Arguments: n, d

R        Range; yield [1, ..., n].
 D       Convert each integer in the range to base 10.
  ċ€     Count the occurrences of d in each array of decimal digits.
    Ḃ    Compute the parities.
     ¬   Negate, so even amounts evaluate to 1, odds to 0.
      T  Find all indices of truthy elements.

13

05AB1E11 10バイト

コード:

\>GN¹¢ÈiN,

説明:

\           # Pop input, which saves the first input into ¹
 >          # Increment on second input
  G         # For N in range(1, input + 1)
   N        # Push N
    ¹       # Push the first input from the input register
     ¢      # Count the number of occurences of the digit in N
      È     # Is even?
       iN,  # If true, print N with a newline

オンラインで試す

CP-1252エンコードを使用します。


¢は両方の引数を文字列として解釈しますか?
スパー

@Sparrそれは依存しますが、文字列を含むリストでも実行できます。しかし、ここでは、両方の引数を文字列として解釈します。
アドナン

13

Haskell、69 63 52 50バイト

d#n=[i|i<-[1..n],even$sum[1|x<-show i,read[x]==d]]

ここに私の最初の投稿のためのストレートフォーウェアのソリューション。showの数をカウントするために使用しますd。のChar入力として明示的に使用しなかったのでd12 6(Damienの編集後)バイトを節約できます。

編集:ダミアンのおかげで11バイト少なくなりました!編集2:nimiのおかげでさらに2バイト少なくなりました!


2
内包リストでフィルターを置き換えることができます:fdn = [i | i <-[1..n]、even $ sum [1 | x <-show i、read [x] == d]]
Damien

12

Befunge、1080 945バイト

vd>"000">" "v
&0      ^              p21-1+*68<
62            >        v
8           >-|        >12g68*-:|
*             >11g1+11p^        $
+                      v  <
5                         |%2g11<
5                      v.:<          
+         v            <        
0         >268*+12p68*11p"000"40p50p60pv
p
           v                             -1<
             v-g01p06+1g06<
>&         >:>:10g1-`     |            >:0`|
             v            <                @
             v-+55p05+1g05<      
             >:54+`       |
   v               p04+g04<
  ^          <                <      <
   >60g68*-0`|      >50g68*-0`|
             >" "60p^         >" "50p^

スコアは、改行を含む正方形全体を数えることで得られます。これは理にかなっています。あなたはにコードをコピー&ペーストすることができますinterpeter。最初にd、次にnの 2つの入力を提供します。この解決策は、n > 999 より大きい値には機能しません。

これは明らかに大賞の候補ではありませんが、私はしばらくの間Befungeでcodegolfを実装したいと思っていたので、私はそれをすることにしました。これは私がBefungeで行った最初の実際のことなので、これは最適なBefungeソリューションにさえ近いものではないだろうと思います。したがって、ヒントを歓迎します。明確化や詳細情報が必要な場合は、コメントでお知らせください。

説明の試み:

最初の列では、入力から整数を読み取り、それに48(6 * 8、これを頻繁に表示します)を追加して、対応するASCII値に変換し、に入れ(10, 0)ます。

& -入力の読み取り

68*+ -48を追加

55+0p -値を (10, 0)

dat (1, 0)は、スタック上の100番を取得する簡単な方法であることに注意してください。

その後、東に進み、別の整数を読み取り、ASCIIfierと呼ばれるものに進みます。これにより、現在の数値が一連のASCII文字に変換されます。ASCIIfierはから(13, 12)までの長方形の断片(26, 17)です。それは最初hunderdsをカウントし、数十以上とで3桁にそれらを入れて、二つのループで構成さ(6, 0)(5, 0)。その後、最後の数字がに入れられ(4, 0)ます。したがって、数値は実際には逆になります。

v-g01p06+1g06< - increment the "hunderds counter" located at (0, 6) and decrease current value by 100
>:10g1-`     | - ASCIIfier entry; check if the current value is > 99, if so, go up, else go down
v            < - go to start of "tens counter"
v-+55p05+1g05< - increment the "tens counter" located at (0, 5) and decrease current value by 10
>:54+`       | - check if current value is > 9, if so, go up, else go down
      p04+g04< - put the final value into the "singles counter" located at (0, 4)

現在の整数を一連のASCII文字に入れた後、もう少し南に進み、先頭に付加されたゼロを削除します。したがって、その後、最初の3つのゼロは、先頭にゼロを付加せずに現在の数値になります。

その後、北に戻り、スタックに3桁の数字を入れます。(1, 1)現在の桁が入力dに対応する場合に位置するカウンターをインクリメントするたびに、上のループの3桁を繰り返し処理します

それが完了したら、にあるカウンター(1, 1)が奇数か偶数かを確認します。偶数の場合、現在の数値を出力し、大きな外側のループに移動して現在の値をデクリメントし、最初からやり直します。


時間があれば説明を投稿してください!
シモンズ

説明の試みを追加しました。明確にするのはそれほど簡単ではないことがわかりました...さらに質問することを
he

ちなみに、結果を昇順で出力する必要があることがわかりました。これにより、要件にさらに
不適合

動作するBefungeの回答に対しては、常に+1を使用してください。ところで、これは本当に945バイトですか?これは679
ルイスメンドー

へへ、ありがとう。21行45列(改行を含む)の正方形全体を取得したため、945をカウントしました
-rael_kid

7

Python 2、50バイト

f=lambda d,n:n*[0]and f(d,n-1)+~`n`.count(d)%2*[n]

数字dを文字列として、上限をn数値としてとる再帰関数。

桁数のカウントは、2を法とするビット補数を取ることで偶数dであることnがテストされ1、偶数と0奇数が得られます。この多数nのものがリストに追加され、関数はに再帰しn-1、のとき空のリストで論理的な短絡を介して停止しn==0ます。

出力を降順で指定できる場合は、49バイトで1バイトを節約できます。

f=lambda d,n:n*[0]and~`n`.count(d)%2*[n]+f(d,n-1)

古い51バイトソリューション:

lambda d,n:[x+1for x in range(n)if~`~x`.count(d)&1]

数字dを文字列として、上限をn数値として取る匿名関数。

2つのトリックが使用されます。

  • Pythonのrangeインデックスはゼロな0...n-1ので、各潜在的な値に1を追加しますx。その後、カウントするdのではx+1、それはその否定を使用する文字セーブ~x代わりに。
  • 偶数値をフィルター処理するには~_%2、最初にビットフリップしてパリティを切り替え、最後のビットを取得して&1%2ここと同じ)、元が偶数の場合にのみ真理値を生成します。


4

Lua、86バイト

一貫性のない区切り文字の使用が許可io.writeされているprint場合、で置き換えることができます。つまり、数字は1つまたは複数の改行で区切られます。

これは完全なプログラムであり、次のように呼び出す必要がありますlua file.lua d n

d現在の数値からすべての非文字を削除し、結果の文字列のサイズを使用して、出力するかどうかを決定します。

for i=1,0+arg[2]do io.write(#(i..''):gsub("[^"..arg[1].."]","")%2<1 and i.." "or"")end

4

JavaScript(ES6)64

コンソールへの出力を伴う匿名関数。split数字のカウントに使用する簡単な実装。

(d,n)=>{for(i=0;i++<n;)(i+'').split(d).length&1&&console.log(i)}

使用alertする出力は6バイト少なくなりますが、私はそれが本当に好きではありません(とにかくおもちゃの言語に勝るものはありません)


4

MATL12 10バイト

:!V!=s2\~f

最初の入力はn、2番目は文字列としてのdです。例えば:

12
'1'

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

:       % implicitly take input n (number). Generate row vector [1,2,...,n]
!       % transpose into column vector
V       % convert each number to string. Gives 2D char array padded with spaces
!       % transpose
=       % implicitly take input d (string). Compare with each element of the array
s       % sum of each column: number of coincidences with d
2\~     % true for even values
f       % find indices of true values. Implicitly display

4

ルビー、47 42バイト

?1.upto $*[1]{|s|s.count($*[0])%2<1&&p(s)}

コマンドラインパラメータとしてdおよびnを使用して実行します。たとえば、

ruby golf.rb 1 12

2
素晴らしい最初の答え!PPCGへようこそ!:D
mbomb007

よくやった!ルビー1.9+では、使用することができます?1のために"1"。あまりきれいではありませんが、%2>0代わりに1バイト短くします.odd?
-histocrat

4

PowerShell、62 55

param($1,$2);1..$2|?{!(([char[]]"$_"-match$1).Count%2)}

編集:この場合のparamブロックの使用は短くなります。いくつかの冗長なスペースを削除しました


ゴルフの言語ではなく、私が本当に知っている唯一の言語です。これはスクリプトとして保存され、次のように呼び出されM:\Scripts\cgNeverTellMeTheOdds.ps1 1 12ます。最初の引数は数字dで、2番目は整数nです。

番号1からnの配列を作成します。それらのそれぞれについて、それを文字配列に変換します。10は1,0です。-match配列演算子として使用すると、数字dと一致するすべての要素が返されます。返された要素の数を数え、結果をmod 2します。結果は偶数の場合0、奇数の場合1になります。ブール値としての0はfalseなので!、ループに使用して、奇数の結果をfalseに、偶数の結果をtrueに評価します。

出力は、コンソールで区切られた改行です。


PPCGへようこそ、最初の回答です!:)
FryAmTheEggman

@FryAmTheEggmanスウィート。うなずいてくれてありがとう。これは他のすべての答えに埋もれてしまいますが。
マット

3

網膜99の 105バイト

末尾のスペースに注意してください。<empty>空の行を表します。

\d+$
$*
+`^(. )(1*)1\b
$1$2 1$2
1+
$.0
+`^(.)(.*) ((?!\1)\d)*\1((?!\1)\d|(\1)((?!\1)\d)*\1)*\b
$1$2
^.  
<empty>

のような入力を受け取ります1 12。出力は、降順でスペースで区切られます。

0*1(0|10*1)*数の奇数に一致するように変更し\1ました。私は変更0する(?!\1)\d、と1する\1あなたは上記を参照長い正規表現の行を作成します。リンクされた正規表現の仕組みを理解することは非常に重要です。

オンラインで試す

古いバージョンのコメント付きの説明

降順でよければ

\d+$            Convert last number N to unary
$*
+`1(1*)$        Create list N N-1 ... 1 in unary
$0 $1
 (1)+           Convert back to decimal
 $#1
+`^(.)(.*) ((?!\1)\d)*\1((?!\1)\d|(\1)((?!\1)\d)*\1)*   Remove numbers w/ odd num of D's
$1$2 
^.              Remove first parameter
<empty>

1
1+および$.0を使用して、単項から10進数に変換することができます。
FryAmTheEggman


3

Pythonの3.4、92の 85 79 85バイト

Megoのおかげで7バイト
を節約mbomb007のおかげでさらに6バイトを節約Python 3.xのためにこれらの6バイトを取り戻しました

これはコードゴルフでの私の最初のショットなので、ここには何もありません!

lambda n,d:[i for i in range(n+1)if len([j for j in list(str(i))if j==str(d)])%2is 0]

1
これで削除できるスペースがいくつかあります。また、名前のないラムダにすると、かなり短くなります。
メゴ

`d`代わりに使用できます。nが整数(<2 ** 32)であるstr(d)と仮定した場合、の代わりに使用できます。`i`str(i)
mbomb007

バックティックはstr()の省略形ですか?
ナカアン

1
バックティックは、__repr__Python 2では省略形であり、Python 3では削除されました。おそらく、その制限を反映するようにヘッダーを変更する必要があります。
FryAmTheEggman

ええ、私はちょうどそれを見つけ、通訳でテストケースを投げ回している間に見つけました。悲しい顔。
ナカアン


2

Brachylog、32バイト

:1reIlL,"":Ic:.xl-L=%2=0,Iw,@Sw\

Nを入力として、数字を出力として期待します。例えば brachylog_main(12,1).

説明

:1reI                            § I is a number between 1 and Input
     lL,                         § L is the length of I
        "":Ic                    § Convert I to a string
             :.x                 § Remove all occurences of Output in that string
                l-L=%2=0,        § Check that the length of that new string - L mod 2 is 0
                         Iw,@Sw  § Write I, then write a space
                               \ § Backtrack (i.e. try a new value of I)


2

Perl、28 29 31バイト

+2を含む -an

STDINの連続する行で指定桁とカウントで実行します。

echo -e "0\n111" | perl -anE'map s/@F/$&/g%2||say,1..<>'

2

OracleのSQL 11.2、111の 82バイト

SELECT LEVEL FROM DUAL WHERE MOD(REGEXP_COUNT(LEVEL,:d),2)=0 CONNECT BY LEVEL<=:n;


2

Java 8、84バイト

これはaのラムダ式ですBiConsumer< Integer, Integer>

(d,n)->for(int x=0;x++<n;)if((""+x).split(""+d,-1).length%2>0)System.out.println(x);

説明:

1からnまでの各数値について、数値をストリングに変換し、dを区切り文字として使用して分割します。奇数のセクションに分割されている場合は、番号に続いて新しい行を出力します。


2

網膜、 72 71 55

\d+$
$*
\B
¶$`
1+
$.0
G`(.),((?>.*?\1){2})*(?!.*\1)
.,
<empty>

偶然にも原子マッチンググループを思い出させてくれたMartinに感謝します!

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

説明:

\d+$
$*

数字ではなく数字を、単項の同等のものに置き換えます。

\B
¶$`

\B単語の境界ではない各位置(幅ゼロ)に一致します。これは、文字列の先頭、文字列の末尾、またはコンマ文字の周囲の位置のいずれにも一致しないことに注意してください。次に、これらの非境界のそれぞれが改行に置き換えられ、次に一致の前に来る文字列($`)に置き換えられます。次のようなリストが表示されます。

d,1
d,11
d,111

d単一の10進数はどこにありますか。

1+
$.0

これは、1sのすべてのリストをそれらの長さの10進表現に変換します。これ1は、コンマの前にある可能性があるため、コンマの前の長さに常に1影響します。

G`(.),((?>.*?\1){2})*(?!.*\1)

ここではG、grepモードをオンにします。つまり、正規表現に一致する行は保持され、他の行は破棄されます。この正規表現は複雑ですが、基本的に先頭の2桁のグループに一致します(キャプチャグループ1に格納されているため、参照できます\1)。

ここで重要なのは、最も早い2桁の数字まで貪欲でない一致を使用したときに失敗した場合、数字を.照合してロールバックして再試行することです。これにより、数字が1のときに111のような数字が一致します。したがって、?>この値と一致する前に正規表現がバックトラックしないように、基本的に一致をアトミックにするために使用します。アトミックマッチは、特定のフレーバーでの強引なマッチングのように機能します。以来*メタ文字が続いている、我々がに保存されているものと一致できるようになるまで文字を一致します。次に、これを2回実行すると、正規表現の「メモリ」が破棄され、通常発生する動作が防止されます。?.\1.\1無効な一致を作成する追加の文字、数字に一致します。

次に、入力桁の2つの繰り返しグループに一致した後、最終位置から、別の入力桁に一致できないことを確認します。

.,
<empty>

ここでは、各文字列から数字とコンマを削除するだけなので、いい答えが得られます。


説明を追加してください。
mbomb007

@ mbomb007 OK、追加:)
FryAmTheEggman

アトミックマッチングは、まだ理解できていません。
mbomb007

@ mbomb007私は何が起こっているかを明確にしようとしましたが、何かが不明瞭であると際立っているかどうかを教えてください。
FryAmTheEggman

1

パイソン2、57の 54バイト

lambda d,n:[i for i in range(1,n+1)if`i`.count(d)%2<1]

使用法

>>> (lambda d,n:[i for i in range(1,n+1)if`i`.count(d)%2<1])('1', 12)
[2, 3, 4, 5, 6, 7, 8, 9, 11]

1

ジュリア、44バイト

f(n,d)=filter(i->sum(d.==digits(i))%2<1,1:n)

これは、2つの整数を受け入れ、配列を返す関数です。

1からまでの整数のセットから始めnます。整数ごとid、どの小数桁がに等しいかを判断し、ブール配列を生成します。我々sumこれはの出現数を取得するためdの数字としてi、そしてfilter和のパリティに基づいて、元の範囲。

ここで試してみてください


1

真剣に、17バイト

╩╜R;`$╛@c2@%Y`M@░

入力を受け取りn\n'd'(整数、改行文字列)。

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

説明:

╩╜R;`$╛@c2@%Y`M@░
╩                  push all inputs to registers
 ╜R;               push two copies of range(1, n+1)
    `        `M    map:
     $╛@c            count the number of d's
         2@%Y        modulo 2, logical not (1 if even, 0 if odd)
               @░  filter: take only the values of range(1, n+1) where the count is even

1

Mathematica、45バイト

Select[a=#2;Range@#,2∣DigitCount[#,10,a]&]&

組み込みを使用しDigitCountます。


1

Japt、13 12バイト

Uò1 f_s èV v

入力はnで、dは引用符で囲まれています。オンラインでテストしてください!

使い方

       // Implicit: U = input integer, V = input string
Uò1    // Create the inclusive range [1..U].
f_     // Filter to only the items Z that return truthily to this function:
s èV   //  Take Z.toString(), then count the number of matches of V.
v      //  Return 1 (truthy) if even, 0 (falsy) otherwise.
       // Implicit output, array separated by commas

1

CJam、38バイト

r:P;r~1+,0-_{s{s}%Pe=2%!}%]z{~{}{;}?}%

説明

r:P;                                    e# set input d to variable P
    r~1+,0-                             e# create a range(1, n+1)
           _{s{s}%Pe=2%!}%              e# determine which numbers are needed
                          ]z{~{}{;}?}%  e# remove extra numbers


1

R、145バイト(これをさらに短縮する方法があると確信しています):)

g<-sapply(sprintf("%s",seq(1:111)),function(z){if(sapply(regmatches(z,gregexpr("0",z)),length)%%2==0){z}else{NULL}})
names(g[!sapply(g,is.null)])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.