अगला क्या हे?


15

पूर्णांक की एक अलग-अलग सूची को देखते हुए, आपका कार्य अनुक्रम में अगले पूर्णांक को खोजना है। अनुक्रम में प्रत्येक पूर्णांक एक भी गणितीय प्रक्रिया (लागू करने का परिणाम है +, -, *या /पिछले पूर्णांक तक), और प्रत्येक अनुक्रम में इस तरह के आपरेशनों के परिवर्तनशील (लेकिन कोई 10 से अधिक) से बना है। कोई भी अनुक्रम पूर्णांकों के अनुक्रम की लंबाई से आधे से अधिक नहीं होगा, इसलिए आपके पास परिचालन का प्रत्येक अनुक्रम कम से कम दो बार पुष्टि के लिए दिखाई देगा।
इनपुट स्टडिन (या promptजावास्क्रिप्ट समाधान के लिए) के माध्यम से होगा ।

यहाँ कुछ व्याख्यात्मक उदाहरण दिए गए हैं।

इनपुट:

1 3 5 7 9 11

आउटपुट:

13

बहुत आसान है, यह एक। सभी मूल्य पिछले मूल्य हैं+2

इनपुट:

1 3 2 4 3 5 4 6 5 7 6

ouput:

8

इस क्रम में दो कदम, +2फिर-1

इनपुट:

2 6 7 3 9 10 6 18 19 15 45 46

आउटपुट:

42

तीन कदम - *3, +1, -4

परीक्षण के मामलों

यहाँ कुछ और परीक्षण मामले हैं:

इनपुट:

1024 512 256 128 64 32 16

आउटपुट:

8

इनपुट:

1 3 9 8 24 72 71 213 639

आउटपुट:

638

इनपुट:

1 2 3 4 5 2 3 4 5 6 3 4 5 6 7

आउटपुट:

4

इनपुट:

1 2 4 1 3 9 5 8 32 27 28 56 53 55 165 161 164 656 651 652 1304

आउटपुट:

1301

मेरे पास एक असंगठित स्काला समाधान (42 लाइनें) है जिसे मैं कुछ दिनों में पोस्ट करूंगा।

यह कोड-गोल्फ है - सबसे छोटी उत्तर जीत।


क्या विभाजन सटीक होने की गारंटी है?
पीटर टेलर

@Peter हाँ। प्रत्येक चरण के परिणामस्वरूप पूर्णांक होगा।
गारेथ

लेकिन अगर चरण "/ 3" है, तो क्या यह गारंटी है कि शेष हमेशा 0 होगा?
पीटर टेलर

@Peter हाँ, शेष हमेशा 0. होगा
गैरेथ

जवाबों:


12

गोल्फस्क्रिप्ट, 203 138 चार्ट

~]0{).2$.);[\(;]zip\/zip{.{~-}%.&({-}+\{;{.0={.~\%{.~%{;0}{~/{/}+}if}{~\/{*}+}if}{~!{;}*}if}%.&(\{;;0}/}{\;}if}%.{!}%1?)!{0}*}do\@)\,@%@=~

यह ifएक मानक गोल्फस्क्रिप्ट प्रोग्राम की तुलना में कहीं अधिक एस का उपयोग करता है , और इसका संचालन बहुत ही गूढ़ है, इसलिए यहां एक टिप्पणी की गई है (लेकिन व्हाट्सएप और टिप्पणियों के अलावा अन्य अप्राकृतिक नहीं) संस्करण:

