{0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4} için en kısa ifade


24

Verilen tamsayıların listesi {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}. Bu sayılarla ilgilenenler için hafta içi hesaplamada kullanılır.

Hafta içi = (m[n] + d + y + y>>2 + y/400 - y/100) % 7;, nerede m[n]- aradığım ifade, d- ayın günü, y- year - (month <= 2).

Pozitif tamsayı ntamsayısı için çıkış yapacak aritmetik, mantık ve bitsel işleçlerden oluşan ifadeyi , listede n m. m % 7Sayıya eşit olacak şekilde oluşturun .

Şubeler, üçlü operatörler, masa aramaları ve işaretçiler yasaktır.

Puan:
1 - | & ^ ~ >> <<operatörler için
1.1 - + - < > <= >= == != ! && ||operatörler için
1.2 - *operatörler için
1.4 - / %operatörler için

En düşük puanla cevap kazanır.

Şahsen buldum:

(41*n)>>4+((n+61)>>4)<<26,4 puanla. Başlamak için bu şekilde sağlanan kendi ifadesini bulmak zor olacağını düşündüm.


Sanırım dizi düzenleme (ve akrabalık) da izin verilmiyor?
John Dvorak

Evet, elbette, soruyu düzelttim.
Somnium,

6
Soru, bazı motivasyonlarla büyük ölçüde iyileştirilecektir. Bu numaralar nereden geliyor?
Peter Taylor,

table lookupsHerhalde İlginç cümleleme ...
ɐɔıʇǝɥʇuʎs

4
Neden skorda% 7 sayılmıyor? Belki% kullanmayan başka bir çözüm vardır. Sıfır pozitif mi , negatif mi, ikisi mi yoksa hiçbiri mi?
Thomas Weller

Yanıtlar:


34

2 2.2

Rasgele hassas aritmetik seviyorum.

0x4126030156610>>(n<<2)

Veya, altıgen sevmiyorsanız,

1146104239711760>>(n<<2)

Ölçek:

print([(0x4126030156610>>(n<<2))%7 for n in range(1,13)])
[0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4]

4*nBunun yerine bir arama tablosu yapabilir ve 0,2 puan kaydederek kaydedebilir n<<2misiniz?
xnor

@xnor Kesinlikle! Sadece sekizlikten onaltılıya geçmek için. Sadece sn.
isaacg

Güzel. Hiçbir şeyin daha iyisini yapamayacağına ikna oldum, çünkü sadece tek bir işlem yapmayı gerektiriyordu ve hepsinin çok fazla yapısı var 7. Tamsayı kat bölümünün en iyi adayı, ve const/nile çelişiyor . n=4n=8
xnor

@xnor Bir başka yakın olanı, const%nn = 1,2 ve 3 dışındaki her şeyi tatmin edebilecek
olandır

Ben de aynı şeyi yapacaktım ama sen beni yendin ...
14:14

32

2.0

(127004 >> i) ^ 60233

veya (puan 2.2):

(i * 3246) ^ 130159

Hepsi brute force ile bulundu :-)


Bu, isaacg'ın cevabı ile aynı puana sahip olduğundan, ancak 64-bit tamsayı kullanmıyorsa, bunu kabul edilen cevap olarak seçiyorum. Cevabın için teşekkür ederim!
Somnium

8
@ user2992539 Bu cevabın 32-bit tamsayılar kullanması hoş olsa da, bu ölçütleri sizin mücadelenizde belirtmediniz, bu isaacg'ın cevabını tamamen geçerli kılıyor. Bu nedenle, iki cevap birbirine bağlı ve bence bu puanı alan ilkini kabul etmek sadece adil . (Süper Chafouin için Kudos olsa, +1!)
Martin Ender

@ m.buettner Seninle aynı fikirdeyim. Bir dahaki sefere, açıklama ve cevap seçiminde daha dikkatli olacağım.
Somnium

Başkalarının öğrenmesi için kaba kuvvet hesaplamasının nasıl yapıldığını açıklayabilir misiniz?
Thomas Weller,

