デニス番号2.0


54

PPCGユーザーでありmodに選ばれた@Dennisは、10万人以上の担当者を獲得した2番目のユーザーになりました!

ここに画像の説明を入力してください

これは完全に独創的なアイデアであり、私は他の誰からも得たものではありませんが12012、トリビュートとして彼のユーザーIDに基づいて挑戦してみましょう!

それを見ると、彼のIDには2つの異なる「セクション」があることがわかります。

12

そして

012

これらのセクションは両方とも3になります。これは非常に興味深いプロパティです。

「デニス2.0の数値」を、厳密に増加する数字のすべての最大サブシーケンスが同じ数値に合計される正の整数として定義してみましょう。例えば、

123

厳密に増加する数字の最大サブリストが1つしかないため、デニス2.0の数字であり、合計は6です。さらに、増加する数字の3つの最大サブリスト、つまり

28
46
145

すべての合計が10。また、ちょうど同じ数字を繰り返し番号がしなければならない、例えばのでデニス2.0数字なり777に分けることができます

7
7
7

これは明らかに 7へのすべての合計。

などの数字、デニス2.0の数字で42はありません。

4
2

これは明らかに同じ数になりません。

挑戦

特定の番号がデニス2.0番号であるかどうかを判断するプログラムまたは関数を作成する必要があります。文字列、数値、ファイル、関数引数/戻り値、STDIN / STDOUTなどから、合理的な入力形式で入出力を行い、この数値がDennis 2.0である場合に真理値を返すことができます。数、および偽の値(そうでない場合)。参考までに、最大1,000までのすべてのDennis 2.0番号を以下に示します。

1
2
3
4
5
6
7
8
9
11
12
13
14
15
16
17
18
19
22
23
24
25
26
27
28
29
33
34
35
36
37
38
39
44
45
46
47
48
49
55
56
57
58
59
66
67
68
69
77
78
79
88
89
99
101
111
123
124
125
126
127
128
129
134
135
136
137
138
139
145
146
147
148
149
156
157
158
159
167
168
169
178
179
189
202
222
234
235
236
237
238
239
245
246
247
248
249
256
257
258
259
267
268
269
278
279
289
303
312
333
345
346
347
348
349
356
357
358
359
367
368
369
378
379
389
404
413
444
456
457
458
459
467
468
469
478
479
489
505
514
523
555
567
568
569
578
579
589
606
615
624
666
678
679
689
707
716
725
734
777
789
808
817
826
835
888
909
918
927
936
945
999

標準的な抜け穴が適用され、バイト単位で測定された最短回答が勝ちます!


1
参考までに、マーティン・エンダーは、10万人の代表を獲得した最初の人物です。
エリックアウトゴルファー16

1
12366は有効な2.0番号ですか?(123 | 6 | 6対1236 | 6)
Sp3000

2
@ sp3000これはデニス番号ではありません。それは1236|6
DJMcMayhem

それ,はそれらの間の単項表現であるとして、各桁を取ることができますか?これはおそらくそれを大きく伸ばすことでしょう。
ライリー

13
イムは、デニスはこの挑戦nonthelessで私たちのすべてを破壊する怖がっ
downrep_nation

回答:


15

ゼリー、13 12バイト

@Dennisのおかげで1バイト。

DIṠ’0;œṗDS€E

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

説明

DIṠ’0;œṗDS€E    Main link. Argument: N
D               Convert N to its digits.
 I              Find the differences between the elements.
  Ṡ             Find the sign of each difference. This yields 1 for locations where the
                list is strictly increasing and 0 or -1 elsewhere.
   ’            Decrement. This yields 0 for locations where the list is strictly
                increasing and -1 or -2 elsewhere.
    0;          Prepend a 0.
        D       Get another list of digits.
      œṗ        Split the list of digits at truthy positions, i.e. the -1s and -2s.
         S€     Sum each sublist.
           E    Check if all values are equal.

16

JavaScript(ES6)、72 70バイト

入力として文字列を受け取ります。falseまたは真実の値(数値の場合もあります)を返します。

正規表現を使用して、次のような入力文字列を変換しています"2846145"

"(a=2+8)&&(a==4+6)&&(a==1+4+5)"

次にeval()、この式を呼び出します。

let f =

n=>eval(n.replace(/./g,(v,i)=>(v>n[i-1]?'+':i?')&&(a==':'(a=')+v)+')')

console.log(f("101"));
console.log(f("102"));
console.log(f("777"));
console.log(f("2846145"));


いいですね、それは本当に賢いアイデアです。:-)
ETHproductions

