İki düzine öpüşme sayısı yaklaşımı


26

1 ile 24 arasında bir sayı verildiğinde, öpüşme sayısını mevcut bilginin en iyisine verin (bazı numaralarda birden fazla kabul edilebilir çıktı olacaktır). Çıktıların tümü aşağıda listelendiği için, geometri bilgisi şart değildir.

Gönderen öpüşme Numarası Problem Wikipedia sayfası :

bir öpüşme numarası, her biri bir başka birim küre ile temas edecek şekilde düzenlenebilen, üst üste binmeyen birim kürelerinin sayısı olarak tanımlanır.

Yani, bir birim küre verildiğinde, bunlardan hiçbiri üst üste binmeden kaç tane birim küre dokunabilir? Bir kürenin N-1 boyutlu bir küre olduğu anlaşılan N boyutlu uzayda soru sorulacak.

Örneğin:

  • 2 boyutlu boşlukta, bir birim daire diğer 6 birim daireye dokunabilir.
  • 3 boyutlu uzayda, bir birim küre diğer 12 birim küre ile temas edebilir.

Wikipedia sayfası 1 ila 24 boyutlu alan için değerleri listeler. Bununla birlikte, bunlardan bazıları henüz tam olarak bilinmediğinden, sadece bir alt ve üst sınır verilmiştir. Tablo, burada yeni provalar nedeniyle aralıkların daralmasından bağımsız olarak, sabit kalması için tekrar üretilir. Vikipedi sayfası ileride değiştirilse bile, çözümler bu sabit tabloya göre değerlendirilir.

Sınır tablosu

Dimension   Lower bound     Upper bound
1           2               2
2           6               6
3           12              12
4           24              24
5           40              44
6           72              78
7           126             134
8           240             240
9           306             364
10          500             554
11          582             870
12          840             1357
13          1154            2069
14          1606            3183
15          2564            4866
16          4320            7355
17          5346            11072
18          7398            16572
19          10668           24812
20          17400           36764
21          27720           54584
22          49896           82340
23          93150           124416
24          196560          196560

Giriş

Boyut: 1 ile 24 arasında bir tam sayı (dahil).

O olabilir - İşte "tamsayı" giriş hiçbir kesirli kısmını sahip olacağını belirten 2veya 3ama asla 2.5. Bir çözüm hala örneğin bir şamandıra veya bir dize olarak girdi alabilir.

Çıktı

İlgili aralıktaki bir sayı, bu giriş için alt limitten üst limite kadar (dahil).

Çıktı deterministik olmalıdır (her zaman aynı giriş için aynı olmalıdır).

Çıktı tamsayı olmalıdır. Örneğin, giriş için 5mümkün olan geçerli bir çıkış vardır 40, 41, 42, 43, 44. Bunun tür üzerinde değil değer üzerinde bir kısıtlama olduğuna dikkat edin. Sıfır kesirli kısma sahip olması şartıyla bir şamandıranın döndürülmesi kabul edilebilir. Örneğin, 41.5geçerli 41.0olmaz , ancak geçerli olur.

puanlama

Bu . Puanınız, kodunuzdaki bayt sayısıdır. Her dil için kazanan, en düşük puana sahip olan çözümdür.


6
Gerçekten harika yaklaşım problemi.
qwr

Yanıtlar:


11

Julia 0.6 , 52 bayt

n->ceil(n<8?3.7exp(.51n)-5.1:n<24?9exp(.41n):196560)

Çevrimiçi deneyin!

Nasıl?

Makine öğrenme! (Biraz. Belki. Gerçekten de değil. )

aebK+cc

aebK+cceil


6
Bir araştırma araştırmasını makine öğrenmesi olarak düşünmezdim. Bir şey olursa kaba kuvvettir.
qwr

5
Ama içinde MLBase!!! J / k, ML etrafında çizgiler her zaman olduğu gibi bulanık, ama bu muhtemelen bir etiket makine öğrenimini hak edecek çok basit. Sonra tekrar, bir buzzword almak her zaman yararlıdır!
sundar - Monica'yı yeniden

Makine Öğrenimi derken, çoğunlukla n = 2 veya regexps'li polinomları düşünüyoruz
aaaaa

2
makine öğrenmesi deyince sinir ağları, karar ağaçları,
HMM'ler

