キュレーターのジレンマ


9

前書き

あなたは、美術館のキュレーターの友人です。美術館のキュレーターは、最近4人のアーティストから現代美術を手に入れることに喜びを感じています(そのうちの何人かは、キュレーターに芸術作品がないこともあります)。これはモダンアートであるため、アーティストの作品はすべてまったく同じに見えます。あなたの友達は、コンピュータを使用して、これらのピースをどの順序で配置するかを決定したいと考えています。

プログラムの要件

プログラムは5つの整数を受け取る必要があります(関数に渡されるか、stdinを介して入力されます(または何らかの方法で))。最初の4つは、4人のアーティストのそれぞれが提供した絵画の数です。最後の値は順列インデックスですi(0ではなく1から数えます)。キュレーターiは、絵画の辞書式順序による順列を見たいと考えています。

プログラムは、この順列を適切な形式で出力する必要があります。例:abbccdまたは[0 1 1 2 2 3]。合計で10枚に満たない入力の実行時間は1時間未満でなければなりません(これは問題ないはずです)。

組み込み関数を使用して順列を計算することはできません

入力:0 1 2 0 2

アーティストBの絵が1つ、アーティストCの絵が2つある(そしてそれらはすべて同じに見える)とすると、辞書式順序の順列は次のようになります。

['bcc'、 ' cbc '、 'ccb']

強調表示された順列は、辞書式順序の2番目であるため、正しい出力になります。

入力:1 2 0 1 5

['abbd'、 'abdb'、 'adbb'、 'babd'、 ' badb '、 'bbad'、 'bbda'、 'bdab'、 'bdba'、 'dabb'、 'dbab'、 'dbba']

テスト中

正しいはずのテストをいくつか示します。

1 2 4 1 5    - ABBDCCCC
2 2 3 1 86   - ABBCACDC
4 1 2 0 24   - AACACBA
1 4 3 2 65   - ABBCBBDCDC

入力と出力をランダムに生成するPython3の短いコードがここにあります(入力には無効です。これは、置換のPythonインポートを使用します):

from itertools import permutations
from random import randint
a,b,c,d,n = randint(1,2),randint(1,2),randint(1,3),randint(1,3),randint(1,15)
print(str(a) + " " + str(b) + " " + str(c) + " " + str(d) + " " + str(n) + " - " + str(sorted(set([''.join(p) for p in permutations(a * "a" + b * "b" + c * "c" + d * "d")]))[n-1]))

スコアボード

Optimizer - CJam       - 39  - Confirmed - Bruteforce
EDC65     - JavaScript - 120 - Confirmed - Bruteforce
Jakube    - Python2    - 175 - Confirmed - Algorithmic

1
「すべてのピースがまったく同じに見える」と言います。「あるアーティストの作品はすべてまったく同じに見えますが、異なるアーティストの作品は異なって見える」という意味ですか?
DavidC、2015年

これは有効なエントリではありませんが、それでも誰かにとっては便利かもしれません。{:A.a.{~97+[:I.}:有効なJであり、機能しますがA.、ほとんどの作業に使用しているため、無効です。この関数で置き換えA.て代用する関数を書くことができれば、有効な答えが得られます。
ɐɔıʇǝɥʇuʎs

@ɐɔıʇǝɥʇuʎs-"ABCD"を使用する必要はなく、任意の文字/数値/記号システムを使用できます。私はJがわからないので、正確な問題はわかりませんが、これが役立つことを願っています=)
Alexander Craggs

@PopeyGilbertまあ、数字アウトだけスピットがあろうとバージョンが{:A.[:I.}:...事はつまり、私はまだ考えていないA.、有効な次のようになります。jsoftware.com/help/dictionary/dacapdot.htmは
ɐɔıʇǝɥʇuʎs

必要な順列が存在しない場合はどうなりますか?1 0 0 0 100?
edc65、2015年

回答:


5

Python 2:175 163文字

これは深刻なゴルフの答えではありません。別のアルゴリズムで138バイトに達しました。これはブルートフォースを使用しないため、ここに投稿したかっただけです。複雑さはシータ(#pictures)です。

f=lambda x:0**x or x*f(x-1)
def g(Q,n):
 while sum(Q):
  for j in 0,1,2,3:
   p=f(sum(Q)-1)*Q[j]
   for k in Q:p/=f(k)
   if p<n:n-=p
   else:print j;Q[j]-=1;break

使用法:

g([1, 4, 3, 2], 65)

編集:

同じアルゴリズム、一部のゴルフ:階乗法をインポートせず、計算の順序にほとんど変更を加えないでください。

Pythの翻訳:61文字

Lu*GhHUb1WsPQV4J*@QNytsPQFZPQ=J/JyZ)I<JeQ XQ4-eQJ)EN XQNt@QNB

ここでは特別なことは何もありません。Pythonコードの正確な翻訳です。でも長すぎる。私はあまりにも醜い(長い)ものを使いすぎました。最初の9文字だけが階乗の定義です。

Lu*GhHUb1    def y(b): G=1; for H in range(b): G*= H+1; return G

また、次のようなものQ[j]-=1は長すぎます:XQNt@QN(Pythonよりも1文字多い!!!)

使用法:

ここで試してください:Pyth Compiler / Executor。デバッグモードを無効にし[2, 2, 3, 1, 86]、入力として使用します。


できます!最初のPythonソリューションの開発おめでとうございます!しかし、私は自分の環境from math import*では関数の外に移動する必要があることに気付きました。あなたをリーダーボードに追加します!
Alexander Craggs、2015年

うわー...あなたのソリューションは信じられないほど効率的です-32の絵のためにそれは0.034秒o.0だけかかります。
Alexander Craggs、2015年

3

CJam、50 43 39バイト

q~(])\{W):Wa*}%s:X{Xm*:s_&}X,(*{$X=},$=

これはたくさんゴルフすることができます。

STDINから次の形式で入力を受け取ります。

4 1 2 0 24

ペイントを出力します。たとえば、上記の入力の場合:

0020210

ここでオンラインでお試しください

オンラインコンパイラは、より大きな絵画サイズをあきらめることに注意してください。あなたはJavaバージョンでより大きな入力を試す必要があります


最初のソルバーになっておめでとうございます!確かに50バイトは打ちにくい値です。あなたをリーダーボードのトップに追加します!
Alexander Craggs、2015年

@PopeyGilbert回答を受け入れる前に少なくとも1週間ほど待つ必要があります
オプティマイザー

ああ、大丈夫、すみません!以前のチャレンジでは、誰かが暴力を受けたときに、受け入れられた答えを変更しました。私の悪い。
Alexander Craggs、2015年

1
@PopeyGilbertそれはあなたの非常に高貴なものであり(そして私はすべての挑戦者の作者がそうしたことを望みます)原則として、あなたがそうした場合、早期に受け入れることには何の問題もありません。おそらく、著者が受け入れられた回答を変更することを誰も期待していません)。
マーティンエンダー、2015年

