“Evreni gezerken…”


48

Güneş Sistemi'ndeki en büyük 20 nesneden birinin adı size verilecektir. Görevin kilometre cinsinden, yaklaşık kilometre cinsinden ifade edilen bir dönüş döndürmek.

Bu, puanınızın, kodunuzun uzunluğundan (bayt cinsinden) , en kötü yaklaşımınıza dayanan bir ceza oranı çarpıldığı bir . Bu nedenle, en düşük puan kazanır .1

"Evreni dolaşırken", daha sonra Pantera tarafından da kapsanan Black Sabbath tarafından Planet Caravan adlı şarkının son satırı .

Güneş Sistemi nesneleri

Kaynak: Wikipedia

Not: Sıra sadece bilgi amaçlı verilmiştir. Giriş, nesnenin adıdır .

  n | Object   | Radius (km)
----+----------+-------------
  1 | Sun      |   696342
  2 | Jupiter  |    69911
  3 | Saturn   |    58232
  4 | Uranus   |    25362
  5 | Neptune  |    24622
  6 | Earth    |     6371
  7 | Venus    |     6052
  8 | Mars     |     3390
  9 | Ganymede |     2634
 10 | Titan    |     2575
 11 | Mercury  |     2440
 12 | Callisto |     2410
 13 | Io       |     1822
 14 | Moon     |     1737
 15 | Europa   |     1561
 16 | Triton   |     1353
 17 | Pluto    |     1186
 18 | Eris     |     1163
 19 | Haumea   |      816
 20 | Titania  |      788

Veya kopyala-yapıştır dostu listeler olarak:

'Sun', 'Jupiter', 'Saturn', 'Uranus', 'Neptune', 'Earth', 'Venus', 'Mars', 'Ganymede', 'Titan', 'Mercury', 'Callisto', 'Io', 'Moon', 'Europa', 'Triton', 'Pluto', 'Eris', 'Haumea', 'Titania'
696342, 69911, 58232, 25362, 24622, 6371, 6052, 3390, 2634, 2575, 2440, 2410, 1822, 1737, 1561, 1353, 1186, 1163, 816, 788

Puanın

Let beklenen yarıçapı olmak nesne ve izin bu nesne için programınızın cevap.RnnthAn

O zaman puanınız şöyle tanımlanır:

S=L×max1i20(max(AiRi,RiAi)2)

nerede bayt kodunuzun uzunluğudur.L

Örnek:

Kodunuzun boyutu ise byte ve en kötü yaklaşım tahmini yarıçapı Ay'da ise km yerine km, sonra skor olacaktır:10010001737

S=100×(17371000)2=302

Ne kadar düşük, o kadar iyi.

Cevabınız için önerilen başlık:

Language, 100 bytes, score = 302

Puanınızı hesaplamak için bu betiği kullanabilirsiniz (ilk satır = kod uzunluğu, sonraki 20 satır = çıktılarınız, Sun'dan Titania'ya).

kurallar

  • Nesnenin adını tam küçük harf, tam büyük harf veya aynen yukarıda açıklandığı gibi alabilirsiniz (başlık durumu). Diğer karışık vakalara izin verilmez.
  • Girişin 20 olası addan biri olduğu garanti edilir.
  • Tamsayıları veya değişkenleri geri getirebilirsiniz. Her iki durumda da, ceza doğrudan bu değerlerle hesaplanmalıdır (yüzdürme durumunda yuvarlanmış değerler değil).
  • Olumlu değerler döndürmelisin.
  • Boş programlara izin verilmiyor.

2
Sandbox (şimdi silindi). Geri bildirim sağlayan herkese teşekkürler ve özellikle de puanlama formülünü düzeltmeye yardımcı olduğu için xnor.
Arnauld,

1
Puanlamanın fark için 2'nin gücüyle değiştirildiğini görüyorum. Bu durumda 100 baytlık tam cevabım 70 baytlık yaklaşımımdan daha kısadır (daha önce 91 puan aldı ama şimdi 117 ..)
Kevin Cruijssen

1
@KevinCruijssen Bunun ardındaki fikir, çok kısa cevapların (temel olarak 1 veya 2 sabiti döndüren) makul bir faktör tarafından cezalandırılmasının önlenmesi ve daha sofistike olanlara karşı potansiyel olarak kazanılmasıydı.
Arnauld,

2
Puanlama fonksiyonunda kareyi onaylıyorum. Önceki en iyi sonucum, 7512tüm test durumları için 2 bayt kullanarak 60 puandı. Yakında herhangi bir zamanda bir MathGolf çözümü oluşturmak için dalıp dalmadığımı göreceğim, ancak 05AB1E'yi yenmek zor olacak.
azami

2
@maxb Jelly'in 37'lık skorunu, 05AB1E'nin 60'lık skorunu değil; p
Kevin Cruijssen

Yanıtlar:


28

PowerShell , 3 bayt, skor 3637

2e4

Çevrimiçi deneyin!

Çok saf, sıkıcı, uygulama; 20000giriş ne olursa olsun sadece döner . Güneşi gizlemek veya kayan nokta değerleri kullanmak gibi şeylerle denemeler yapmak 2, daha kötü skorlarla sonuçlandı, çünkü kod uzunluğu, herhangi bir boyut karşılaştırma kazancını dengelemek için yeterince arttı.


3
KPI hakkında bilmeniz gereken her şey bu kadar :)
mazzy

12
Bu neden bu kadar çok oy alıyor ?!
Shaggy

11
@Shaggy Bu konuda kafam karıştı ..: S Bu en tembel ve en yüksek puanlama cevabı (kişisel AdmBorkBork almayın , ancak Jelly ve Java cevaplarının en çok satanları hak ettiğini düşünüyorum). İnsanlar muhtemelen sadece 3 baytlık kısmı görürler (veya daha yüksek puanın daha düşük olduğunu düşünürler) ve diğer her şeyi görmezden gelirler. xD Arnauld'un Sandbox'taki orijinal meydan okuma tanımında, her bir G / Ç için maksimum% 95'lik bir hata yüzdesine izin verdiği için bu cevap bile mümkün olmazdı. Ah iyi. Ücretsiz temsilcisi AdmBorkBork'un keyfini çıkarın . ;)
Kevin Cruijssen