そのアイデアも好きです!しかし、これは機能していません:console.log(f( "2011")); // false console.log(f( "189")); // 18
user470370

3
@ user470370-それは実際に正しいと思います。定義は「厳密に増加する数の部分列」を示しているため、D2.0数2011として分割され 2 / 01 / 1、D2.0数ではありません。に関しては189、それはD2.0番号で18あり、真実の値です。
アーナルド

Ups courseもちろん、あなたは正しい。前にそれを得なかった。私は自分の解決策を作り直す必要があると思います:D
user470370

15

Python、50バイト

r='0'
for d in input():r=d+'=+'[r<d]*2+r
1/eval(r)

期待input()文字列に評価するので、入力は、Python 2出力の周囲の引用符を必要とすることによるものである終了コード0は成功(truthy)を示し、1が故障(falsy)を示しています。

Ideoneでテストします。

使い方

rを文字列0に初期化し、入力のすべての数字dを反復処理します。

  • 場合dはの最初の数字よりも大きいR(最初は0の前の値に等しいDr<dに評価'=+'[r<d]*2収率++

  • drの最初の桁よりも小さい場合、が'=+'[r<d]*2得られ==ます。

  • 場合dはの最初の数字に等しいRRはシングルトン文字列よりも長くなりますD、そう'=+'[r<d]*2利回り再び==

すべての場合において、数字dと生成された2つの文字はrの前に追加されます。

すべての入力数字が処理されるとeval(r)、生成された式を評価します。

  • 入力が(正の)数字の厳密に増加する単一のシーケンスで構成されている場合、式はそれらの合計に評価されます。

    たとえば、整数12345は式になり5++4++3++2++1++0、評価されると15になります。1秒ごとの+単項プラスなので、結果には影響しません。115で除算することは有効です(結果は重要ではありません)。プログラムは正常に終了します。

  • 入力が厳密に増加する2つの数字列で構成される場合、式は単純な比較で構成されます。

    たとえば、整数12012は式2++1++0==2++1++0になります。両方の項の合計が3であるため、評価するとTrueになります。除1のことで真のは、1)(結果は重要ではありません)有効です。プログラムは正常に終了します。

    一方、整数12366は式6==6++3++2++1++0になります。式の合計は612であるため、評価するとFalseになります。分割1により、0)上げるZeroDivisionErrorを、プログラムはエラーで終了します。

  • 入力が数字の3つの以上の厳密に増加系列で構成されている場合、式はで構成され、連鎖比較返し、真の関係するすべての比較が返す場合にのみ

    たとえば、整数94536は式になり6++3==5++4==9++0、すべての項の合計が9であるため、評価時にTrueが生成されます。前と同様に、プログラムは正常に終了します。

    一方、整数17263式の結果3==6++2==7++1++0得られる、用語は合計持っているので、評価されたとき38、および8。前と同様に、プログラムはエラーで終了します。


11
時間について私はこの課題への投稿を投稿し
デニス

7

Brachylog、13バイト

~c@e:{<+}a!#=

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

説明

~c               Find a list of integers which when concatenated result in the Input
  @e             Split the integers into lists of digits
    :{<+}a       Each list of digit is stricly increasing, and compute its sum
          !      Discard all other choice points (prevents backtracking for smaller sublists)
           #=    All sums must be equal

~c 最初に最大のサブリストと統合します。



6

PowerShell v2 +、100 64 61バイト

-join([char[]]$args[0]|%{("+$_","-eq$_")[$_-le$i];$i=$_})|iex

