mod-foldを認識する


18

仕事

mod-foldを形式f(x)= x%a 1  %a 2  %…%a kの関数として定義します。ここでaiは正の整数で、k≥0です。(ここで、は左結合モジュロ演算子です。)

n個の整数y 0、…、y n-1のリストを指定して、各y i  = f(i)になるようにmod-fold fが存在するかどうかを判断します。

関数/プログラムの任意の2つの出力 YおよびNを選択して修正できます。そのようなfが存在する場合、常に正確にYを返す/印刷する必要があります。そうでない場合は、常に正確にNを返す/印刷する必要があります。(これらはtrue/ false、または1/ 0、またはfalse/ trueなどです。)これらをあなたの答えに挙げてください。

バイト単位の最短提出が勝ちです。

f(x)= x%7%3を定義します。その値は始まります:

|   x  | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ...
| f(x) | 0 | 1 | 2 | 0 | 1 | 2 | 0 | 0 | 1 | 2 | ...

したがって、0 1 2 0 1 2 0 0 1 2ソリューションへの入力として与えられると、このfがそのシーケンスを生成するため、Yを出力します。ただし、入力として与えられた場合、fはそのシーケンスを生成しないため、Nを出力します。0 1 0 1 2

テストケース

出力がYの場合に与えられる式は参照用です。決してそれらを印刷してはいけません。

0 1 2 3 4 5              Y    (x)
1                        N
0 0 0                    Y    (x%1)
0 1 2 0 1 2 0 0 1 2      Y    (x%7%3)
0 0 1                    N
0 1 2 3 4 5 6 0 0 1 2    Y    (x%8%7)
0 1 2 0 1 2 0 1 2 3      N
0 2 1 0 2 1 0 2 1        N
0 1 0 0 0 1 0 0 0 0 1    Y    (x%9%4%3%2)

時間やメモリの制限はありますか?
デニス

2
代わりに、真理値と偽値を出力できますか?
リーキー修道女

2
@リーク私はむしろあなたがしたくない。私は真偽の大ファンではありません。私はこれを、まだあなたに自由を与えるより客観的な代替手段として明示的に試しています。
リン

@Lynnは私だけですか、それともまだ修正していませんか?
リーキー修道女

メモリ/時間の制約について:チャレンジ自体に何かを追加するつもりはありませんが、妥当な時間の長さで各テストケースに回答できるバイト単位の最短回答に対して報奨金をかけるかもしれません。
リン

回答:


7

Pyth、14バイト

}Qm%M+RdUQy_Sl

を返しますTrue/False。オンラインで試す:デモンストレーションまたはテストスイート

説明:

}Qm%M+RdUQy_SlQ   implicit Q (=input) at the end
             lQ   length of input list
            S     create the list [1, 2, ..., len]
           _      reverse => [len, ..., 2, 1]
          y       generate all subsets (these are all possible mod-folds)
  m               map each subset d to:
        UQ           take the range [0, 1, ..., len-1]
     +Rd             transform each number into a list by prepending it to d
                     e.g. if mod-fold = [7,3], than it creates:
                        [[0,7,3], [1,7,3], [2,7,3], [3,7,3], ...]
   %M                fold each list by the modulo operator
                  this gives all possible truthy sequences of length len
}Q                so checking if Q appears in the list returns True or False

Pyth、11バイト

q%M.e+k_tx0

@ferrsumのアイデアに基づいています。私は実際にサブセット生成にゼロ指数を使用することを考えましたが、すべてのゼロ指数がすでに解決策である必要があることを認識していませんでした。


4

Python 3、239 218バイト

from itertools import*
lambda z:z in[[eval(''.join([str(l)]+['%'+str(i[::-1][k])for k in range(len(i))]))for l in range(len(z))]for i in(i for j in(combinations(range(1,len(z)+1),i+1)for i in range(len(z)))for i in j)]

リストの入力を受け取り、または、およびzを返す匿名関数。TrueFalseYN

これは@Jakubeの回答と同様の方法を使用し、本質的には総当たり攻撃ですが、非常に高速に実行されます。

