Küratörün İkilemi


9

Giriş

Dört sanatçiden ( bazıları küratöre sıfır sanat eseri, genç alçaklar verebilir) modern sanattan zevk almakta olan bir sanat müzesi küratörünün arkadaşısınız . Bu modern sanat olduğundan, herhangi bir sanatçının eserleri tamamen aynı görünüyor. Arkadaşınız bu parçaları hangi sırayla yerleştireceğinize karar vermek için bir bilgisayar kullanmak istiyor.

Program Gereksinimleri

Programınız beş tamsayı almalıdır (bir işleve geçirilir veya stdin (veya başka bir yolla girilir)). İlk dördü, dört sanatçının her biri tarafından sağlanan tablo sayısıdır. Son değer bir permütasyon endeksidir i(0'dan değil 1'den sayarak). Küratör iresimlerin sözlükbilimsel düzeniyle inci permütasyonu görmek istiyor .

Programınız bu permütasyonu makul bir formatta vermelidir: örn. abbccdVeya [0 1 1 2 2 3]. Toplam on resimden daha az girdi için çalışma zamanı bir saatten az sürmelidir (bu umarım sorun olmamalıdır).

Permütasyonları çözmek için yerleşik işlevleri kullanmanıza izin verilmez

Örnekler

Giriş: 0 1 2 0 2

Sanatçı B tarafından bir resim ve sanatçı C tarafından iki resimimiz var (ve hepsi aynı görünüyor), sözlükbilimsel düzendeki permütasyonlar şunlardır:

['bcc', ' cbc ', 'ccb']

Vurgulanan permütasyon doğru çıktı olacaktır, çünkü sözlükbilimsel sıralamada ikincisidir.

Giriş: 1 2 0 1 5

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

Test yapmak

İşte doğru olması gereken bazı testler.

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'te rastgele giriş ve çıkışlar oluşturması gereken kısa bir kod parçası burada mevcuttur (giriş için geçerli değildir, bu Python permütasyonları içe aktarmayı kullanır):

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

sayı tahtası

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

1
"Tüm parçalar tamamen aynı görünüyor" diyorsunuz. Şunu mu demek istediniz "belirli bir sanatçının tüm parçaları tamamen aynı görünüyor, ancak farklı sanatçıların parçaları farklı görünüyor"?
DavidC