6
Sorunun kriterlerine uyuyor olsa da. Bence insanlar oy veriyor, çünkü çok açık, çoğu kimse bunu düşünmezdi. Ayrıca, bu şekilde kötüye kullanılabiliyorsa, kusurlu bir derecelendirme sistemi ile mücadeleyi belirtir.
Elcan

9
İnsanlar PPCG'ye yalnızca çeşitli sebeplerden ötürü her türlü nedenden ötürü karşılık veriyorlar ( örneğin dev Minecraft redstone cevabına bakınız ). Bu cevabı yükselttim, çünkü strateji yelpazesinin en uzak ucunun açık, basit bir örneği ("geri dönüş değerleri" ile "yaklaşık bir geri dönüş ve ceza almak için baytları kaydet" arasındaki spektrum) idi.
BradC

25

Jöle , 34 bayt, skor = 37

OḌ“⁸|5/!‘%ƒị“RNFLOJMjs⁽\u[USJ‘1.1*

Giriş büyük harf, çıkış en az hatayla 1.1 gücüdür.

Çevrimiçi deneyin!

Nasıl çalışır

OḌ“⁸|5/!‘%ƒị“RNFLOJMjs⁽\u[USJ‘1.1*  Main link. Argument: s (string)

O                                   Ordinal; map the char in s to their code points.
                                        "ERIS" -> [69,82,73,83]
 Ḍ                                  Undecimal; treat the result as an array of digits
                                    in base 10 and convert it to integer.
                                        [69,82,73,83] -> 69000+8200+730+83 = 78013
  “⁸|5/!‘                           Literal; yield [136, 124, 53, 47, 33].
         %ƒ                         Fold the array by modulus, using the computed
                                    integer as initial value.
                                        78013 -> 78013%136%124%53%47%33 = 32
            “RNFLOJMjs⁽\u[USJ‘      Literal; yield [82, 78, 70, 76, 79, 74, 77, ...
                                    106, 115, 141, 92, 117, 91, 85, 83, 74].
           ị                        Retrieve the element from the array to the right,
                                    at the index to the left.
                                    Indexing is 1-based and modular.
                                        32 = 16 (mod 16) -> 'J' = 74
                              1.1*  Raise 1.1 to the computed power.
                                        74 = 1.1**74 = 1156.268519450066

20

Java (JDK) , 90 bayt, puan = 97

s->("ýCĄ (ᬺ!˂Fɍ".charAt(s.substring(2).chars().sum()%96%49%25)-7)*100

Çevrimiçi deneyin!

  • Bu giriş hem görünmez hem de çok baytlık Unicode karakterler kullanır (ancak Java bunları yine de kabul eder). Doğru kod için TIO’yu kontrol edin.
  • Giriş başlık durumda olmalıdır.
  • Bu kod, değerleri 100 değerinin en iyi değerine yuvarlar (bazen yukarı, bazen aşağı), böylece kodlandığında son iki hane atlanabilir ve değer daha sonra 100 ile çarpılarak yaklaştırılabilir.
  • Bu giriş, 25 kod noktası işaretine (bulabildiğim en kısa dize) sığdırmak için çeşitli karmalar kullanır.

Kredi

  • -48 puan (-45 bayt) sayesinde Kevin Cruijssen , yarıçapları (100'e bölünmüş) doğrudan kodlamak Stringyerine doğrudan kodlayarak kodlar int.


@KevinCruijssen! Bu, bir ondalık değer dizisi yerine, dizede unicode karakterleri kullanan hoş bir golf. :-)
Olivier Grégoire

Yardım edebildiğime sevindim ve iyi cevaplar! :) Not: Neden ben ekledim gelince (...-7): Yazdırılamaz karakter (char)0boştu bu yüzden bir şey eklemek zorunda kaldı. Öncelikle tek basamaklı olmak 9ve denemek istedim 8, fakat 9tabiki sekmeler verdim, \ther biri birden fazla (her biri 2 byte) gerektiriyordu ve 8kaçınılmamış bir karakter hakkında bir hata verdim.
Kevin Cruijssen

@KevinCruijssen Dürüst olmak gerekirse, dün birkaç saat boyunca çarpımınızı genişleyerek *100-700ve dize değerleri ve bu iki sayı ile oynayarak daha iyi değerler elde etmeye çalıştım , fakat bunlar en iyisi saymak, ancak puan aynı kalır. Bu yüzden rastgele saptama (en iyi durumdan biri);)
Olivier Grégoire

Anlaşılmaz bir şekilde konuş! Bu girdi gerçekten Firefox'umu sayfanın geri kalanını doğru okuyamadığım noktaya çekiyor :-(
Neil

9

Wolfram Dili 114 103 97 88 86 82 bayt. puan = 114 103 97 89 87 83 puan

(#&@@EntityValue[Interpreter["AstronomicalObject"]@#,"Radius"]/._String->507)1.61&

En az 6 puan sayesinde Dennis, birkaç teşekkür sayesinde lirtosiastve 6 daha teşekkürler user202729.

Mathematica güneş sistemi verilerini (ve ayrıca ek astronomik verileri) getirebilse de, aşağıda açıklandığı gibi bazı küçük tweaks'lere ihtiyaç vardır.

Interpreter[#,"AstronomicalObject"]&tarafından temsil edilen terim ile ilişkili varlık (yani makineyle hesaplanabilir nesne) döndürür #.

EntityValue[AstronomicalObject[],"Radius"]Varlığın mil cinsinden yarıçapını döndürür. "Haumea" durumunda, 816.27 (yani 507 * 1.61) değeri döndürülür.

Yarıçapı ile çarpma 1.61milden km'ye dönüşür. Tamsayılar yerine ondalık değerler, en zor durumda bile% 1'den daha az hataya neden olur.

[[1]]birim büyüklüğü döndürür, km. Bu daha sonra #&@@aynı sonucu vererek, olarak değiştirildi.


1
Başka bir wolfram inşa edildi. Tıpkı beklemelerin tespiti gibi
OganM

Bunu cevaplardım ama wolfram dilini bilmiyordum lol
Quintec

Aslında, bunun için de internet bağlantısı gerekir (10.2'de test edilmiştir)
user202729

@ user202729, Son iki, yardımcı olan öneriniz şimdi entegre edildi. Astronomik cisimler gibi küratörlüğün kullanımı, gerçekten de internet bağlantısı gerektirir.
DavidC

1
Ah, yarıçap için varsayılan birimler miller mi? En azından, kütle için aklı başında (yani metrik) varsayılan birimler var ...
Neil

7

Python 3 , puan 95, 95 bayt

lambda n:ord("ؙҢ򪀖ਏ𑄗ാᣣ४ঈ挒ឤ?̰ҋ??ۉՉ怮ܞ੊̔"[int(n,35)%87%52%24-1])

Çevrimiçi deneyin!


Python 3 , puan 133, 133 bayt

lambda n:int(f'00e0{10**18+10**6}10x1h2411j4?00??811i1207wazxmwuvko?mw??xc1ze1ldyujz6zysi4?ob??k9lym6w'[int(n,35)%87%52%24-1::23],36)

Çevrimiçi deneyin!


6

Powershell, 150 141 bayt, puan 163 153

($args|% t*y|?{'Su6963J699S582U253N246Ea63V60Ma33G26Ti25Me24C24I18M17Eu15T13P12E12H8Titani8'-cmatch"$(($y+=$_))(\d+)"}|%{100*$Matches.1})[-1]

Çevrimiçi deneyin!

Test komut dosyası:

$f = {
($args|% t*y|?{'Su6963J699S582U253N246Ea63V60Ma33G26Ti25Me24C24I18M17Eu15T13P12E12H8Titani8'-cmatch"$(($y+=$_))(\d+)"}|%{100*$Matches.1})[-1]
}

$penalty = @(
    ,("Sun"      , 696342)
    ,("Jupiter"  ,  69911)
    ,("Saturn"   ,  58232)
    ,("Uranus"   ,  25362)
    ,("Neptune"  ,  24622)
    ,("Earth"    ,   6371)
    ,("Venus"    ,   6052)
    ,("Mars"     ,   3390)
    ,("Ganymede" ,   2634)
    ,("Titan"    ,   2575)
    ,("Mercury"  ,   2440)
    ,("Callisto" ,   2410)
    ,("Io"       ,   1822)
    ,("Moon"     ,   1737)
    ,("Europa"   ,   1561)
    ,("Triton"   ,   1353)
    ,("Pluto"    ,   1186)
    ,("Eris"     ,   1163)
    ,("Haumea"   ,    816)
    ,("Titania"  ,    788)
) | % {
    $s,$expected = $_
    $result = &$f $s
    $ratio = [Math]::Max($result/$expected, $expected/$result)
    $ratio*$ratio
}
$scriptLength = $f.ToString().Length - 2  # -4 if CRLF mode
$penaltyMax = ($penalty|Measure-Object -Maximum).Maximum
$score = $scriptLength * $penaltyMax
"$score = $scriptLength * $penaltyMax"

Çıktı:

152.731283431953 = 141 * 1.08320059171598

Açıklama:

  • İsimler sadece harfler, yarıçaplar rakamlar ve noktalar içerir. Böylece tüm verileri bir veri dizisine yazabilir ve regexp araması yapabiliriz.
  • Betik, tüm alt dizileri soldan sağa doğru arar ve bulunan son sonucu alır.
  • Veri dizesini azaltmak için girişin başlık olması gerekir.
  • end of line modeSadece LF olduğunu.

Örnek:

Titania         Triton         Titan
--------------  -------------  -------------
T       -> 1.3  T      -> 1.3  T      -> 1.3
Ti      -> 2.5  Tr     ->      Ti     -> 2.5
Tit     ->      Tri    ->      Tit    ->
Tita    ->      Trit   ->      Tita   ->
Titan   ->      Triton ->      Titan  ->
Titani  -> .8
Titania ->

Result is .8    Result is 1.3  Result is 2.5

Powershell, 178 bayt, puan 178

($args|% t*y|?{'Su696342J69911S58232U25362N24622Ea6371V6052Ma3390G2634Ti2575Me2440C2410I1822M1737Eu1561T1353P1186E1163H816Titani788'-cmatch"$(($y+=$_))(\d+)"}|%{+$Matches.1})[-1]

4

05AB1E , skor 100 66 60 ( 100 61 56 bayt )

•1∞²îc|I‰∍T‡sÇ3¡ò½в…»Ë•§•1ë£ñƒq£û¿’…•S£y¦¦ÇO96%49%25%èт*

Port OlivierGrégoire @ 'ın Java cevap bu ilk cevap gibi, emin olun eğer, bu yüzden de onu upvote için!
Titlecase girişi.

Tüm test durumlarını doğrulayın.


05AB1E , 100 puan (100 bayt )

•*Òâ%ÌÜS…Ùb‹Úi{e!]ɸ·vÌBUSηHã£āðxyµŠ•§•3«8¹ØмS7Ç•S£.•WùηƵ@,Sº,ûεβʒóÃX\¹Θäáá’Ý)”Ωož∞-z.A±D•3ôI2£Iθ«kè

Tam küçük harfle giriş yapın. Kesin yarıçapı verir, böylece ceza eklenmez.

Tüm test durumlarını doğrulayın.

Açıklama:

•*Òâ%ÌÜS…Ùb‹Úi{e!]ɸ·vÌBUSηHã£āðxyµŠ•
                   # Compressed integer 696342699115823225362246226371605233902634257524402410182217371561135311861163816788
 §                 # Casted to string (bug, should have been implicitly..)
  3«8¹ØмS7Ç•      # Compressed integer 65555444444444444433
   S               # Converted to a list of digits: [6,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3]
    £              # The first integer is split into parts of that size: ["696342","69911","58232","25362","24622","6371","6052","3390","2634","2575","2440","2410","1822","1737","1561","1353","1186","1163","816","788"]
     .•WùηƵ@,Sº,ûεβʒóÃX\¹Θäáá’Ý)”Ωož∞-z.A±D
                   # Compressed string "sunjursanursneeeahvesmasgaetinmeycaoioomoneuatrnploershaatia"
      3ô           # Split into parts of size 3: ["sun","jur","san","urs","nee","eah","ves","mas","gae","tin","mey","cao","ioo","mon","eua","trn","plo","ers","haa","tia"]
        I2£        # The first two characters of the input
           Iθ      # The last character of the input
             «     # Merged together
              k    # Get the index of this string in the list of strings
               è   # And use that index to index into the list of integers
                   # (and output the result implicitly)

Kullanılan 05AB1E ucuna bakın ( büyük tamsayılar nasıl sıkıştırılır? Ve sözlükte yer almayan dizgiler nasıl sıkıştırılır? ) Kullanılan sıkıştırmanın nasıl çalıştığını anlamak için.

Güneşi haritalayacak 70 baytlık bir alternatif yarattım. 600,000 ; [jüpiter, satürn] 'e 60,000; [uranüs, neptün] ila 30,000; [toprak, venüs] ila 6,000; [mars, ganymede, titan, cıva, callisto] 3,000; [io, moon, europa, triton, pluto, eris] 1,500; ve [haumea; titania] ila 750. Maalesef bu puan 117 oldu. Daha sonra alternatif bir yaklaşımla 100'ün altına düşüp düşemeyeceğimi göreceğim.


1
30 karakter yerine 25 karakterli bir dize kullanan daha iyi bir karma buldum. Bu cevabı güncellemek istiyorsanız Java cevabımı kontrol edin;)
Olivier Grégoire

@ OlivierGrégoire Heads-up için teşekkürler. -6 puan ve -7 bayt. :)
Kevin Cruijssen,