~]0
# Loop over guesses L for the length of the sequence
{
    # [x0 ... xN] L-1
    ).
    # [x0 ... xN] L L
    2$.);[\(;]zip
    # [x0 ... xN] L L [[x0 x1][x1 x2]...[x{N-1} xN]]
    \/zip
    # [x0 ... xN] L [[[x0 x1][xL x{L+1}]...][[x1 x2][x{L+1} x{L+2}]...]...]
    {
        # [x0 ... xN] L [[xi x{i+1}][x{i+L} x{i+L+1}]...]
        # Is there an operation which takes the first element of each pair to the second?
        # Copy the pairs, work out each difference, and remove duplicates
        .{~-}%.&
        # Turn the first difference into an operation
        ({-}+\
        # If there was more than one unique difference, look for a multiplication
        {
            ;
            # [x0 ... xN] L [[xi x{i+1}][x{i+L} x{i+L+1}]...]
            # Do something similar, but working out multiplicative factors
            # Note that if we have [0 0] it could be multiplication by anything, so we remove it.
            # However, they can't all be [0 0] or we'd have only one unique difference
            {
                # [0     0   ] =>
                # [0     _   ] => 0     # a "false" value, because it can't possibly be multiplication
                # [a     a.b'] => {b'*}
                # [a'.b  b   ] => {a'/}
                # [_     _   ] => 0     # ditto
                # This is the obvious place to look for further improvements
                .0={.~\%{.~%{;0}{~/{/}+}if}{~\/{*}+}if}{~!{;}*}if
            }%.&
            # If we have one unique multiplication, even if it's false, keep it.
            # Otherwise discard them and replace them with false.
            (\{;;0}/
        }
        # There was only one unique difference. Discard the pairs
        {\;}if
        # operation - one of 0, {d+}, {m*}, {M/}
    }%
    # [x0 ... xN] L [op0 ... op{L-1}]
    # Is any of the operations false, indicating that we couldn't find a suitable operation?
    .{!}%1?
    # [x0 ... xN] L [op0 ... op{L-1}] idxFalse
    # If idxFalse is -1 then all the ops are ok, and we put a false to exit the loop
    # Otherwise one op failed, so we leave the array of ops, which is non-false, to be popped by the do.
    )!{0}*
}do
# [x0 ... xN] L [op0 ... op{L-1}]
\@)\,@%@=~
# op{(len(Xs)-1)%L} (Xs[-1])

मेरा मूल जमाव 88 वर्णों पर निम्नलिखित था:

~]:x;2.{;).(2base(;{[{--}{@*\.!+/}]=}%[x.(;2$]zip\,<{~++}%x,.@[*x\]zip<{~~}%)\x(;=!}do\;

हालांकि, यह प्रत्येक की पहली घटना से संचालन की गणना करने की कोशिश करता है, इसलिए यदि ऑपरेशन गुणा या भाग है और तर्क पहली बार गोल है तो यह टूट जाता है।


1
स्पष्टीकरण पोस्ट करने के लिए आपका बहुत-बहुत धन्यवाद! मैं विच्छेदित गोल्फस्क्रिप्ट कार्यक्रमों की तलाश में हूं ताकि मैं उनमें से अधिक समझ बनाने की कोशिश कर सकूं।
मिगिमारू

6

हास्केल, 276 261 259 257 243 वर्ण

यहाँ मेरा अकुशल समाधान है। यह अनबाउंड (और बाउंडेड) पूर्णांकों पर काम करता है। यह समाधान गैर-सटीक विभाजन (जैसे:) के साथ सही ढंग से काम करने के लिए होता है 5 / 2 = 2

import Control.Monad
main=interact$show.n.q read.words
f=flip
q=map
_%0=0
x%y=div x y
s b=[1..]>>=q cycle.(f replicateM$[(+),(*),(%)]>>=f q[-b..b].f)
m l x s=[y!!l|y<-[scanl(f($))(x!!0)s],x==take l y]
n x=(s(maximum$q abs x)>>=m(length x)x)!!0

यह कैसे काम करता है: मैं (संभव) संचालन के हर संभव अनुक्रम का निर्माण करता हूं। फिर मैं संख्याओं के इनपुट अनुक्रम के खिलाफ परीक्षण करता हूं कि यह देखने के लिए कि उत्पन्न अनुक्रम इनपुट बनाएगा या नहीं। यदि ऐसा होता है, तो अनुक्रम में अगला नंबर लौटाएं। कोड हमेशा एक जवाब लौटाएगा जो ऑपरेशन के सबसे कम अनुक्रम से प्राप्त होता है। ऐसा इसलिए होता है क्योंकि ऑपरेशन अनुक्रम की सूची उसी क्रम में उत्पन्न होती है। यह संबंधों के बीच निर्णय लेने पर मनमाना (लेकिन सुसंगत) है। उदाहरण के लिए कोड रिटर्न 6या 8अनुक्रम के लिए 2 4

Ungolfed:

import Control.Monad

main :: IO ()
main = print . next . map read . words =<< getLine

opSequences :: Integral a => a -> [[a -> a]]
opSequences bound = [1 ..] >>= map cycle . (`replicateM` (ops >>= (`map` args) . flip))
  where
    ops = [(+), (*), \x y -> if y == 0 then 0 else div x y]
    args = [-bound .. bound]

match :: (MonadPlus m, Integral a) => [a] -> [a -> a] -> m a
match ns opSeq = guard (ns == take len ms) >> return (ms !! len)
  where
    n0 = ns !! 0
    len = length ns
    ms = scanl (flip ($)) n0 opSeq

next :: Integral a => [a] -> a
next ns = (opSequences bound >>= match ns) !! 0
  where
    bound = maximum $ map abs ns

गैर-सटीक विभाजन को कैसे संभालना है, इसके लिए अच्छा विचार है।
पीटर टेलर

यह एक आकस्मिक दुष्परिणाम था। इस समस्या को हल करने के तरीके के बारे में एक समाधान के लिए खोज सिर्फ मेरा प्रारंभिक विचार था, मेरे लिए, यह उत्तर की गणना करने की तुलना में एक सरल कार्य की तरह लगा।
थॉमस एडिंग

है Control.Monad -> Monadसंभव? और कैसे के बारे मेंinteract$show.n.q read.words
FUZxxl

6

पायथन, 333 366 ... 315 303 278 269 261 246 चरस

n=map(float,raw_input().split())
y=len(n)-1
l=1
def O(f):
 p,q=n[f:y:l],n[f+1::l]
 for a,b in zip(p,q):
    for x in((b-a).__add__,(b/(a or 1)).__mul__):
     if map(x,p)==q:return x
while 1:
 if all(map(O,range(l))):print int(O(y%l)(n[y]));break
 l+=1

पहले जोड़े की संख्या के साथ संचालन बनाता है और इसे अन्य जोड़ों पर जांचता है। सभी ऑपरेशनों को संग्रहीत करता है, और यदि वे सभी सफल होते हैं, तो अंतिम तत्व सूची में उपयुक्त संचालन लागू करता है।

संपादित: बुराई परीक्षण पास करता है :-) अब सभी पदों पर संचालन के लिए खोज करें।


अच्छा लगा। मेरे सभी परीक्षणों को पारित करता है, लेकिन पीटर टेलर की विशेष रूप से बुराई नहीं है:0 0 1 2 3 6 7 14
गैरेथ

0 0 0 0 1 0 0 0 0 1आउटपुट नहीं करता है 0
थॉमस एडिंग

@trinithis यह इनपुट युक्ति के अनुरूप नहीं है। संचालन का क्रम कम से कम एक बार पूरी तरह से दोहराना होगा।
गैरेथ

1
ऊह, यहाँ एक मजेदार सुधार है: lambda x:x+b-a-> (b-a).__add__। बहुत बुरा यह केवल एक चरित्र है, मैं इन करके अजगर के बारे में बहुत कुछ सीख रहा हूं।
क्लूलेस

1
lस्पष्ट रूप से वैश्विक बनाने से बहुत बचत होती है: pastie.org/2416407
क्लूलेस

4

पायथन, 309 305 295 279 चार्ट

मूल परीक्षण के सभी मामलों को संभालता है, साथ ही पीटर टेलर का भी हाल चाल 0 0 1 2 3 6 7 14:

l=map(int,raw_input().split())
i=v=0
while v<1:
 v=i=i+1
 for j in range(i):
    p=zip(l[j::i],l[j+1::i])
    d,r=set(q[1]-q[0]for q in p),set(q[1]*1./(q[0]or 1)for q in p if any(q))
    m,n=len(d)<2,len(r)<2
    v*=m+n
    if(len(l)-1)%i==j:s=l[-1]+d.pop()if m else int(l[-1]*r.pop())
print s

डिबगिंग आउटपुट के साथ अनगॉल्फ़्ड (शुद्धता की पुष्टि करने में बहुत सहायक):

nums = map(int,raw_input().split())
result = None

for i in range(1,len(nums)/2+1):
    print "-- %s --" % i
    valid = 1
    for j in range(i):
        pairs = zip(nums[j::i], nums[j+1::i])
        print pairs

        diffs = [pair[1] - pair[0] for pair in pairs]
        # this is the tough bit: (3, 6) -> 2, (0, 5) -> 5, (5, 0) -> 0, (0, 0) ignored
        ratios = [float(pair[1])/(pair[0] or 1) for pair in pairs if pair[0] != 0 or pair[1] != 0]

        if len(set(diffs))==1:
            print "  can be diff", diffs[0]
            if (len(nums) - 1) % i == j:
                result = nums[-1] + diffs.pop()
        elif len(set(ratios))==1:
            print "  can be ratio", ratios[0]
            if (len(nums) - 1) % i == j:
                result = int(nums[-1]*ratios.pop())
        else:
            print "** invalid period **"
            valid=0
    if valid and result is not None:
        break

print result

उपयोग:

echo 0 0 1 2 3 6 7 14 | python whatcomesnext.py

मैंने उत्थान किया है, हालांकि कड़ाई से बात करने के लिए इनपुट को तर्कों के बजाय कमांड तर्कों के माध्यम से होना चाहिए।
गैरेथ

यह वास्तव में मुझे चार वर्णों द्वारा कार्यक्रम को छोटा करने देता है :)
क्लूलेस