@qwr Çok geç kaldım, ama gerileme aslında tüm bunlara ek olarak, makine öğreniminin bir parçası olarak görülüyor. (Ve daha fazlası! SVM'ler, vb.)
Quintec

7

x86, 62 59 53 50 bayt

Çözümümde bir bayt arama tablosu kullanılıyor ve 2'ye geçiliyor (FP hesaplamaları yok). 9'dan 23'e kadar olan boyutlar kaydırma için yeterli boşluğu sağlar. Giriş eaxve çıkış ecx.

-3 değiş tokuş ederek eaxve ecxberi cmp $imm, %alkısadır cmp $imm, %cl.

-4 = N = 24 vakasına ayrı ayrı muamele edilmemesi ancak her zaman 1024 vakada ayar yapılması

-2 erken dönmeyerek (aptal)

-3 tabloyu ofset olarak movzblkullanmak ve sıfırlamak yerinexor

start:
        dec     %eax                # 1-indexed table

        movzbl  table(%eax), %ecx   # return byte directly
        cmp     $8, %al
        jl      exit

        sal     $6, %ecx            # * 64 
        cmp     $19, %al
        jl      exit

        sal     $4, %ecx            # * 16
        sub     $48, %ecx

exit:   
        ret

#.data
table:  .byte   2, 6, 12, 24, 40, 72, 126, 240              # * 1
        .byte   5, 8, 10, 14, 19, 26, 41, 68, 84, 116, 167  # * 64  
        .byte   18, 28, 49, 92, 192                         # * 1024 - 48

Hexdump ( .textyerine tablo .data)

00000502  48 0f b6 88 1c 05 00 00  3c 08 7c 0d c1 e1 06 3c  |H.......<.|....<|
00000512  13 7c 06 c1 e1 04 83 e9  30 c3 02 06 0c 18 28 48  |.|......0.....(H|
00000522  7e f0 05 08 0a 0e 13 1a  29 44 54 74 a7 12 1c 31  |~.......)DTt...1|
00000532  5c c0                                             |\.|

1
Masa salt okunur, normalde onu koymuşsun .rodata, .datazaten değil . (Ya da görünüşe göre Windows'ta .rdata). Bu .rodatabölüm, metin bölümünün bir parçası olarak bağlanır.
Peter Cordes,

1
Ve BTW, normal insanlar shl, özellikle numaranız işaretsiz olduğunda yazıyorlar (yüklerdiniz movzbl, değil movsbl). Elbette salaynı işlem kodu için başka bir isim. gcc yayar sal, ancak elle yazılmış kodda görmek oldukça nadirdir.
Peter Cordes

7

JavaScript (ES6), 60 bayt

f=(n,k=2)=>n<24?--n?f(n,k*24/(17+~'_8443223'[n])):~~k:196560

Çevrimiçi deneyin!

Nasıl?

a24=196560

Diğer tüm terimler, aşağıdakileri tekrarlayarak hesaplanır:

{a1=2an+1=an×24qn

qn

{q1=8q2=12q3=12q4=13q5=14q6=14q7=13qn=16,for n>7

aşağıdaki oranlara yol açar:

3,2,2,2413,127,127,2413,32,32,,32

Nihai sonuç sonunda döşenir ve iade edilir.

Sonuçlar özeti

Yaklaşık sonuçlar 2 ondalık basamakla verilmiştir.

  n |   a(n-1) | multiplier |      a(n) | output |          expected
----+----------+------------+-----------+--------+-------------------
  1 |      n/a |        n/a |         2 |      2 |                2
----+----------+------------+-----------+--------+-------------------
  2 |        2 |          3 |         6 |      6 |                6
  3 |        6 |          2 |        12 |     12 |               12
  4 |       12 |          2 |        24 |     24 |               24
  5 |       24 |      24/13 |     44.31 |     44 |        [40,..,44]
  6 |    44.31 |       12/7 |     75.96 |     75 |        [72,..,78]
  7 |    75.96 |       12/7 |    130.21 |    130 |      [126,..,134]
  8 |   130.21 |      24/13 |    240.39 |    240 |              240
  9 |   240.39 |        3/2 |    360.58 |    360 |      [306,..,364]
 10 |   360.58 |        3/2 |    540.87 |    540 |      [500,..,554]
 11 |   540.87 |        3/2 |    811.31 |    811 |      [582,..,870]
 12 |   811.31 |        3/2 |   1216.97 |   1216 |     [840,..,1357]
 13 |  1216.97 |        3/2 |   1825.45 |   1825 |    [1154,..,2069]
 14 |  1825.45 |        3/2 |   2738.17 |   2738 |    [1606,..,3183]
 15 |  2738.17 |        3/2 |   4107.26 |   4107 |    [2564,..,4866]
 16 |  4107.26 |        3/2 |   6160.89 |   6160 |    [4320,..,7355]
 17 |  6160.89 |        3/2 |   9241.34 |   9241 |   [5346,..,11072]
 18 |  9241.34 |        3/2 |  13862.00 |  13862 |   [7398,..,16572]
 19 | 13862.00 |        3/2 |  20793.01 |  20793 |  [10668,..,24812]
 20 | 20793.01 |        3/2 |  31189.51 |  31189 |  [17400,..,36764]
 21 | 31189.51 |        3/2 |  46784.26 |  46784 |  [27720,..,54584]
 22 | 46784.26 |        3/2 |  70176.40 |  70176 |  [49896,..,82340]
 23 | 70176.40 |        3/2 | 105264.59 | 105264 | [93150,..,124416]
----+----------+------------+-----------+--------+-------------------
 24 |           (hard-coded)            | 196560 |           196560 

1
Gördüğüm ilk şey, özyinelemeli bir JavaScript işlevi içindeki bitsel operatörlerdi; İlk düşündüğüm şey "Arnauld ne
yapmalı

Gerçekten güzel masa. Manuel olarak mı yaptın?
qwr,

1
@ qwr Evet, çoğunlukla Notepad ++ düzenlemesidir. İlk 4 sütundaki değerleri üretmek için bir komut dosyası kullandım.
Arnauld,

4

Jöle , 29 26 bayt

“~D=ⱮziEc+y’Dḣ+⁵÷7PĊ«“£#;’

Çevrimiçi deneyin!

Nasıl çalışır

“~D=ⱮziEc+y’Dḣ+⁵÷7PĊ«“£#;’  Main link. Argument: n

“~D=ⱮziEc+y’                Set the return value to 485523230101001100011122.
            D               Decimal; convert the return value to base 10.
             ḣ              Head; take the first n elements of the digit list.
              +⁵            Add 10 to each element.
                ÷7          Divide the sums by 7.
                  P         Take the product.
                   Ċ        Ceil; round up to the nearest integer.
                     “£#;’  Yield 196560.
                    «       Take the minimum.

1

JavaScript (Node.js) , 120 99 bayt

21 bayt düştü. TSH hormonunun önerisine Büyük azaltma sayesinde dizinin başlangıcından (iki bayt giden tasarrufu için bir delik eklemek n-1için nböylece gibi sabit noktalı notasyon onları küçülen, ve, küçük ve büyük sınırlar içinde yuvarlak sayılar için amaçlayan 1154üstel notasyona gibi 2e3.

Yine, asıl amacım “aptal” yolun ne kadar hafif olacağını göstermekti (örneğin Arnauld'un cevabı gibi herhangi bir gerçek matematik kullanmamak. Hala herhangi bir dönüşüm veya hesaplama olmadan küçültmek için yer olması etkileyici.

n=>[,2,6,12,24,40,72,126,240,306,500,582,840,2e3,2e3,3e3,5e3,6e3,8e3,2e4,2e4,3e4,5e4,1e6,196560][n]

Çevrimiçi deneyin!

Arnauld'un cevabının iki katı, karmaşıklığın 0 katı

JavaScript (Node.js) , 129 128 bayt

(Bitshifting önerisi sayesinde -1 bayt)

f=(n)=>[2,6,12,24,40,72,126,240].concat([5,8,10,14,19,26,41,68,84,116,167].map(x=>x<<6),[17,28,49,91].map(x=>x<<10),196560)[n-1]

Çevrimiçi deneyin!

İlginç olmanın taleplerini karşılamak için, x86 cevabından mantığı çaldım ve diziyi bundan oluşturdum. 9 byte daha uzun yapıyor. Ama biraz daha ilginç.


yawns en azından ilginç bir şeyler dene
qwr

En basit yaklaşımı (ve dolayısıyla teknik olarak en uzun makul uzunluğu) göstermenin oldukça ilginç olduğunu düşündüm. Arnauld's JS'de alabileceğiniz en kısa yol, muhtemelen en uzun olanı iki katı bayt.
Anthony,

1
Bayt arama tablonun amacı, belki bir bytestring veya sadece "02060c1828487ef0" gibi bir şey kullanmaktır; burada her bir giriş bir bayt veya altıgen içinde 2 karakter ise tercih edilir. Sayıları doğrudan ondalık basamakta saklamak en fazla 3 karakter alabilir. Aynı zamanda bitshifting kullanın ...
qwr

2
Sen az kaldır at gerektiğini f=, değişim (x)için x, bir delik ve değişim katmak x-1için x. TIO ; ve belki de onları
toparlayabilir

5
PPCG'ye Hoşgeldiniz! :)
Shaggy,

1

Runik, 173 bayt

>i:8(?D5X1+1C,*212,+16,+1c2*,+1cX,+Sp3X7+a,*5X1+a,-1+kn$;
      R:c2*(?D4X1+1C,*212,+16,+1c2*,+Sp9*1+:4XY(?Dkn$;
             R`196560`r@;              ;$*C1nk,C1L

(Sağ alt köşenin bayt için sayılması gerektiğine dikkat edin: örtük olarak boşluklarla doldurulurlar.)

TIO'nun macerası bu cevabın dayandığı bir güncellemeye ihtiyaç duyuyor (Dennis'in yeniden inşa etmesini istemeden önce başka bazı delikler açıyorum). Ancak, bir değeri takarak (ilk satırdaki değer için birden fazla karakter kullanıyorsanız, 2. ve 3. satırlara boşluk eklediğinizden emin olun). İşte gerekli değerleri yazmanın en kolay yolu:

0-9,a-f  ->  1-15
2Xn+     ->  20+n

Çevrimiçi deneyin!

İşlevsel olarak bu sundar'ın Julia cevabının limanıdır (ancak Runic'in eyığına itme komutu yoktur (ya da gerçekten herhangi bir ondalık değer), bu nedenle bir yaklaşıma ihtiyaç vardır). e8'den küçük girişler için yaklaşıklık daha kesindir, çünkü hassasiyet kaybı, izin verilen çıkış aralığının dışında kalan değerlerle sonuçlanmıştır (örneğin 7, 125 üretecektir). Ceil()Bir karaktere ve ardından bir sayıya dönerek başarıldı (bu, son derece büyük değerler için başarısız oldu, bu yüzden 40k'de 100'e böldüm, dönüşümü geri alıp tekrar 100'e çarptım).

Orada (örneğin dikey aşağıdaki giriş noktası çalışan veya yaklaşımları için sıkıştırmak için bir yol bulmak düzenlemeyi kolaylaştırmak için bazı oda muhtemelen e), ama sadece edememek mutluyum yapmak hesaplama.

/?D5X1+1C,*212,+16,+1c2*,+1cX,+Sp3X7+a,*5X1+a,-1+kn$;
  R:c2*(?D4X1+1C,*212,+16,+1c2*,+Sp9*1+:4XY(?Dkn$;
\(8:i<   R`196560`r@;              ;$*C1nk,C1L

161 bayt.

Tercüman Güncellemesi:

İle itme sabitleme giriş okuma , Runik artık çeşitli matematik fonksiyonları ve çiftlerde olarak ayrıştırma dizeleri yeteneğine sahiptir. Bu, bu cevabı büyük ölçüde basitleştirecek, ancak harcadığım çabayı gösterecek şekilde bırakacağım (tek değişkenli Math fonksiyonlarını ekledim ve gönderdikten kısa bir süre sonra dize ayrıştırdım: Zaten Sin / Cos / Tan vardı. yapılacaklar listem; ancak Exp, Abs, Log vb. özellikleri dikkate almamıştım. TIO, Dennis'in gördüğü zamana bağlı olarak, sonraki 24-48 saat içinde güncellenmelidir.

212,+16,+1c2*,+1cX,+1'eABu tercüman güncellemesi ile -> 'ya düşer. Açıkar, bir karakter ve karakter göre bu değer bir matematik işlemi attı bir değer ve gerçekleştirir ( ebu durumda Exp()ve Exp(1)döner e ).

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.