4

Mathematica, 57 bayt, puan = 62 58

-4 bayt / puan sayesinde Lirtosiast !

#&@@WolframAlpha[#<>" size km","Result"]]/._Missing->816&

Sadece Wolfram Alpha ortalama yarıçapı arar.


1
Hmm. Bu internet kullanımı sayılmaz mı? Mathematica aslında tüm WolframAlpha motorunu içermiyorsa
yalnızca ASCII,

@ ASCII-sadece demek istediğim, Mathematica'nın veri setlerine izin verilir ve WolframAlphaişlev en az dört kez kullanılmış ...
LegionMammal978

Hmm. Keyfi bir karar gibi görünüyor, başka dillerin arama motoru işlevleri eklemesini engelleyen ne? IMO veri setleri biraz farklı - hepsini indirmek o kadar büyük ki, merkezi bir sunucu ihtiyaç duyulduğunda size veriyor
ASCII-sadece

@ ASCII-sadece Endişeleniyorsanız, her zaman Meta hakkında bir soru gönderebilirsiniz.
LegionMammal978

@leg Bu durumda, veriler indirildikten sonra çevrimdışı kullanılabilir. Bu durumda, öyle değil.
user202729

4

Jöle , 28 bayt, skor = 31

“__ʋ7ṗ“RUu⁽NM\sOSJj[FL‘ḥ1.1*

Bu, @ lirtosiast'ın önerisinde Jelly'e eklediğim yerleşik bir karma kullanım kullanır.

Giriş titlecase'de, çıkış en az hatayla 1.1'in gücüdür.

Çevrimiçi deneyin!

Nasıl çalışır

Bu cevap sadece iki bölümden oluşmaktadır.

  • İlk olarak, “__ʋ7ṗ“RUu⁽NM\sOSJj[FL‘ḥ20 dahili girişin her birini 15 farklı tamsayıya eşlemek için yeni yerleşik kullanır.
  • Ardından, 1.1*1.1'i hesaplanan güce yükseltir.

“__ʋ7ṗ“RUu⁽NM\sOSJj[FL‘bir değişmez; alıntı olmayan her karakter Jelly'in kod sayfasındaki 0-tabanlı indeksi ile değiştirilir, .[95,95,169,55,242],[82,85,117,141,78,77,92,115,79,83,74,106,91,70,76]

Birleştirme yerleşik ilk önce her sayıyı artırarak bir tamsayıya eşler , ardından sonucu bijective base-250 basamak tamsayı olarak kabul eder ve ekler . Bu, verir[95,95,169,55,242]1376510639244 .

Sonuç kadar yarılanmasına ve bu tamsayı döşeme ile , bu dizi elde ileri farklılıklar vardır, .0[376510639244,188255319622,94127659811,47063829905,,5,2,1,0][188255319622,94127659811,47063829906,,3,1,1]

Daha sonra, SHAKE256-4096'yı , doğru argümanının iç gösteriminin dize gösterimine uyguladıktan sonra elde edilen 4096 bit'i 64-64 -bitlik parçalara bölen 64 64-bit tamsayılar üretiyoruz .

şimdi 39 farkın nokta çarpımını hesaplar ve ilk 39 üretilen 64-bit tamsayı, modulo hesaplar . Bu, değerinde bir tam sayı verir .264[0,264)

Liste , biz çarpma oluşturulan 15 ile tam sayıdır ve 64 daha yüksek alır, böylece uzunluğu 15 vardır sonucun bitleri. Bu, bir tam sayı verir , bu da listeye indekslemek için kullanırız.[82,85,117,141,78,77,92,115,79,83,74,106,91,70,76][0,15)

Uygun karma konfigürasyonu bulmak için , Jelly repo'nun bir parçası olan C'de kaba bir kuvvetlendirici kullandım .


3

Python 2 , 155 bayt, puan = 155

lambda p:int('G11KK54222111111XXNM8MCO37WQ53YXHE93V8BIF2IMH1WU9KPU2MLN    HGR'['uSJJaSrUNNrEnVsMeGtTMMoCoInMuErTuPsEaHTT'.find(p[7%len(p)]+p[0])/2::20],35)

Çevrimiçi deneyin!

Şaşırtıcı bir şekilde bu tembel çözüm için de ... iyileştirmeye bakacağız. ;-)


3

Japt , 86 bayt, puan = 94

g5 ¥'i?788:[7*A³7*L6*LG²G²IIÉHÄDÑDÑCÑCÑGÄÄGÄGECC8]g`suj«a¨Ì¼và@ã/eÖô¶e©rp¤r`bU¯2)z)*L

Tüm girişler için deneyin , skor hesaplayın veya en yüksek hatayı kontrol

Olivier'in orijinal cevabına çok benzer. Giriş tamamen küçük harflidir.

Çıktı değerlerinde yapılan çeşitli iyileştirmelerden sonra, mevcut en yüksek hata% 4'ün üzerinde Venüs'tür.

Şimdi işlerin biraz daha istikrarlı olduğunu açıklayın:

¤¥`Éa`?                             :If the fifth character of the input is 'i':
       788                          : Output 788.
          :                         :Otherwise:
           [...]                    : From the array representing radii
                g                   : Get the value at the index:
                 `...`              :  In the string representing names
                      b             :  Find the first index where this string appears:
                       U¯2)         :   The first two characters of the input
                           z)       :  And divide it by two
                             *L     : Multiply that value by 100

