Mod katlarını tanıma


18

Görev

Bir mod-katlamasını , f (x) = x% a  % 1 % a  % 2 …% a k formunun bir fonksiyonu olarak tanımlayın , burada a i pozitif tamsayılar ve k ≥ 0'dır . (Burada % , sol ilişkisel modulo operatörüdür.)

Y 0 ,…, y n − 1 n tamsayılarının bir listesi verildiğinde , her y i  = f (i) olacak şekilde bir mod katlama f olup olmadığını belirleyin .

İşleviniz / programınız için iki Y ve N çıkışını seçebilir ve düzeltebilirsiniz . Böyle bir f varsa, her zaman tam olarak Y döndürmeli / yazdırmalısınız ; değilse, her zaman tam olarak N döndürmeli / yazdırmalısınız . (Bunlar olabilir true/ falseveya 1/ 0veya false/ truevs.) Cevabınız bu bahsedin.

Bayt cinsinden en kısa gönderim kazanır.

Misal

F (x) = x% 7% 3'ü tanımlayın 3 . Değerleri başlar:

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

Bu nedenle, 0 1 2 0 1 2 0 0 1 2çözümümüze girdi olarak verildiğinde , bu f dizisini oluşturduğu için Y'yi basardık. Bununla birlikte, girdi olarak verildiğinde , hiçbir f bu diziyi üretmediği için N yazdıracağız .0 1 0 1 2

Test senaryoları

Çıktı Y olduğunda verilen formüller sadece referans içindir; onları hiçbir zaman yazdırmamalısınız.

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)

Herhangi bir zaman veya bellek sınırı var mı?
Dennis

2
Bunun yerine doğruluk değerleri ve falsey değerleri verebilir miyim?
Leaky Nun

2
@Leaky Yapmamayı tercih ederim. Ben gerçek-falsey'in büyük bir hayranı değilim; Bunu açıkça size özgürlük veren daha objektif bir alternatif olarak deniyorum.
Lynn

@Lynn sadece ben mi yoksa hala düzeltmedin mi?
Leaky Nun

Bellek / zaman kısıtlamaları ile ilgili olarak: Zorluğun kendisine herhangi bir şey ekleyeceğimi düşünmüyorum, ancak test durumlarımın her birine makul bir süre içinde cevap verebilecek baytlardaki en kısa cevap için bir ödül verebilirim.
Lynn

Yanıtlar:


7

Pyth, 14 bayt

}Qm%M+RdUQy_Sl

İade True/False. Çevrimiçi deneyin: Gösteri veya Test Paketi

Açıklama:

}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 bayt

q%M.e+k_tx0

Dayanarak @ ferrsum fikri . Aslında alt küme üretimi için sıfır endekslerini kullanmayı düşündüm, ancak tüm sıfır endekslerinin zaten çözüm olması gerektiğini fark etmedim.


4

Python 3, 239 218 bayt

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)]

Listenin girdi alır anonim bir fonksiyon zve iadeler Trueveya Falseiçin Yve N.

Bu @Jakube 'in benzer bir yöntem kullanır cevap ve aslında bir kaba kuvvet olmasına rağmen, çok hızlı bir şekilde çalışır.

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 üzerinde deneyin


4

Python 2, 69 bayt

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)

Kullanımları True/ False.

Mod katlanabilir bir diziyi karakterize eden şeyin cevabı, ilk bakışta göründüğünden daha az ilginç. 0, 1, ..., M - 1, 0, 1, ... x 1 , 0, 1, ..., x 2 , ... formlarının bir serisidir, böylece tüm i, 0 için <x = i <M Böyle bir dizisi, birinci hariç dizideki sıfırların tüm (0 bazlı) indisleri mod zincir ile üretilebilir.


3

Jöle , 19 15 14 bayt

LṗLUZ’1¦%/sLe@

İade 1 truthy için, 0 falsy için. Çevrimiçi deneyin!

Algoritma O (n n ) şeklindedir , burada n listenin uzunluğudur, bu da test durumlarının çoğu için çok yavaş ve bellek yoğun hale getirir.

Tüm test senaryolarını doğrulamak için , ikincisini a Lile değiştiren değiştirilmiş bir sürüm 5kullanılabilir . Bu değiştirilmiş sürümün keyfi olarak uzun listelerde çalışmadığını unutmayın.

Nasıl çalışır

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.

Bir açıklama ekleyebilir misiniz? Jelly'i henüz kullanmayan biri olarak, nasıl çalıştığı hakkında hiçbir fikrim yok.
Steven H.

Golf bittiğinde bir tane ekleyeceğim. Hala denemek istediğim birkaç şey var.
Dennis

Bir açıklama ekledim (vazgeçtim).
Dennis

3

JavaScript (ES6), 98 bayt

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

@ Feersum'un keşfine geçerek 48 bayt kaydedildi. nDizide verilen herhangi bir değer ya sıfırdır, bu durumda bir sonraki tahmin p1 olur ya da bir sonraki öngörüye eşittir, bu durumda partırılır. Ayrıca uzunluğunu ölçmek lkarşılaştırarak başlangıç dizisinin piçin iolduğu gibi, nher zaman mutlaka daha az olması lher zaman.


2

Python 2, 103 99 bayt

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

Baskılar 1 truthy ve 0 falsy için. Ideone üzerinde test edin .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.