कुछ वर्ण, i = v = 0 और जबकि v == 0:
Ante

@ धन्यवाद, मैंने सोचा कि आप ऐसा नहीं कर सकते क्योंकि अजगर में असाइनमेंट एक अभिव्यक्ति नहीं है, लेकिन यह गोल्फिंग के लिए एक सहायक टिडबिट है। दूसरे स्तर के इंडेंटेशन के रूप में शाब्दिक टैब भी मदद करता है।
क्लूलेस

मैं पायथनर नहीं हूं, लेकिन आप कुछ अभिव्यक्तियों में पूर्णांक के रूप में बूलियन का उपयोग कर रहे हैं, और फिर भी टेस्ट में पूर्णांक के रूप में पूर्णांक v का उपयोग नहीं कर सकते। क्या वह सही है? यदि हां, तो निश्चित v<1रूप से एक गार्ड के रूप में काम करता है।
पीटर टेलर

3

रूबी 1.9 (437) (521) (447) (477)

"बुराई" सहित सभी परीक्षण मामलों के लिए काम करता है। मैं इसे बाद में गोल्फ करूंगा।

संपादित करें: मुझे एहसास हुआ कि एक और मामला है जिसे मैं ठीक से नहीं संभाल रहा था - जब निरंतरता को "रहस्य" ऑपरेशन का उपयोग करने की आवश्यकता होती है। क्रम2 0 0 -2 -4 -6 शुरू में -12 के बजाय 0 लौट रहा था। मैंने अब वह तय कर दिया है।

संपादित करें: एक जोड़े को और अधिक बढ़त के मामले तय किए और कोड को 447 तक घटा दिया।

संपादित करें: Ugh। अन्य "बुराई" दृश्यों को संभालने के लिए कुछ कोड जोड़ना पड़ा जैसे0 0 0 6 18 6 12

def v(c,q);t=*q[0];q.size.times{|i|f=c[z=i%k=c.size]
f=c[z]=(g=q[z+k])==0??_:((h=q[z+k+1])%g==0?"*(#{h/g})":"/(#{g/h})")if f==?_
t<<=f==?_?(a=q[i];b=q[i+1].nil?? 0:q[i+1];(a==0&&b==0)||(a!=0&&(b%a==0||a%b==0))?b:0):eval(t.last.to_s+f)}
*r,s=t
(p s;exit)if q==r
end
s=gets.split.map &:to_i
n=[[]]
((s.size-1)/2).times{|i|a,b=s[i,2]
j=["+(#{b-a})"]
j<<=?_ if a==0&&b==0
j<<="*#{b/a}"if a!=0&&b%a==0
j<<="/#{a/b}"if a*b!=0&&a%b==0
n=n.product(j).map(&:flatten)
n.map{|m|v(m*1,s)}}

