数字の合計1〜7


21

チャレンジ

N28以上の正の整数が指定された場合、N各桁171回だけ使用して合計する数値のリストを出力します。プログラムまたは関数として与えることができます。

数字を繰り返し使用せずに1回使用する限り、数字は単独で表示することも連結することもできます。たとえば、[12, 34, 56, 7]isは有効で、is [1, 27, 6, 4, 35]およびですが、orではあり[1234, 567]ません。番号がリストされている順序は重要ではありません。[123, 34567][3, 2, 1476]

N1〜7で作成できない場合は、何も返さないか出力します。

その他の情報

  • これはコードゴルフなので、10月15日木曜日までのバイト単位の最短コードが勝ちです。

  • コメントで質問をしてください。

  • チャレンジで指定していないことはすべてあなた次第です。

  • 標準の抜け穴は許可されていません。

これらにより、混乱が解消される場合があります。

入力

28

出力

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

入力

100

出力

[56, 7, 4, 31, 2]

入力

1234567

出力

[1234567]

入力

29

出力

何も、29は無効です。

入力

1891

出力

[1234, 657]

入力

370

出力

[15, 342, 7, 6]

必要に応じてさらに作成します。

ここだこれらの7つの数字、FryAmTheEggmanの礼儀で作成可能数の全てのペーストビンが。


出力は29何ですか?
Geobits

4
出力を何もしたくない場合は(N/A)、出力として入れないでください。
mbomb007

1
[1234566, 1]6が繰り返されるため、@ LukStorms は有効な出力ではありません。出力で数字を繰り返すことはできません。
The_Basset_Hound

2
たぶん»... 10進数の1から7までの数字のリストで、合計でN«は現在の質問よりも明確な表現です。
パエロエベルマン

3
わずかに少ない強引なソリューションの場合:これは、それぞれのパワーの-10係数割り当てと同等である1, ..,, 7ので、多くのような少なくともがあること1「との10多くのような少なくとも、S」10「とS 100S」などを。
xnor

回答:


9

Pyth、18 14バイト

hfqSjkTjkS7./Q

@isaacgに2バイトのゴルフをしてもらい、さらに2バイトの道を開いてくれてありがとう。

出力が生成されない場合、コードはクラッシュし、出力は生成されません。

これは、十分な忍耐力がある場合は小さな入力に対して、十分な時間とメモリが与えられている場合は大きな入力に対して機能します。

コードが意図したとおりに機能することを確認7する3は、数字の合計1〜3をに置き換えます。クリックここでテストスイートのために。

実行例

$ time pyth/pyth.py -c 'hfqSjkTjkS7./Q' <<< 28
(1, 2, 3, 4, 5, 6, 7)

real    4m34.634s
user    4m34.751s
sys     0m0.101s
$ time pyth/pyth.py -c 'hfqSjkTjkS7./Q' <<< 29 2>/dev/null

real    9m5.819s
user    9m6.069s
sys     0m0.093s

使い方

           ./Q    Compute all integer partitions of the input.
 f                Filter the integer partitions:
    jkT             Join the integers with empty separator.
   S                Sort the characters of the resulting string.
      jkS7          Join [1, ..., 7] with empty separator.
  q                 Check both results for equality.
                  Keep the partition of `q' returned True.
h                 Retrieve the first element of the filtered list.
                  For a non-empty list, this retrieves the solution.
                  For the empty list, it causes an error and produces no output.

2
よくやった!非常に革新的なアプローチ。`` `MS7``はより短いですr\1\8。また@ .. 0、と同じhです。
isaacg

@isaacgありがとう!どうやって見逃したのかわかりませんhが、あなたがSそのように使えるとは思いませんでした。(オンラインインタープリターのchar参照では言及されていません。)jkS7私はsもう必要ないので、さらに短いようです。
デニス

5

Python 3、109

def f(n,s=set('1234567'),l='0,'):[f(n,s-{x},l+x+c)for c in(',','')for x in s]or n-sum(eval(l))or~print(l[2:])

数字を受け取り、タプルを出力する関数など123,4567,。はい、これは有効なタプルです。

考えは、コンマで区切られた2つのコンマがない連続し43,126,7,5,た数字1を持つようなすべての可能な文字列を生成すること7です。この式をタプルとして評価し、その合計が等しい場合n、それを出力し、エラーで終了します。