Adları için dize olan sujusaurneeavemagatimecaiomoeutrplerhaJapt en dahili içinde sıkıştırma kullanılarak sıkıştırılır. Yarıçapı temsil eden sayılar şöyle hesaplanır:

                          My value | Actual value
                          ---------+-------------
7 * 10 ^ 3 = 7000 * 100 =   700000 | 696342
7 * 100    = 700  * 100 =    70000 |  69911
6 * 100    = 600  * 100 =    60000 |  58232
16 * 16    = 256  * 100 =    25600 |  25362
16 * 16    = 256  * 100 =    25600 |  24622
64         = 64   * 100 =     6400 |   6371
64 - 1     = 63   * 100 =     6300 |   6052
32 + 1     = 33   * 100 =     3300 |   3390
13 * 2     = 26   * 100 =     2600 |   2634
13 * 2     = 26   * 100 =     2600 |   2575
12 * 2     = 24   * 100 =     2400 |   2440
12 * 2     = 24   * 100 =     2400 |   2410
16 + 1 + 1 = 18   * 100 =     1800 |   1822
16 + 1     = 17   * 100 =     1700 |   1737
16         = 16   * 100 =     1600 |   1561
14         = 14   * 100 =     1400 |   1353
12         = 12   * 100 =     1200 |   1186
12         = 12   * 100 =     1200 |   1163
8          = 8    * 100 =      800 |    816
788                     =      788 |    788