1

स्काला

यह वह उपाय है जो मैं लेकर आया हूं:

object Z extends App{var i=readLine.split(" ").map(_.toInt)
var s=i.size
var(o,v,f)=(new Array[Int](s),new Array[Double](s),1)
def d(p:Int,j:Array[Int]):Unit={if(p<=s/2){def t(){var a=new Array[Int](s+1)
a(0)=i(0)
for(l<-0 to s-1){o(l%(p+1))match{case 0=>a(l+1)=a(l)+v(l%(p+1)).toInt
case _=>a(l+1)=(a(l).toDouble*v(l%(p+1))).toInt}}
if(a.init.deep==i.deep&&f>0){f^=f
println(a.last)}}
o(p)=0 
v(p)=j(1)-j(0)
t
d(p+1,j.tail)
o(p)=1
v(p)=j(1).toDouble/j(0).toDouble
t
d(p+1,j.tail)}}
d(0,i)
i=i.tail
d(0,i)}

Ungolfed:

object Sequence extends App
{
    var input=readLine.split(" ").map(_.toInt)
    var s=input.size
    var (ops,vals,flag)=(new Array[Int](s),new Array[Double](s),1)
    def doSeq(place:Int,ints:Array[Int]):Unit=
    {
        if(place<=s/2) 
        {
            def trysolution()
            {
                var a=new Array[Int](s+1)
                a(0)=input(0)
                for(loop<-0 to s-1)
                {
                    ops(loop%(place+1))match
                    {
                        case 0=>a(loop+1)=a(loop)+vals(loop%(place+1)).toInt
                        case _=>a(loop+1)=(a(loop).toDouble*vals(loop%(place+1))).toInt
                    }
                }
                if(a.init.deep==input.deep&&flag>0)
                {
                    flag^=flag
                    println(a.last)
                }
            }
            ops(place)=0
            vals(place)=ints(1)-ints(0)
            trysolution
            doSeq(place+1,ints.tail)
            ops(place)=1
            vals(place)=ints(1).toDouble/ints(0).toDouble
            trysolution
            doSeq(place+1,ints.tail)
        }
    }
    doSeq(0,input)
    input=input.tail
    doSeq(0,input)
}

मैं इसे कैसे लागू करूं? echo "0 0 1 2 3 6 7 14" | scala Sequenceस्क्रीन को काला रखता है।
उपयोगकर्ता अज्ञात

@user अज्ञात है scala Sequenceऔर फिर अनुक्रम दर्ज करें और एंटर दबाएं।
गारेथ

आह, आपने प्रश्न टिप्पणी में लिखा है, कि आप इस विशिष्ट को हल नहीं करते हैं - यह गूंज के साथ काम करता है - हल करने योग्य प्रश्नों के लिए ऊपर के रूप में।
उपयोगकर्ता अज्ञात

1

स्काला 936

type O=Option[(Char,Int)]
type Q=(O,O)
type L=List[Q]
val N=None
def t(a:Int,b:Int):Q=if(a>b)(Some('-',a-b),(if(b!=0&&b*(a/b)==a)Some('/',a/b)else N))else
(Some('+',b-a),(if(a!=0&&a*(b/a)==b)Some('*',b/a)else N))
def w(a:Q,b:Q)=if(a._1==b._1&&a._2==b._2)a else
if(a._1==b._1)(a._1,N)else
if(a._2==b._2)(N,a._2)else(N,N)
def n(l:L):Q=l match{case Nil=>(N,N)
case x::Nil=>x
case x::y::Nil=>w(x,y)
case x::y::xs=>n(w(x,y)::xs)} 
def z(l:L,w:Int)=for(d<-1 to w)yield
n(l.drop(d-1).sliding(1,w).flatten.toList)
def h(s:L):Boolean=s.isEmpty||(s(0)!=(N,N))&& h(s.tail)
def j(s:L,i:Int=1):Int=if(h(z(s,i).toList))i else j(s,i+1)
def k(b:Int,o:Char,p:Int)=o match{case'+'=>b+p
case'-'=>b-p
case'*'=>b*p
case _=>b/p}
val e=getLine 
val i=e.split(" ").map(_.toInt).toList
val s=i.sliding(2,1).toList.map(l=>t(l(0),l(1)))
val H=n(s.drop(s.size%j(s)).sliding(1,j(s)).flatten.toList)
val c=H._1.getOrElse(H._2.get)
println (k(i(i.size-1),c._1,c._2))