Bu geçerli bir giriş olmaz, ancak yine de birisi için yararlı olabileceğini düşünüyorum: {:A.a.{~97+[:I.}:geçerli J ve çalışıyor, ancak A.işin çoğu için kullanıyor , bu yüzden geçerli değil. Bu işlevde onun yerini alan A.ve yerine geçen bir işlev yazabilseydiniz, geçerli bir yanıtınız olurdu.
Janıʇǝɥʇuʎs

@ ɐɔıʇǝɥʇuʎs - "ABCD" yi kullanmak zorunda değilsiniz, herhangi bir karakter / sayısal / sembolik sistem kullanabilirsiniz. Korkarım J'yi bilmiyorum ve bu yüzden tam problemi söyleyemem, ama umarım bu yardımcı olur =)
Alexander Craggs

@PopeyGilbert Eh, sadece sayıları tüküren bir sürüm olurdu {:A.[:I.}:... Şey şu ki, ama hala A.geçerli olacağını düşünmüyorum : jsoftware.com/help/dictionary/dacapdot.htm
ɐɔıʇǝɥʇuʎs

Gerekli permütasyon yoksa ne olur? 1 0 0 0100?
edc65

Yanıtlar:


5

Python 2: 175 163 karakter

Bu ciddi bir golf cevabı değil. Farklı bir algoritma ile 138 bayta ulaştım. Sadece buraya göndermek istedim, çünkü kaba kuvvet kullanmıyor. Karmaşıklık Teta'dır (# resimler).

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

Kullanımı:

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

Düzenle:

Aynı algoritma, sadece bazı golf: faktöriyel yöntemi ve hesaplamalar sırasında küçük değişiklikler almayın.

Pyth çevirisi: 61 karakter

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

Burada özel bir şey yok, python kodumun tam çevirisi. Yine de çok uzun. Ben de birkaç çirkin (uzun) şey kullandım. Sadece ilk 9 harf faktöriyelin tanımıdır.

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

Ayrıca gibi şeyler Q[j]-=1çok uzun: XQNt@QN(Python'dan 1 karakter daha !!!)

Kullanımı:

Burada deneyin: Pyth Derleyici / Yönetici . Hata ayıklama modunu devre dışı bırakın ve [2, 2, 3, 1, 86]giriş olarak kullanın .


İşe yarıyor! İlk Python çözümünü bulduğunuz için tebrikler! Ancak, çevremde from math import*fonksiyonun dışına çıkmam gerektiğini buldum . Liderlik panosuna seni ekliyoruz!
Alexander Craggs

Vay ... Çözümünüz inanılmaz derecede verimli - 32 resim için sadece 0,034 saniye sürüyor.
Alexander Craggs

3

CJam, 50 43 39 bayt

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

Bu çok golf olabilir.

STDIN'den aşağıdaki formatta girdi alır:

4 1 2 0 24

Resmi çıktılar. Örneğin yukarıdaki giriş için:

0020210

Buradan çevrimiçi deneyin

Çevrimiçi derleyicinin daha büyük boyama boyutlarından vazgeçtiğini unutmayın. Java sürümünde daha büyük girişleri denemeniz gerekecek


İlk çözücü olduğun için tebrikler! 50 bayt kesinlikle yenilmesi zor bir değerdir. Seni liderlik tablosunun en tepesine ekleyeceğim!
Alexander Craggs

@PopeyGilbert Bir cevap kabul etmeden önce en az 1 hafta beklemelisiniz
Doktor

Ah, tamam, çok üzgünüm! Daha önceki mücadelemde, kabul edilen yanıtı birisi dövüldüğünde değiştirdim. Benim hatam.
Alexander Craggs

1
@PopeyGilbert Bu sizin için çok asil (ve tüm yarışmacı yazarların yapmasını diliyorum) ve prensipte bunu erken kabul etmekle ilgili yanlış bir şey yoktur, ancak buradaki bir meydan okuma erken bir cevap kabul ederse bazı insanlar rahatsız oluyor gibi görünüyor (çünkü, kimse tahmin beklediği ) kabul cevabı değiştirmek için yazar.
Martin Ender

Şahsen, erken yapılsa bile, kabul etmeden önce seçim yapmak için en az 2 cevap olması gerektiğini düşünüyorum. Tabii bir haftaya kadar sadece 1 cevap varsa, kabul edin.
Doktor

3

JavaScript (ES6) 120 138 147

Gerekli beş parametreye sahip bir fonksiyon olarak, konsol üzerinden çıkış.
0,1,2,3 sembollerini kullanma. Sembollerin toplamını hesaplar, sonra gerekli basamak sayısına sahip her baz 4 numarasını oluşturur ve kontrol ederim. Herhangi bir basamağın numarası yanlış olan numaralar atılır.
Not: JavaScript 32 bit tamsayı ile bu 15 resme kadar çalışır.

Daha Kısa Düzenle (.toString'den kaçının) ve çok daha hızlı (değiştirilmiş çıkış koşulu). Her testin süresi 1 saniyenin altında.

Edit2 algoritma değişikliği yok, daha fazla golf (okunabilirlik için girinti eklendi)

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

Ungolfed Ve FireFox gerekmez

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 konsolunda test et

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

Çıktı

01132222
01120232
0020210
0112113232

Merhaba! Çalıştırırken biraz sorun yaşıyorum. Bunun işe yarayıp yaramayacağını görmek için FireFox'u indiriyorum. Seni liderlik tablosuna ekleyeceğim!
Alexander Craggs

Burada oldukça güzel bir masa buldum - Firefox'un gerekli olduğunu varsayacağım. Test edildi ve işe yarıyor! Skor tablosu onaylandı.
Alexander Craggs

Liderler sıralaması yok, oy yok ... Gerçekten hoşlanmıyorsunuz! :(
edc65

Aah! Çok üzgünüm = (Şimdi seçildi =)
Alexander Craggs

Bu algoritmanın CJam'de ne kadar süreceğini merak ediyorum. Ama şu an itibariyle, bunun nasıl çalıştığı hakkında hiçbir fikrim yok: P
Optimizer

2

Pyth , 20

@fqPQm/TdU4^U4sPQteQ

Burada deneyin.

Girdi Python liste biçimindedir, ör. [1, 2, 4, 1, 5]

Çıktı ayrıca Python liste biçimindedir, örneğin [0, 1, 1, 3, 2, 2, 2, 2]yukarıdaki girdi için.

Çözüm kaba kuvvettir ve makinemde yaklaşık 10 saniye sürer.

Nasıl çalışır:

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