3

Japt, 77 76 75 bayt, puan = 75

Bu konuda ilk geçiş; Çalışmak için kendime bir temel oluşturmak için 0 ceza çözümü denemek istedim. 0 ceza için hala iyileştirmeler yapılabileceğini görmek için yarın tekrar geleceğim.

Giriş büyük / küçük harf duyarlı değildir.

n35 %87%52 g"..."ò)mc

Deneyin veya tüm girişleri test edin

"..."Birçok unprintables içeren bir dize temsil eder. Kod noktaları:

32,32,15,61,11,86,696,342,25,75,699,11,33,90,63,71,24,10,24,40,253,62,60,52,32,32,8,16,11,63,32,32,32,32,58,232,17,37,135,3,246,22,18,22,26,34,7,88

Hızlı bir açıklama yapmak için: dize 2 karakterden oluşan parçalara bölünür. Daha sonra ovs'un formülünün bir kısmını ve bazı indeks sarmalarını kullanarak bu dizine indeksliyoruz ve sonra 2 karakteri kod noktalarına eşliyoruz.

  • ETH sayesinde bir bayt / nokta kaydetti

54 bayt, puan = 58

Olivier'in çözümünün limanı .

"ýCĄ (ᬺ!˂Fɍ"cU¤¬xc %96%49)-7 *L

Tüm girişleri test et