@Tomlar Daha yeni bir çift fordöngü yaptım , formülün tüm p, q değerlerini test ettim (p >> i) ^ q, daha sonra bir kahve almaya gittim ve 10 dakika sonra sonuçları okumak için geldim.
Arnaud,

8

35.3

Bunun listeyi oluşturmak için en az etkili yöntem olabileceğinden şüpheleniyorum:

1.7801122128869781e+003 * n - 
1.7215267321373362e+003 * n ^ 2 + 
8.3107487075415247e+002 * n ^ 3 - 
2.0576746235987866e+002 * n ^ 4 + 
1.7702949291688071e+001 * n ^ 5 + 
3.7551387326116981e+000 * n ^ 6 - 
1.3296432299817251e+000 * n ^ 7 + 
1.8138635864087030e-001 * n ^ 8 - 
1.3366764519057219e-002 * n ^ 9 + 
5.2402527302299116e-004 * n ^ 10 - 
8.5946393615396631e-006 * n ^ 11 -
7.0418841304671321e+002

Polinom regresyonunu yeni hesapladım. Başka hangi korkunç yöntemin denenebileceğini görmek için can atıyorum.

Özellikle sonuç yuvarlanırsa 3,3 puan kazanabilirim. Bu noktada, bunun önemli olduğunu sanmıyorum.


5

3.2

Sıfır bazlı çözüm:

7 & (37383146136 >> (i*3))

Tek tabanlı bir çözüm:

7 & (299065169088 >> (i*3))

Başlangıçta %7işlemin de sayılacağını ve %burada pahalı bir işlem olacağını düşündüm, onsuz çözmeye çalıştım.

Bunun gibi 3.2 sonucuna geldim:

// Construction of the number
// Use 3 bits per entry and shift to correct place
long c = 0;
int[] nums = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
for (int i = nums.Length - 1; i >= 0; i--)
{
    c <<= 3;
    c += nums[i];
}
// c = 37383146136

// Actual challenge
for (int i = 0; i < 13; i++)
{
    Console.Write("{0} ",7 & 37383146136 >> i*3);
}

Bu yaklaşımı kullanarak (olmadan %) optimizasyon ile ilgilenirim . Teşekkürler.


Bu çok havalı, belki bu bana bir gün yardımcı olur.) Nasıl düşünebilirsin, belki de tüm formül küçültme için ayrı bir soru oluşturmalıyım?
Somnium,

1
Ne dersiniz (0426415305230 >> (i*3)) & 7? Çıkış hanelerini ters sırada görebilirsiniz.
CJ Dennis

@CJDennis: C # 'da sekizli sayı olmadığını düşünüyorum.
Thomas Weller

Sadece C olduğunu sanıyordum? C # ile ilgili başka bir referans göremiyorum.
CJ Dennis

0

Python (3)

Bugünlerde bu sorulardan birkaçı olduğundan, 3 (veya 2) simge ile otomatik olarak çözmek için bir program yapmaya karar verdim. İşte bu zorluğun sonucu:

G:\Users\Synthetica\Anaconda\python.exe "C:/Users/Synthetica/PycharmProjects/PCCG/Atomic golfer.py"
Input sequence: 0 3 2 5 0 3 5 1 4 6 2 4
f = lambda n: (72997619651120 >> (n << 2)) & 15
f = lambda n: (0x426415305230L >> (n << 2)) & 15
f = lambda n: (0b10000100110010000010101001100000101001000110000 >> (n << 2)) & 15

Process finished with exit code 0

Bunun işe yaradığının kanıtı:

f = lambda n: (72997619651120 >> (n << 2)) & 15

for i in range(12):
   print i, f(i)

0 0
1 3
2 2
3 5
4 0
5 3
6 5
7 1
8 4
9 6
10 2
11 4

Çözücünüz operandların maliyetini nasıl değerlendiriyor?
Thomas Weller,

@ThomasW. Olmaz, her zaman sağa kayma, muhtemelen sola kayma (değerler 1 bit değilse) ve an &.
40'ta
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.