다음은 무엇입니까?


15

공백으로 구분 된 정수 목록이 제공되면 시퀀스에서 다음 정수를 찾는 것입니다. 시퀀스의 각 정수 번의 수학적 조작 (적용한 결과이며 +, -, *또는 /이전의 정수), 각 시퀀스는 동작들의 가변 개수 (하지만 이상 10)로 구성된다. 시퀀스는 정수 시퀀스 길이의 절반보다 길지 않으므로 확인을 위해 각 시퀀스 시퀀스가 ​​두 번 이상 나타납니다.
입력 은 stdin (또는 promptJavaScript 솔루션)을 통해 이루어집니다.

다음은 몇 가지 설명 예입니다.

입력:

1 3 5 7 9 11

산출:

13

상당히 쉬워요. 모든 값은 이전 값 +2입니다.

입력:

1 3 2 4 3 5 4 6 5 7 6

출력 :

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

나는 며칠 안에 게시 할 ungolfed Scala 솔루션 (42 줄)을 가지고 있습니다.

이것은 코드 골프입니다-가장 짧은 답변이 이깁니다.


구분이 정확합니까?
피터 테일러

@ 피터 예. 모든 단계는 정수가됩니다.
Gareth

그러나 단계가 "/ 3"인 경우 나머지가 항상 0임을 보장합니까?
피터 테일러

@ 피터 예, 나머지는 항상 0입니다.
Gareth

답변:


12

Golfscript, 203 개 138 문자

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

이것은 if표준 Golfscript 프로그램보다 훨씬 더 많은 것을 사용 하며, 그 작업은 매우 까다 롭습니다. 따라서 주석이 있습니다 (그러나 공백과 주석을 추가하는 것 외에는 골치 아프지 않습니다).

~]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\;

그러나 이것은 각각의 첫 번째 발생에서 연산을 계산하려고하므로 연산이 곱셈 또는 나눗셈이고 첫 번째 시간 인수가 0이면 중단됩니다.


1
설명을 게시 해 주셔서 감사합니다! 해부 된 Golfscript 프로그램을 찾고 있었으므로 더 이해하려고 노력했습니다.
migimaru

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.

언 골프 드 :

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
습니까

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

첫 번째 숫자 쌍으로 연산을 작성하고 다른 쌍에서 확인하십시오. 모든 작업을 저장하고 모두 성공하면 list last element에 적절한 작업을 적용합니다.

편집 : 악의 시험을 통과 :-) 이제 모든 위치에서 작업을 검색합니다.


좋은. 피터 테일러의 악한 테스트는 모두 통과하지 못했습니다.0 0 1 2 3 6 7 14
Gareth

0 0 0 0 1 0 0 0 0 1출력하지 않습니다 0.
Thomas Eding

@trinithis 입력이 사양에 맞지 않습니다. 작업 순서는 한 번 이상 완전히 반복되어야합니다.
가레스

1
우오, 여기에 재미있는 개선이 있습니다 : lambda x:x+b-a-> (b-a).__add__. 너무 나쁜 것은 하나의 캐릭터 일뿐입니다.이 작업을 통해 파이썬에 대해 많이 배우고 있습니다.
우 둔

1
l암묵적으로 글로벌하게 만드는 것은 많은 것을 절약합니다 : pastie.org/2416407
Clueless

4

파이썬, 309 개 305 295 279 문자

Peter Taylor의 끔찍한 사건뿐만 아니라 모든 원래 테스트 사례를 처리합니다 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

엄격하게 말해서 입력은 명령 인수가 아닌 stdin을 통해 이루어져야한다고 생각했습니다.
Gareth

실제로 프로그램을 4 자로 단축 할 수 있습니다 :)
Clueless

몇 문자, i = v = 0 및 v == 0 :
Ante

@Ante 고마워, 할당이 표현이 아니기 때문에 파이썬에서 그렇게 할 수 없다고 생각했지만 골프를 치는 데 도움이됩니다. 두 번째 수준 들여 쓰기와 같은 리터럴 탭도 도움이됩니다.
우 둔

나는 Pythoner가 아니지만 일부 표현식에서 부울을 정수로 사용하는 것처럼 보이지만 while 테스트에서 정수 v를 부울로 사용할 수는 없습니다. 맞습니까? 그렇다면 반드시v<1 경비원으로 일하십시오.
피터 테일러

2

루비 1.9 (437) (521) (447) (477)

"사악한"사례를 포함한 모든 테스트 사례에서 작동합니다. 나중에 더 골프하겠습니다.

편집 : 계속 "미스터리"작업을 사용해야 할 때 제대로 처리하지 않은 경우가 있음을 깨달았습니다. 순서2 0 0 -2 -4 -6 는 처음에 -12 대신 0을 반환했습니다. 나는 이제 그것을 고쳤다.

편집 : 몇 가지 더 많은 경우를 수정하고 코드를 447로 줄였습니다.

편집 : 어. 다음과 같은 다른 "이블"시퀀스를 처리하는 코드를 추가해야했습니다.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)}

언 골프 드 :

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 unknown scala Sequence을 입력 한 후 순서를 입력하고 Enter를 누르십시오.
Gareth

아, 당신은 질문에 의견을 썼습니다, 당신은 해결할 수있는 질문에 대해 위와 같이 에코 파이프와 함께 작동합니다.
사용자가 알 수 없음

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

언 골프 :

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했지만, 적당한 시간 내에 프로그램을 치료할 가능성은 보이지 않습니다.


-특별한 경우 +와 특별한 경우로 취급하면 수축을 줄이는 데 도움 /*됩니까? Peter Taylor의 (그리고 유사한) 입력을 전달하는 내 방법은 순서에서 첫 번째 숫자를 잘라 내고 다시 시도하는 것이 었습니다. 나는 당신의 프로그램이 어떻게 그것이 당신에게 도움이되는지 알기 위해 아직 어떻게 작동하는지 살펴볼 시간이 없었습니다.
Gareth

나는 그것이 도움이 될 것이라고 생각하지만 그 특별한 경우에만 해당됩니다. 나중에 널 곱셈을 포함하는 시리즈 -1, 0, 0, 1, 2, 3, 6, 7, 14는 다른 치유가 필요합니다.
사용자 알 수 없음
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.