İlk girişi (# 23) ait olduğu yere %24
taşıyarak

@ETHproductions, bu işe görünmüyor
Shaggy


@ETHproductions: Ah, evet, sadece dizinin başlangıcına bir yer tutucu öğe eklemem gerekeceği için kendimden kaçtım. Teşekkürler.
Shaggy

3

Ruby , 105 bayt, skor 109

->n{7E5/('!)"0 r&zZ&1#}3Mfh-~~d@'[0,j=" =1&%)AM<I>2,-B#($D  7@".index((n[1,9].sum%50+34).chr)].sum-j*32)}

Çevrimiçi deneyin!

700000'i yarıçapa bölersek, makul derecede lineer bir şekilde yükselen bir dizi elde ederiz (düzensiz olsa da). Aşağıdaki tablodaki artışlara, karakterlerin ASCII değerleri ile yaklaşılabilir. Bu yaklaşımla ilgili problem, girişin farklı isimleri boyuta göre sıralayan bir değere dekode edilmesini gerektirmesidir.

Küçük bir sorun, Eris ve Haumea arasındaki farkın oldukça büyük olmasıdır. ~~dBu artışı yalnızca ASCII biçiminde kodlamak için üç karakter gerekir. Gezegen-dizin dizesinde, dizini doldurmak için iki "hayalet gezegen" alanı vardır.

700000/r    increment from previous
0.994774    
9.960407    8.965633
11.95806    1.997657
27.45612    15.49805
28.28129    0.825178
109.2987    81.0174
115.0598    5.761118
205.4106    90.3508
264.3667    58.95612
270.4241    6.057335
285.3861    14.96199
288.9386    3.552524
382.1855    93.24692
400.8877    18.70223
446.0871    45.19939
514.6652    68.57806
587.1349    72.46972
598.7463    11.61144
853.3603    254.6139
883.6827    30.32245

3

T-SQL, 203 202 201 196 bayt, skor = 217 216 212 208

SELECT IIF(v='Titan',13,STUFF(value,1,2,''))*198
FROM i,STRING_SPLIT('Ca12,Ea32,Er6,Eu8,Ga13,Ha4,Io9,Ju353,Ma17,Me12,Mo9,Ne124,Pl6,Sa294,Su3517,Ti4,Tr7,Ur128,Ve31',',')
WHERE LEFT(v,2)=LEFT(value,2)

Satır sonları yalnızca okunabilirlik içindir.

Girdi önceden var olan Tablo üzerinden alınır i varchar sütunu ile v , bizim ES standartlarına göre .

Giriş tablosunu ilk iki karakterdeki bellek içi bir tabloya ekler ve kalan basamakları x100 olarak döndürür.

"Titan" ı kullanarak özel bir durum olarak ele alır IIF.

EDIT : STUFFİlk iki karakteri silmek için kullanarak 1 bayt (ve 1 puan) kaydedildi SUBSTRING. Teşekkürler, t-clausen.dk!

2. DÜZENLEME : Her bir arama değerini 100 yerine 99 ile çarparak başka bir baytı kurtarmaya kalkıştığımda ne olacağını görmek istedim ve şaşkınlığa göre doğruluk oranını (en az doğru olanı) arttırdığını gördüm .

Bu beni bazı deneme yanılma testlerine ve bazı süslü Excel what-if veri tablolarına götürdü, burada 89'un çarpanını kullanarak en uygun çözümü buldum. (elbette tüm depolanan değerleri değiştirdim).

Bu beni sadece bir bayt kurtarırken, aslında önceki çözümümden aldığım puanı 4,6 arttırıyor .

EDIT 3 : Düşük yerine daha yüksek arandı ve daha da iyi bir çarpma faktörü buldu, 198 . Kaydedilen dizgimi birkaç karakter kısaltırken, puanımı artıran değerler makul derecede doğru.


1

2

PowerShell , 203 bayt, skor 203

param($a)if($a-eq'Titan'){2575;exit}(696342,69911,58232,25362,24622,6371,6052,3390,2634,2440,2410,1822,1737,1561,1353,1186,1163,816,788)["SuJuSaUrNeEaVeMaGaMeCaIoMoEuTrPlErHaTi".indexOf(-join$a[0..1])/2]

Çevrimiçi deneyin!

Olivier'in cevabına çok benzer, şimdi onu gördüm ama bağımsız olarak geliştim.


1

Kömür , 101 bayt, skor = 101

I⍘§⪪“_″FJ⁼⦄b\l≕)T‹#⊙xO-nη⁻À↓ζ↥ς§%H8H“ρj✳Hρl× S↶…|UD⎇LkfZ”³⌕⪪”@/rjmq_↙§E▶νF↨oº⁷÷K⁻eDH:_Tbk¦�”²⁺§θ⁰§θχγ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

⁺§θ⁰§θχ

Giriş dizesinin 1. ve 11. karakterlerini (döngüsel olarak) alın ve birleştirin.

⌕⪪”@/rjmq_↙§E▶νF↨oº⁷÷K⁻eDH:_Tbk¦�”²

Onları SuJiSrUuNtEEVVMrGnTTMcClIIMoEpToPPEiHeTakarakter çiftlerine bölünmüş dizgede arayın .

§⪪“_″FJ⁼⦄b\l≕)T‹#⊙xO-nη⁻À↓ζ↥ς§%H8H“ρj✳Hρl× S↶…|UD⎇LkfZ”³

Dize m.w'fv&J|\"l|\"e1 c& _c Ca ;e ;* 9a 9C 31 2; 0I .7 ,N ,7 (X (<üç karakterden oluşan gruplara bölün ve ilgili grubu alın.

I⍘ ... γ

Hane olarak ayarlanan yazdırılabilir ASCII karakterini kullanarak sonucu bir taban-95 numarası olarak çözün. Örnek: Io'in 11th karakterdir Ibiz bakmak yüzden, IIve 13. büyük nesne var ve bunun boyutu bulmak 31için eşler hangi 19 * 95 + 17 = 1822.


1

Swift 4 , 225 bayt, puan = 241

Muhtemelen bir avuç daha golf oynayabilir (belki de "Ga-Me-Ca" bölgesinde?), Fakat Swift sıklıkla kullanılmaz (bir nedenle, belki.)

func b(i:String){print(i=="Titan" ?2575:["Su":6963,"Ju":699,"Sa":582,"Ur":253,"Ne":246,"Ea":63,"Ve":60,"Ma":33,"Ga":26,"Me":24,"Ca":24,"Io":18,"Mo":17,"Eu":16,"Tr":14,"Pl":12,"Er":12,"Ha":8,"Ti":8][String(i.prefix(2))]!*100)}

ve asılsız

func size(ofAstralObject object: String) {
  let objectToRadius = // Map size/100 of all objects to the first two chars
   ["Su":6963,
    "Ju":699,
    "Sa":582,
    "Ur":253,
    "Ne":246,
    "Ea":63,
    "Ve":60,
    "Ma":33,
    "Ga":26,
    "Me":24,
    "Ca":24,
    "Io":18,
    "Mo":17,
    "Eu":16,
    "Tr":14,
    "Pl":12,
    "Er":12,
    "Ha":8,
    "Ti":8] // Ti is Titania, while Titan is treated differently

  print(object == "Titan" ? 
    2575 : // If "Titan", print the exact size
    objectToRadius[String(i.prefix(2))]!*100 // get the size from the map and multiply by 100
  )
}

Çevrimiçi Deneyin!

Harita için farklı "anahtar ebatları" denedim, ama elbette 1'de birçok çatışma var ve üç karakter kullanmak bana i=="Titan" ?2575:17 karakter kazandırmıyor, çünkü yönetmek için "Io" var (ve 3 karakterden fazlasını alacak, Bence).


1

JavaScript (ES6), 152 bayt, puan = 163

Oldukça standart bir çözüm, ama yine de zorlukların tadını çıkardım!