私は個人的には、たとえそれが早期に行われたとしても、受け入れる前に選択する少なくとも2つの答えがあるべきだと思います。もちろん、1週間程度まで回答が1つしかない場合は、それを受け入れます。
オプティマイザ

3

JavaScriptの(ES6)120 138 147

必要な5つのパラメーターを持つ関数として、コンソールを介して出力します。
シンボル0、1、2、3を使用します。シンボルの合計を計算し、必要な桁数の4進数をすべて作成してチェックします。数字が間違っている数字は破棄されます。
注:JavaScript 32ビット整数では、これは最大15の絵画で機能します。

短く(.toStringを避けて)、ずっと速く(変更された終了条件)に編集します。1秒未満の各テストの時間。

Edit2アルゴリズムの変更はなく、さらにゴルフをした(読みやすくするためにインデントを追加)

F=(w,x,y,z,n)=>{
  for(a=0;n;n-=l=='0,0,0,0')
    for(l=[w,x,y,z],t=w+x+y+z,v='',b=a++;t--;b/=4)--l[d=b&3],v=d+v;
  console.log(v)
}

ゴルファーなし、FireFox不要

F=function(w,x,y,z,n) {
  for(a=0; n; a++) // exit when solution found (if wrong parameters, run forever)
  {
    l=[w,x,y,z]; // required number of each symbol
    t=w+x+y+z; // total of digits
    v=''; // init output string
    for(b=a;
      t--; // digit count down
      b >>= 2) // shift for next digit
    {
        d = b & 3; //get digit
        --l[d]; // decrement for the current digit
        v = d + v; // add to output string         
    }
    l[0]|l[1]|l[2]|l[3] // if digits ok
    ||--n // decrement counter
  }
  console.log(v) // when found, exit for and print the answer
}

FireBug / FireFoxコンソールでテストする

F(1, 2, 4, 1, 5) 
F(2, 2, 3, 1, 86)
F(4, 1, 2, 0, 24)
F(1, 4, 3, 2, 65)

出力

01132222
01120232
0020210
0112113232

こんにちは!実行に少し問題があります。FireFoxをダウンロードして、それが役立つかどうかを確認しています。あなたをリーダーボードに追加します!
Alexander Craggs、2015年

私はここでかなり良いテーブルを見つけまし -私はFirefoxが必要だと仮定します。テスト済みで動作します!リーダーボードを確認済みに変更しました。
Alexander Craggs、2015年

リーダーボードですが賛成投票はありません...あなたは本当にそれが好きではありません!:(
edc65、2015年

ああ!申し訳ありません=(それは今賛成です=)
Alexander

このアルゴリズムがCJamでどれくらいの期間続くのだろうか。しかし、今のところ、これがどのように機能するかはわかりません:P
オプティマイザ2015年

2

バース、20

@fqPQm/TdU4^U4sPQteQ

ここで試してください。

入力はPythonリスト形式です。例: [1, 2, 4, 1, 5]

出力もPythonリスト形式です([0, 1, 1, 3, 2, 2, 2, 2]上記の入力など)。

解決策は力ずくで、私のマシンで最悪の場合、約10秒かかります。

使い方:

@fqPQm/TdU4^U4sPQteQ
           ^U4sPQ         All permutations of [0, 1, 2, 3] with length equal to the number
                          of paintings.
     m/TdU4               Find the count (/) of paintings by painter in the input list.
 fqPQ                     Filter the permutations on the counts being the desired counts
                          in the input.
                          This gives all possible orderings of the paintings.
@                teQ      Index into this list at the given location - 1. (0-indexing)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.