from itertools import*               Import everything from the Python module for
                                     iterable generation
lambda z                             Anonymous function with input list z
combinations(range(1,len(z)+1),i+1)  Yield all sorted i+1 length subsets of the range
                                     [1,len(z)]...
...for i in range(len(z))            ...for all possible subset lengths
(i for j in(...)for i in j)          Flatten, yielding an iterator containing all possible
                                     mod-fold values as separate lists
...for i in...                       For all possible mod-fold values...
...for k in range(len(i))            ...for all mod-fold values indices k...
...for l in range(len(z))            ...for all function domain values in [0,len(z)-1]...
[str(l)]+['%'+str(i[::-1][k])...]    ...create a list containing each character of the
                                     expression representing the function defined by the
                                     mod-fold values (reversed such that the divisors
                                     decrease in magnitude) applied to the domain value...
 eval(''.join(...))                  ...concatenate to string and evaluate...
 [...]                               ...and pack all the values for that particular
                                     function as a list
 [...]                               Pack all lists representing all functions into a list
 ...:z in...                         If z is in this list, it must be a valid mod-fold, so
                                     return True. Else, return False

Ideoneでお試しください


4

Python 2、69バイト

f=lambda a,i=0:i/len(a)or a[i]in[a[i-1]+1,i,0][i<=max(a)::2]*f(a,i+1)

True/を使用しFalseます。

mod-foldableシリーズを特徴付けるものに対する答えは、最初に思われるよりも面白くないことがわかりました。これはフォーム0、1、...、Mのシリーズである- 1、0、1、...となるx 1、0、1、...、xは2、...そのような全てのiについて、0こと<= x i <M。このようなシーケンスは、最初の配列を除く、配列内のゼロのすべての(0ベースの)インデックスのmodチェーンによって生成できます。


3

ゼリー19 15 14 バイト

LṗLUZ’1¦%/sLe@

真実の場合は1、偽の場合は0を返します。オンラインでお試しください!

アルゴリズムはO(n n)です。ここでnはリストの長さであり、ほとんどのテストケースでは遅すぎてメモリを集中的に使用します。

変更されたバージョン– 2番目Lをaに置き換える–は、すべてのテストケース5検証するために使用できます。。この変更されたバージョンは、任意の長いリストでは機能しないことに注意してください。

使い方

LṗLUZ’1¦%/sLe@  Main link. Argument: A (array of integers)

L L             Yield the length l of A.
 ṗ              Take the l-th Cartesian power of [1, ..., l], i.e., construct
                all arrays of length l that consist of elements of [1, ..., l].
   U            Upend/reverse each array. This way, the first l arrays start
                with [1, ..., l], as do the next l arrays, etc.
    Z           Zip/transpose the array of arrays.
     ’1¦        Decrement the first array to map [1, ..., l] to [0, ..., l - 1].
        %/      Reduce the array's columns by modulus/residue.
          sL    Split the result into chunks of length l.
            e@  Verify if A belongs to the resulting array.

説明を追加できますか?Jellyを(まだ)使用したことがない人として、どのように機能するかわかりません。
スティーブンH.

ゴルフが終わったらすぐに追加します。最初にやってみたいことがいくつかあります。
デニス

(あきらめて)説明を追加しました。
デニス

3

JavaScript(ES6)、98バイト

a=>a.every((n,i)=>n?n<(l+=p==i)&&n==p++:p=1,l=p=1)

@Feersumのディスカバリーに切り替えることで48バイトを節約しました。n配列内の任意の値はゼロであり、その場合、次の予測pは1であるか、次の予測と等しく、その場合pはインクリメントされます。また、常によりも短くなければならないため、とl比較するpことにより初期シーケンスの長さを測定します。inl


2

Python 2、103 99バイト

f=lambda l,r:r==x or l and f(l-1,[t%l for t in r])|f(l-1,r)
x=input();l=len(x);print+f(l,range(l))

プリント1 truthyためと0 falsyため。Ideoneでテストします。

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