s=>s=='Titan'?2575:[6963,699,582,254,246,64,60,34,26,24,24,18,17,16,14,12,12,8,8]["SuJuSaUrNeEaVeMaGaMeCaIoMoEuTrPlErHaTi".match(s[0]+s[1]).index/2]*100

Puanım:

Max. penalty ratio = 1.07068 for Triton
Score = ceil(152 x 1.07068) = 163

Çevrimiçi Deneyin!


1

YANLIŞ , 152 bayt, Puan = 563

[911*.]^$0\[~][1+^]#$$2=\$4=\8=||[2 0!]?$3=[764 0!]?$5=[\$$69=\86=|$[6\]?~[2]?0!]?$6=[\$$83=\85=|$[46\]?~[$72=$[1\]?~[2]?]?0!]?$7=[\$84=$[1\]?~[52]?0!]?

Uzunluğu ve ilk harfleri kullanarak tembel cevap, ama benim bahanem tuhaf bir dil kullanıyorum

Çevrimiçi deneyin! (kopya kodu kodu yapıştır, göster'e bas ve çalıştır)

[911*.]          {defines a function that multiplies a number by 911 and then prints it}
^$0\[~][1+^]#    {counts the length of the name as it's input, also records the first char}
$$2=\$4=\8=||[1 0!]?  {if the name is 2, 4, or 8 chars long print 911*2 (0! calls the function)}
$3=[764 0!]?          {if name is 3 long print 911*764}
$5=[\$$69=\86=|$[6\]?~[2]?0!]? {5 long? print 911*6 if it starts with E or V, otherwise *2}
$6=[\$$83=\85=|$[46\]?~[       {6 long? print 911*46 if it starts with S or U, otherwise:}
    $72=$[1\]?~[2]?            {if name starts with H print 911*1 else *2
]?0!]?
$7=[\$84=$[1\]?~[26]?0!]?      {7 long? print 1822*1 if it starts with NT otherwise *26 (for jupiter}

Benim sonuçlarım:

Sun       : 696004.00 penalty ratio = (696342.00 / 696004.00 )² = 1.00097
Jupiter   : 47372.00  penalty ratio = (69911.00  / 47372.00  )² = 2.17795
Saturn    : 41906.00  penalty ratio = (58232.00  / 41906.00  )² = 1.93095
Uranus    : 41906.00  penalty ratio = (41906.00  / 25362.00  )² = 2.73014
Neptune   : 47372.00  penalty ratio = (47372.00  / 24622.00  )² = 3.70166
Earth     : 5466.00   penalty ratio = (6371.00   / 5466.00   )² = 1.35855
Venus     : 5466.00   penalty ratio = (6052.00   / 5466.00   )² = 1.22591
Mars      : 1822.00   penalty ratio = (3390.00   / 1822.00   )² = 3.46181
Ganymede  : 1822.00   penalty ratio = (2634.00   / 1822.00   )² = 2.08994
Titan     : 1822.00   penalty ratio = (2575.00   / 1822.00   )² = 1.99737
Mercury   : 1822.00   penalty ratio = (2440.00   / 1822.00   )² = 1.79342
Callisto  : 1822.00   penalty ratio = (2410.00   / 1822.00   )² = 1.74959
Io        : 1822.00   penalty ratio = (1822.00   / 1822.00   )² = 1.00000
Moon      : 1822.00   penalty ratio = (1822.00   / 1737.00   )² = 1.10026
Europa    : 1822.00   penalty ratio = (1822.00   / 1561.00   )² = 1.36236
Triton    : 1822.00   penalty ratio = (1822.00   / 1353.00   )² = 1.81343
Pluto     : 1822.00   penalty ratio = (1822.00   / 1186.00   )² = 2.36008
Eris      : 1822.00   penalty ratio = (1822.00   / 1163.00   )² = 2.45435
Haumea    : 911.00    penalty ratio = (911.00    / 816.00    )² = 1.24640
Titania   : 911.00    penalty ratio = (911.00    / 788.00    )² = 1.33655

Max. penalty ratio = 3.70166 for Neptune
Score = ceil(152 x 3.70166) = 563

1634

Haumea için özel bir dava açmak yerine 1822'nin (911) yarısını kullanması için güncelledim, bu yüzden bu tavsiye artık işe yaramaz. 817'yi (1634'ün yarısı) kullanmayı denedim ama iyi değildi. Sihrinizi çalışmak ve yeni en uygun sayıyı bulmak istiyorsanız çekinmeyin.
Terjerber

1

C (gcc) , 118 bayt, skor = 135

i;f(char*s){i=exp((strchr("(~?_q#m#.(`(=*2,r-v.h2z2p3d3j6>Qb>a?{Qx]",(*s^s[1]*4)+(strlen(s)!=5)&127|32)[1]+55)/13.5);}

Çevrimiçi deneyin!

puanlama

Bitkin

Nesne adı, hantal bir işlemle tek karakterli bir karmaya dönüştürülür.

(((*s ^ s[1] << 2) + (strlen(s) != 5)) & 127) | 32

bloğu ana suçlu olarak "Titan" / "Titania" ya işaret ediyor. Karmadaki son karakterin dahil edilmesi düşünüldü, ancak bu hala gereklistrlen() C . Karma karakterin ilk oluşumu karma / veri dizgisinde aranır. Bulduğunda, bir sonraki karakter alınır ve söz konusu nesnenin yarıçapını yaklaşık olarak belirlemek için kullanılır.

Veri karakteri yarıçapın kaydırılmış, ölçeklendirilmiş doğal logaritmasını tutar. Böyle üretilenler:

for (int i = 0; i < 20; i++)
    data[i] = log(radii[i]) * 13.5 - 55;

Ölçek, son derece bilimsel deneme yanılma ve ters eğik çizgileri önlerken değeri yazdırılabilir ASCII aralığına getirme kayması ile seçildi. Bazı karma / veri çarpışmalarından dolayı dizedeki nesnelerin yeniden düzenlenmesi gerekliydi.

i;                                      Return value
f(char*s){                              s is object name
    i=                                  Implicit return
    exp(                                Raise e to some power
        (
            strchr(                     Find hash
                "...",                  Hash/data string
                (*s^s[1]*4)+            Calculate...
                (strlen(s)!=5)&127|32   ...hash
            )
            [1]                         Char following hash holds the power
            +55                         Shift it
        )/13.5                          Scale it
    );                                  Use it
}                                       Exit

0

Python 2 , 89 bayt, Puan = 234

lambda(p):39**4/'zzuSJJaSrUNNrEnVsMeGtTMMoCoInMuErTuPsEaHTT'.find(p[7%len(p)]+p[0])**2.18

Çevrimiçi deneyin!

Gönderilen cevapların çoğu bir "kodlama / kod çözme" stratejisi kullanmış gibi görünüyor. Basit bir denklem kullanarak gök cisimlerinin çapını tahmin ederek ne kadar iyi yapabileceğimi merak ettim. Eğlenceli bir egzersiz oldu, ancak orta seviye bayt tasarrufları doğruluk cezasından kaynaklanıyor.

Bu çözümün özü tahmin eden denklemdir:

Radius = 39**4/x**2.18

buradaki x, vücut yarıçapının sıra sırasının iki katıdır.

Outgolfer'ın Python 2 çözümü @Erik'in bir modifikasyonunu kullanarak giriş dizgisine dayanarak x değerini üretiyorum. Denklemlerimi [1..40] yerine [2..40] ile çalışarak tekrar ederek kodundan birkaç bayt kurtardım.

Sıralama emirleri üretme kodu tüm çözümün baytlarının 2 / 3'ünden fazlasını alır. Herhangi biri daha kompakt bir sıralama üretme biçimine sahipse, bu çözüm daha da kısaltılabilir. Kesinlik cezası nedeniyle (2.6 civarında), skor biraz iyileşebilirdi.

Denklem Oluşturma

Her vücudun büyüklüğünü tahmin etmek için basit denklemler aramak için istatistiksel yöntemleri kullandım. @Level River St'in Ruby çözümündeki içgörülerden ve genelleştirmelerden sonra, formun denklemlerine yer verdim:

Radius = A/(Rank)**B

R'de çalışırken, ilk tahminleri geliştirmek için yarıçap kütüğündeki doğrusal modelleri kullandım ve daha sonra doğrusal olmayan modellerin optimizasyonunu, lineer modellerin sonuçlarıyla optimizasyona ekledim. sorun.

Yukarıdaki denklemde A'nın tahmini değeri yedi hanedir, bu yüzden birkaç bayttan tasarruf etmek için basit bir ifade aradım. Form ifadelerini aradım

x**y

iki basamaklı x ve 1 basamaklı y için (toplam beş bayt için, A'nın optimum değerinden çok farklı olmayan ve cezayı çok fazla şişirmemiş olan iki bayt veya yaklaşık beş puan tasarruf) (aksi takdirde açıklanamaz) ile:

39**4

Puanlama algoritması bu yönteme gerçekten zarar veriyor gibi görünüyor - L2 veya L1 hata normları altında daha iyi olacağını tahmin ediyorum. Yine de isimleri boşa harcıyorsun.
lirtosiast

@lirtosiast Her iki noktayı da kabul edin. İlginçtir ki, en az kareler uyması (L2 normu) bu puanlama algoritması altında da oldukça iyidir. Bulduğum en iyi denklemden sadece% 5 daha kötü bir ceza aldı. İsimleri saklarken: Metin girişinden artan bir sayı dizisi oluşturmanın daha kompakt bir yolunu bulamadım. Diğer cevaplarda alınan modulo aritmetik yaklaşımları düzeni rastgele belirler.
CCB60

0

TI-BASIC (TI-84), 285 bayt, Puan = 285

Ans→Str1:{696342,69911,58232,25362,24622,6371,6052,3390,2634,2575,2440,2410,1822,1737,1561,1353,1186,1163,816,788:Ans(-int(-.125inString("SUN     JUPITER SATURN  URANUS  NEPTUNE EARTH   VENUS   MARS    GANYMEDETITAN   MERCURY CALLISTOIO      MOON    EUROPA  TRITON  PLUTO   ERIS    HAUMEA  TITANIA",Str1

Basit bir "dizgede dizine dizin" programı. Daha fazla golf yapılabilir.

Giriş, Anstam büyük harflerle yazılmış nesnelerin adlarından biridir.
Çıktı geldi Ansve otomatik olarak yazdırıldı.

Örnek:

"MOON
MOON
prgmCDGFC
            1737
"IO
IO
prgmCDGFC
            1822

Açıklama:
(Radii listesi ve ad dizisi kısalık için kısaltılmıştır. ...Listenin / dizinin geri kalanını belirtmek için kullanılır.)

Ans→Str1:{696342,69911,5...:Ans(-int(-.125inString("SUN     JU...",Str1  ;complete source

Ans→Str1                                                                 ;store the input string
                                                                         ; in "Str1"
         {696342,69911,5...                                              ;generate the list of
                                                                         ; radii and leave it in
                                                                         ; "Ans"
                                          inString("SUM     JU...",Str1  ;get the index of the
                                                                         ; input string in the
                                                                         ; name string
                                      .125                               ;multiply the index by 1/8
                                -int(-                                   ;then round it towards
                                                                         ; positive infinity
                            Ans(                                         ;use the result as the
                                                                         ; index of the radii list

Görsel Model:

Ans→Str1                                            ;Ans = "MOON"
                                                    ;Str1 = "MOON"

{696342,69911,5...                                  ;Ans = {696232 69911 ... }
                                                    ;Str1 = "MOON"

inString("SUN      JU...",Str1                      ;Ans = {696232 69911 ... }
                                                    ;Str1 = "MOON"
                                                    ;current evaluation: 105

.125                                                ;Ans = {696232 69911 ... }
                                                    ;current evaluation: 13.125

-int(-                                              ;Ans = {696232 69911 ... }
                                                    ;current evaluation: 14

Ans(                                                ;Ans = 1737
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.