そのようなすべての文字列を構築sするために、使用する文字セットを追跡し、各文字をコンマで追加して、数字をエントリの末尾にするか、または入力せずに、将来の数字が連結します。

短絡をチェックするために使用されているsリスト-COMPが空であるため空で、そのn==sum(eval(l))我々が印刷された場合には、l服用により、エラーで終了~None印刷して返された(このためSP3000のおかげで。)。

Python 3.5では、書くことで2つの文字を節約できるとs={*'1234567'}思います(Sp3000に感謝します)。

チャーを食べてしまう小さな迷惑があります。1つは、カンマがないlように見える場合1234567、単一の数値として解析され、呼び出しsumがエラーになることです。これはl、要素から開始し、0印刷時にそれを取り除くというハックで処理されます。これには6文字かかります。

Python 3ではこのタプルを裸にすることが許可されていないためc、カンマと空の文字列を反復処理するのは面倒for c in(',','')です。私はいくつかの文字があるようにしたいと思い?やって数字では無視される',?'4文字より少ないため、このような文字があるようには思えません。


古い方法:

Python 2、117

def f(n,s={1,2,3,4,5,6,7},l=[],p=0):
 if{n,p}|s=={0}:print l;1/0
 if p:f(n-p,s,l+[p])
 for x in s:f(n,s-{x},l,p*10+x)

数値を取得してリストを出力する関数を定義します。

アイデアは、再帰を使用してすべてのブランチを試すことです。変数の追跡は

  • n必要な残りの金額
  • s使用する残りの数字のセット
  • lこれまでに作成された数字のリスト
  • 現在の部分的に形成された番号 p

n==0およびsが空の場合、lエラーで印刷して終了します。

現在の部分的に形成された数値pがゼロ以外の場合、リストに追加して残りの合計から削除してみてください。

xfromを使用できる各桁についてs、に追加してpから削除してみてくださいs


4

Pyth、23

#iRThfqQsiR10Ts./M.pS7q

素朴なブルートフォースは、オンラインでは遅すぎるため、コンピューターで約1分かかります。結果のフィルター処理された組み合わせのリストにアクセスすると、などの不可能な数値のエラーが発生する、一般的な「例外まで永遠にループする」ピスゴルフのパターンを使用します29

pythonicリストのような出力、例えば

1891
[1234, 657]
100
[1, 2, 34, 56, 7]
370
[12, 345, 6, 7]

これは、この方法で作成できる10136個の番号すべての貼り付けです。


例としてpastebinリンクを使用できますか?
-The_Basset_Hound

@The_Basset_Houndもちろん、どうぞ。
-FryAmTheEggman

3

Pythonの2.7、178の 172 169バイト

n=input()
for i in range(8**7):
 for j in len(set('%o0'%i))/8*range(128):
    s=''
    for c in'%o'%i:s+='+'[:j%2*len(s)]+c;j/=2
    if eval(s)==n:print map(int,s.split('+'));1/0

最後の3行はタブでインデントされることになっていますが、このエディターでどのようにインデントするかわかりません。

編集:Sp3000の助けを借りてネストの1つのレイヤーを平坦化


SEは残念ながらタブを削除するため、インデントする方法を言うだけで
十分

ああ大丈夫、まだこのサイトの周りの私の道を考えています。
xsot

3

JavaScript(ES6)、165 196

編集少し短くしました。を使用して短くすることができますがeval、高速であることが好きです

ブルートフォース、Pithバージョンよりも恥ずかしいほど長いが、速い。EcmaScript 6準拠のブラウザーで以下のスニペットを実行してテストします。

f=z=>{for(r=i=1e6;r&&++i<8e6;)for(m=/(.).*\1|[089]/.test(w=i+'')?0:64;r&&m--;t.split`+`.map(v=>r-=v,r=z))for(t=w[j=0],l=1;d=w[++j];l+=l)t+=l&m?'+'+d:d;return r?'':t}

function test() { O.innerHTML=f(+I.value) }

test()

// Less golfed

f=z=>{
  for(r=i=1e6; r&&++i<8e6;)
    for(m=/(.).*\1|[089]/.test(w=i+'')?0:64; r&&m--; t.split`+`.map(v=>r-=v,r=z))
      for(t=w[j=0],l=1;d=w[++j];l+=l)
        t+=l&m?'+'+d:d;
  return r?'':t
}
<input id=I value=28><button onclick=test()>-></button><span id=O></span>