これはすべて1つのパイプラインであるため、リテラルワンライナーです。入力を文字列として受け取ります$args[0]。それをchar-array としてループし、各反復は、現在の値がess-than-or- qualが前の値に等しいかどうかに基づいて、現在の要素の前+または-eq前をパイプラインに配置します。これらの文字列は、互いに編とにパイプのための短い(及びと同様、例えば、入力用として、これは評価されるです、。-le$i-joiniexInvoke-Expressioneval2846145+2+8-eq4+6-eq1+4+5True

そのブール値はパイプラインに残り、True/ Falseはプログラムの完了時に暗黙的に書き込まれます。

NB-1桁の入力の場合、結果の数字はパイプラインに残ります。これはPowerShellの真の値です。

PS C:\Tools\Scripts\golfing> 2846145,681,777,12366,2|%{"$_ -> "+(.\dennis-number-20.ps1 "$_")}
2846145 -> True
681 -> False
777 -> True
12366 -> False
2 -> 2

6

GNU sed 217または115

両方に-rの+1が含まれます

217:

s/./&,/g;s/^/,/g;:;s,0,,;s,2,11,;s,3,21,;s,4,31,;s,5,41,;s,6,51,
s,7,61,;s,8,71,;s,9,81,;t;s/(,1*)(1*)\1,/\1\2X\1,/;t;s/,//g
s,1X1(1*),X\1a,;t;/^1.*X/c0
/Xa*$/s,a*$,,;y,a,1,;/1X1/b;/1X|X1/c0
c1

通常の10進数で入力します

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


115:

s/^|$/,/g;:;s/(,1*)(1*)\1,/\1\2X\1,/;t;s/,//g
s,1X1(1*),X\1a,;t;/^1.*X/c0
/Xa*$/s,a*$,,;y,a,1,;/1X1/b;/1X|X1/c0
c1

単項の数字のコンマ区切りリストとして入力を受け取ります。たとえば123だろう1,11,111

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


5

Perl、38 + 3(-p)= 41バイト

@Ton Hospelのおかげで-9バイト!

s%.%2x$&.(~$&le~$')%eg;$_=/^(2+1)\1*$/

があるため$'、コードを実行するにはファイルに含める必要があります。したがって-p、3バイトをカウントします。数値がDennis 2.0の数値の場合は1を出力し、それ以外の場合は空の文字列を出力します。

$ cat dennis_numbers.pl
s%.%2x$&.(~$&le~$')%eg;$_=/^(2+1)\1*$/
$ perl -p dennis_numbers.pl <<< "1
10
12315
12314"

1
私は、これはおそらく、Perlでの最良の方法だと思いますが、あなたは42にゴルフそれを行うことができますs%.%2x$&.($&.O ge$')%eg;$_=/^(2+1)\1*$/-pオプション(+3コードは持っているので$'
トンHospel

実際、そのランダムの代わりに比較の結果を使用するA方がはるかに優れています!ありがとう!.Oしかし、私は理解していません...それなしでは、場合によっては失敗しますが、理由はわかりません。
ダダ

$'次の数字その後のすべての数字です。したがって、たとえば、上昇シーケンスのように見えるもの778と比較7します。それを破って比較します (ASCIIで上記のすべてが機能します)78ltO7O789
トンホスペル

ああ、それはいいね!私は$' or $キャプチャグループの代わりに ` を使用する方法を探しましたが、「それ以降のすべての」ために見つかりませんでした。ヒントをありがとう!
ダダ

うーん、~$&le~$'1より短くする必要があります
トンHospel

5

JavaScript(ES6)、66 65 63バイト

@ edc65のおかげで2バイト節約

x=>[...x,p=t=z=0].every(c=>p>=(t+=+p,p=c)?(z?z==t:z=t)+(t=0):1)

入力を文字列として受け取ります。古いバージョン(Firefox 30以降でのみ動作します):

x=>[for(c of(p=t=0,x))if(p>=(t+=+p,p=c))t+(t=0)].every(q=>q==+p+t)

ヒント:[...x,0]->[...x,p=t=z=0]
edc65

@ edc65ありがとう、私はそれを考えていませんでした!
ETHproductions

3

Mathematica、38バイト

Equal@@Tr/@IntegerDigits@#~Split~Less&

匿名関数。入力として数値を受け取り、出力TrueまたはFalse出力として返します。


3

Brachylog 2、10バイト、言語のポストデートチャレンジ

ẹ~c<₁ᵐ!+ᵐ=

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

これは基本的に@Fatalizeの答えと同じアルゴリズムです(これを書いた後まで見ませんでした)が、Brachylog 2の構文の下でゴルファーになるようにいくらか再配置しました。

これは完全なプログラムでfalse.あり、デニス2.0番号でないtrue場合、またはそうである場合に戻ります。

説明

ẹ~c<₁ᵐ!+ᵐ=
ẹ           Interpret the input number as a list of digits
      !     Find the first (in default order)
 ~c           partition of the digits
   <₁ᵐ        such that each is in strictly increasing order
         =  Assert that the following are all equal:
       +ᵐ     the sums of each partition

Brachylogフルプログラムの場合と同様に、すべてのアサーションを同時に満たすことができる場合、真のリターンが得られます。それ以外の場合は偽です。デフォルトの順序~cは、より少ない、より長い要素を持つパーティションを最初にソートすることであり、プロローグ(したがってBrachylog)では、プログラム内の最初の述語によって定義されたデフォルトの順序(2番目をタイブレークとして使用します。ここで~cは、理由は)決定論的であるため、ご注文には何もしています。


2

MATL、24 23 20 18 16バイト

Tjdl<vYsG!UlXQ&=

行列の真実を返します

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

また、@ Dennisおめでとうございます!

説明

T       % Push a literal TRUE to the stack
        %   STACK: {1}
j       % Explicitly grab the input as a string
        %   STACK: {1, '2846145'}
d       % Compute the difference between successive ASCII codes
        %   STACK: {1, [6 -4 2 -5 3 1]}
l<      % Find where that difference is less than 1
        %   STACK: {1, [0 1 0 1 0 0]}
v       % Prepend the TRUE value we pushed previously
        %   STACK: {[1 0 1 0 1 0 0]}
Ys      % Compute the cumulative sum. This assigns a unique integer label to
        % each set of increasing numbers
        %   STACK: {[1 1 2 2 3 3 3]}
G!U     % Grab the input as numeric digits
        %   STACK: {[1 1 2 2 3 3 3], [2 8 4 6 1 4 5]}
lXQ     % Compute the sum of each group of increasing digits
        %   STACK: {[10 10 10]}
&=      % Computes element-wise equality (automatically broadcasts). A
        % truthy value in MATL is a matrix of all ones which is only the case
        % when all elements are equal:
        %   STACK: {[1 1 1
        %            1 1 1
        %            1 1 1]}
        % Implicitly display the result

の素敵な使用&=
ルイスメンドー

2

PHP、108の 105 92バイト

$p=-1;foreach(str_split("$argv[1].")as$d)$p>=$d?$r&&$s-$r?die(1):($r=$s)&$s=$p=$d:$s+=$p=$d;

引数から入力を受け取り0、Dennis-2.0番号の場合は1else で終了します。

壊す

$p=-1;                              // init $p(revious digit) to -1
foreach(str_split("$argv[1].")as$d) // loop $d(igit) through input characters
                                    // (plus a dot, to catch the final sum)
    $p>=$d                              // if not ascending:
        ?$r                             // do we have a sum remembered 
        &&$s-$r                         // and does it differ from the current sum?
                ?die(1)                     // then exit with failure
                :($r=$s)&$s=$p=$d           // remember sum, set sum to digit, remember digit
        :$s+=$p=$d                      // ascending: increase sum, remember digit
    ;
// 

2

05AB1E、18バイト

SD¥X‹X¸«DgL*ꥣOÙg

説明

N = 12012 例として使用。

                    # implicit input N = 12012
S                   # split input number to list of digits  
                    # STACK: [1,2,0,1,2]
 D                  # duplicate
                    # STACK: [1,2,0,1,2], [1,2,0,1,2]
  ¥                 # reduce by subtraction
                    # STACK: [1,2,0,1,2], [1,-2,1,1]
   X‹               # is less than 1
                    # STACK: [1,2,0,1,2], [0,1,0,0]
     X¸«            # append 1
                    # STACK: [1,2,0,1,2], [0,1,0,0,1]
        DgL*        # multiply by index (1-indexed)
                    # STACK: [1,2,0,1,2], [0,2,0,0,5]
            ê       # sorted unique
                    # STACK: [1,2,0,1,2], [0,2,5]
             ¥      # reduce by subtraction
                    # STACK: [1,2,0,1,2], [2,3]
              £     # split into chunks
                    # STACK: [[1,2],[0,1,2]]
               O    # sum each
                    # STACK: [3,3]
                Ù   # unique
                    # STACK: [3]
                 g  # length, 1 is true in 05AB1E
                    # STACK: 1

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


2

Ruby 2.3、56バイト

p !gets.chars.chunk_while(&:<).map{|a|eval a*?+}.uniq[1]

ほとんど間違いなくこれを行うにはゴルフの方法ではありませんが、いくつかの素晴らしい言語機能を示しています。

(改行耐性ではないため、のように実行しますruby dennis2.rb <<< '12012'


1

PHP、144バイト

<?php preg_match_all("/0?1?2?3?4?5?6?7?8?9?/",$argv[1],$n);foreach($n[0]as$i)if(strlen($i)&&($a=array_sum(str_split($i)))!=$s=$s??$a)die;echo 1;

これを行うにはもっと賢い(そして短い)方法があると確信していますが、今のところはそれでうまくいきます。


1

Python 2、69バイト

入力を文字列として受け取ります。

lambda I:len(set(eval(reduce(lambda x,y:x+',+'[y>x[-1]]+y,I+' '))))<2

説明:

1201212012

合計のリストに変換します。

1+2,0+1+2,1+2,0+1+2,

評価してセットに変換します。

set([3])

セットの長さが1の場合、すべての合計は同じです。


1

JavaScript(ES6)、58

s=>![...s,z=x=p=0].some(c=>[c>p?0:z-=(x=x||z),z-=p=c][0])

私のめったに役立つヒントを適用するhttps://codegolf.stackexchange.com/a/49967/21348

昇順文字の実行を識別する文字ごとに文字列charをスキャンし、各ラムの最後に合計が常に同じかどうかをチェックします

  • c:現在の文字
  • p:前の文字
  • z:実行の合計は、実行の最後に比較されます...
  • x:比較対象の合計。最初の実行では単純にzに等しくなります

テスト

f=
s=>![...s,z=x=p=0].some(c=>[c>p?0:z-=(x=x||z),z-=p=c][0])

function run()
{
  var i=I.value
  O.textContent = i + ' -> ' + f(i)
}

run()

test=`1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 22 23 24 25 26 27 28 29 33 34 35 36 37 38 39 44 45 46 47 48 49 55 56 57 58 59 66 67 68 69 77 78 79 88 89 99 101 111 123 124 125 126 127 128 129 134 135 136 137 138 139 145 146 147 148 149 156 157 158 159 167 168 169 178 179 189 202 222 234 235 236 237 238 239 245 246 247 248 249 256 257 258 259 267 268 269 278 279 289 303 312 333 345 346 347 348 349 356 357 358 359 367 368 369 378 379 389 404 413 444 456 457 458 459 467 468 469 478 479 489 505 514 523 555 567 568 569 578 579 589 606 615 624 666 678 679 689 707 716 725 734 777 789 808 817 826 835 888 909 918 927 936 945 999`.split` `

numerr=0
for(i=1; i<1000; i++)
{
  v = i + '';
  r = f(v);
  ok = r == (test.indexOf(v) >= 0)
  if (!ok) console.log('Error',++numerr, v)
}  
if(!numerr) console.log('All test 1..999 ok')
<input id=I value=612324 type=number oninput='run()'>
<pre id=O>



0

ルビー、 117 105 85バイト

# original (117):
j,k=0,?0;"#{i}".chars.group_by{|n|n>k||j=j+1;k=n;j}.values.map{|a|a.map(&:to_i).reduce(&:+)}.reduce{|m,n|n==m ?m:nil}

# inspired by PHP regexp approach (105):
"#{i}".scan(/0?1?2?3?4?5?6?7?8?9?/).map{|a|a.chars.map(&:to_i).reduce(&:+)}.reduce{|m,n|!n||n==m ?m:nil}

# some number comparison simplification (85):
!"#{i}".scan(/0?1?2?3?4?5?6?7?8?9?/).map{|a|a.chars.map(&:to_i).reduce(&:+)}.uniq[1]

これは、このデニス番号の整数、またはデニス番号でないnil場合を返します。すべての整数はルビーでも真と見なされ、同様にnil偽と見なされます。iチェックされている整数です。

3番目のバージョンは、実際に返すtruefalse

PSは、回答のように1〜1000の172個の整数を返すようにテストされています。


0

APL、23バイト

{1=≢∪+/↑N⊂⍨1,2>/N←⍎¨⍕⍵}

説明:

  • N←⍎¨⍕⍵:入力の個々の数字を取得し、保存します N
  • N⊂⍨1,2>/N:厳密に増加する数値のサブリストを見つけます N
  • +/↑:各サブリストを合計する
  • 1=≢∪:結果リストに一意の要素が1つしかないかどうかを確認します

0

Add ++、109バイト

D,g,@@#,BF1_B
D,k,@@#,bR$d@$!Q@BFB
D,f,@,BDdVÑ_€?1€_0b]$+€?dbLRBcB*BZB]GbL1+b]+qG€gd€bLÑ_0b]$+BcB]£k€¦+Ñ=1$ª=

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

使い方

fgkf

f(x)

x1[4,4,4]0110A010

[1,2,...length(A)]0AAAAA

ggA

g(x,y)

g(x,y)x:=[1,2,0,1,2]y=33AA10x=12012A=[3,6]3A6x

g([1,2,0,1,2],3)[1 2 0 1 2 2][1,2]g

g(x,y)yAx:=12012g

[[[1 2] [1 2 0 1 2]]]

[2,5]A10[0,3]gB

k(x,n)

k[[1,2],[3,4],[5,6]]

[[[1,2],0],[[1,2,0,1,2],3]]kk([1,2,0,1,2],3)

k(x,n)gn=0[n,x,n]n=0[[2,1,0,1,2],3]nxxB

[0,1,2][2,1,0]

k(x,n)(x,n)B1

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