ungolfed:

type O = Option[(Char, Int)]

def stepalize (a: Int, b: Int): (O, O) = (a > b) match {
   case true => (Some('-', a-b), (if (b!=0 && b * (a/b) == a) Some ('/', a/b) else None)) 
   case false=> (Some('+', b-a), (if (a!=0 && a * (b/a) == b) Some ('*', b/a) else None)) }

def same (a: (O, O), b: (O, O)) = {
  if (a._1 == b._1 && a._2 == b._2) a else
  if (a._1 == b._1) (a._1, None) else 
  if (a._2 == b._2) (None, a._2) else 
  (None, None)}

def intersection (lc: List[(O, O)]): (O, O) = lc match {
  case Nil => (None, None)
  case x :: Nil => x
  case x :: y :: Nil => same (x, y)
  case x :: y :: xs  => intersection (same (x, y) :: xs)} 

def seriallen (lc: List[(O, O)], w: Int= 1) =
  for (d <- 1 to w) yield 
    intersection (lc.drop (d-1).sliding (1, w).flatten.toList)

def hit (s: List[(O, O)]) : Boolean = s match {
  case Nil => true 
  case x :: xs => (x != (None, None)) && hit (xs)}

def idxHit (s: List[(O, O)], idx: Int = 1) : Int =
  if (hit (seriallen (s, idx).toList)) idx else 
    idxHit (s, idx+1)

def calc (base: Int, op: Char, param: Int) = op match {
  case '+' => base + param
  case '-' => base - param
  case '*' => base * param
  case _   => base / param}

def getOp (e: String) = {
  val i = e.split (" ").map (_.toInt).toList
  val s = i.sliding (2, 1).toList.map (l => stepalize (l(0), l(1)))
  val w = idxHit (s)
  val hit = intersection (s.drop (s.size % w).sliding (1, w).flatten.toList)
  val ci = hit._1.getOrElse (hit._2.get)
  val base = i(i.size - 1)
  println ("i: " + i + " w: " + w + " ci:" + ci + " " + calc (base, ci._1, ci._2))
}

val a="1 3 5 7 9 11"
val b="1 3 2 4 3 5 4 6 5 7 6"
val c="2 6 7 3 9 10 6 18 19 15 45 46"
val d="1024 512 256 128 64 32 16"
val e="1 3 9 8 24 72 71 213 639"
val f="1 2 3 4 5 2 3 4 5 6 3 4 5 6 7"
val g="1 2 4 1 3 9 5 8 32 27 28 56 53 55 165 161 164 656 651 652 1304"
val h="0 0 1 2 3 6 7 14"
val i="0 0 0 0 1 0 0 0 0 1 0"

List (a, b, c, d, e, f, g, h, i).map (getOp)

पीटर टेलर पर बुरी तरह से विफल रहता है h, लेकिन मुझे समय की उचित मात्रा में कार्यक्रम को ठीक करने की संभावना नहीं दिखती है।


यदि आप के -विशेष मामले के रूप में +और के विशेष मामले के रूप में इलाज किया जाता है तो क्या इसे सिकोड़ने में मदद मिलेगी ? पीटर टेलर के (और इसी तरह) इनपुट को पारित करने का मेरा तरीका अनुक्रम में पहले नंबर को काट देना था और फिर से प्रयास करना था। मेरे पास यह देखने का समय नहीं है कि आपका कार्यक्रम कैसे काम करता है, यह जानने के लिए कि क्या यह आपकी मदद करेगा। /*
गारेथ

मुझे लगता है कि यह मदद करेगा, लेकिन केवल उस विशेष मामले के लिए। एक श्रृंखला जिसमें बाद में नल-गुणा शामिल है, जैसे -1, 0, 0, 1, 2, 3, 6, 7, 14एक अलग उपचार की आवश्यकता होगी।
उपयोगकर्ता अज्ञात
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.