言語のために長くなるのは恥ではありません、あなたのJSの答えを本当に楽しんでいます、+ 1
FryAmTheEggman

1

Python 2、270 268バイト

from itertools import*;P=permutations
x,d,f=range(1,8),[],input()
r=sum([[int(''.join(str(n)for n in i))for i in list(P(x,j))]for j in x],[])
z=1
while z:
 t=sum([[list(j)for j in P(r,z)]for i in x],[])
 v=filter(lambda i:sum(i)==f,t)
 if v:print v[0];break
 else:z+=1

まだゴルフに取り組んでいます。

一致が見つかるまでループします。


import asめったに必要ない-あなたができるfrom itertools import*;P=permutations
-Sp3000

map(str,i)リスト内包表記よりも使用する方が短く、ネストされたリストを平坦化するよりも、リストrを直接構築できますr=[int(''.join(map(str,i)))for j in x for i in P(x,j)]
ルースフランクリン

`n`代わりにを使用できます。最大整数を超えることはないstr(n)からnです。
mbomb007

1

Haskell(145バイト)

main=getLine>>=print.head.f[1..7].read
f[]0=[[]]
f b s=[n:j|(n,g)<-m b,j<-f g$s-n]
m b=[(d+10*z,g)|d<-b,(z,g)<-(0,filter(/=d)b):m(filter(/=d)b)]

再帰を使用します。

Ungolfed(337バイト):

delete d = filter (/= d)
main = getLine >>= print . (`form` [1..7]) . read

form s [] | s == 0    = [[]]
form s ds | s <= 0    = []
form s ds | otherwise = [n:ns | (n, ds') <- makeNumbers ds, ns <- form (s-n) ds']

makeNumbers [] = []
makeNumbers ds  = [(d + 10 * n',ds') | d <- ds, (n',ds') <- (0,delete d ds):makeNumbers (delete d ds)]

0

Scala、195バイト

これは最も効率的ではなく、29の出力を取得するのに15分以上かかりましたが、動作します

def g(s: Seq[Int]): Iterator[Seq[Int]]=s.combinations(2).map(c=>g(c.mkString.toInt +: s.filterNot(c.contains))).flatten ++ Seq(s)
def f(i: Int)=(1 to 7).permutations.map(g).flatten.find(_.sum==i)

ここにいくつかの出力があります

scala> f(100)
res2: Option[Seq[Int]] = Some(Vector(46, 35, 12, 7))

scala> f(1891)
res3: Option[Seq[Int]] = Some(Vector(567, 1324))

scala> f(370)
res4: Option[Seq[Int]] = Some(Vector(345, 12, 6, 7))

scala> f(29)
res5: Option[Seq[Int]] = None

0

Ruby、105バイト

強引な!1〜7654321の整数の0〜7の長さのすべてのサブセットをチェックし、それらのいずれかが基準に一致するかどうかを確認します。おそらく、これが終了するのを待ちたくないでしょう。

->n{8.times{|i|[*1..7654321].permutation(i){|x|return x if
x.join.chars.sort==[*?1..?7]&&eval(x*?+)==n}}}

アルゴリズムを実行して検証7654321するために、答えに含まれるとわかっている最大数に置き換えることにより、検索スペースを絞り込むことができます。たとえば、n = 100の場合は56、n = 1891の場合は1234です。後者の試用版は次のとおりです。

$ ruby -e "p ->n{8.times{|i|[*1..1234].permutation(i){|x|return x if x.join.chars.sort==[*?1..?7]&&eval(x*?+)==n}}}[gets.to_i]" <<< 1891
[657, 1234]

0から7整数?次の7つの整数を使用する必要があります:1,2,3,4,5,6,7
edc65

@ edc65あなたは正確に7 桁を意味します。結果は整数のセットであり、セットのサイズは入力に依存します。
daniero

私はRubyを話せません。プログラムは動作すると思いますが、説明は得られません。整数が1234567より小さい場合、7654321はどのように得られますか?
edc65

@ edc65そのとおりです。その番号を変更する必要があります。私もそれをより良く説明しようとします。
daniero
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.