Khi chúng ta đi du lịch vũ trụ


48

Bạn sẽ được đặt tên của một trong 20 vật thể lớn nhất trong Hệ Mặt Trời. Nhiệm vụ của bạn là trả về xấp xỉ bán kính của nó, tính bằng km.

Đây là một trong đó điểm của bạn bao gồm độ dài mã của bạn (tính bằng byte) nhân với tỷ lệ phạt , dựa trên xấp xỉ tệ nhất của bạn. Do đó, điểm thấp nhất sẽ thắng .1

"Khi chúng ta du hành vũ trụ" là dòng cuối cùng của bài hát Planet Caravan của Black Sabbath , sau này cũng được Pantera trình bày .

Các đối tượng hệ mặt trời

Nguồn: Wikipedia

NB: Thứ hạng được đưa ra chỉ cho thông tin. Đầu vào là tên của đối tượng.

  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

Hoặc như danh sách thân thiện sao chép-dán:

'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

Số điểm của bạn

Đặt là bán kính dự kiến ​​của đối tượng và để là câu trả lời của chương trình của bạn cho đối tượng này.RnnthAn

Sau đó, điểm số của bạn được xác định là:

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

Trong đó là độ dài mã của bạn tính bằng byte.L

Thí dụ:

Nếu kích thước mã của bạn là byte và xấp xỉ tồi tệ nhất của bạn là trên Mặt trăng với bán kính ước tính km thay vì km, thì điểm của bạn sẽ là:10010001737

S=100×(17371000)2=302

Càng thấp, càng tốt.

Tiêu đề đề xuất cho câu trả lời của bạn:

Language, 100 bytes, score = 302

Bạn có thể sử dụng tập lệnh này để tính điểm của bạn (dòng đầu tiên = độ dài mã, 20 dòng tiếp theo = kết quả đầu ra của bạn, từ Sun đến Titania).

Quy tắc

  • Bạn có thể lấy tên của đối tượng bằng chữ thường, chữ hoa đầy đủ hoặc chính xác như được mô tả ở trên (trường hợp tiêu đề). Các trường hợp hỗn hợp khác không được phép.
  • Đầu vào được đảm bảo là một trong 20 tên có thể.
  • Bạn có thể trả về số nguyên hoặc số float. Trong cả hai trường hợp, hình phạt phải được tính trực tiếp với các giá trị này (không phải giá trị làm tròn trong trường hợp nổi).
  • Bạn phải trả lại giá trị tích cực.
  • Chương trình trống không được phép.

2
Hộp cát (hiện đã bị xóa). Cảm ơn tất cả những người đã cung cấp phản hồi và đặc biệt là xnor vì đã giúp sửa công thức tính điểm.
Arnauld

1
Tôi thấy điểm số đã được thay đổi thành sức mạnh của 2 cho khác biệt? Trong trường hợp đó, câu trả lời chính xác 100 byte của tôi ngắn hơn xấp xỉ 70 byte của tôi (đã đạt 91 điểm trước đó, nhưng bây giờ là 117 ..)
Kevin Cruijssen

1
@KevinCruijssen Ý tưởng đằng sau đó là ngăn chặn các câu trả lời cực ngắn (về cơ bản trả lại 1 hoặc 2 hằng số) để bị phạt bởi một yếu tố hợp lý và có khả năng giành chiến thắng trước những câu hỏi phức tạp hơn.
Arnauld

2
Tôi chấp nhận hình vuông trong chức năng cho điểm. Kết quả tốt nhất trước đây của tôi là số điểm 60 sử dụng 2 byte để có được 7512tất cả các trường hợp thử nghiệm. Tôi sẽ xem liệu tôi có sớm tạo ra giải pháp MathGolf hay không, nhưng sẽ khó để đánh bại 05AB1E.
maxb

2
@maxb Bạn sẽ phải đánh bại số điểm của Jelly là 37, chứ không phải số điểm của 60AB1E là 60; p
Kevin Cruijssen

Câu trả lời:


28

PowerShell , 3 byte, điểm 3637

2e4

Hãy thử trực tuyến!

Rất ngây thơ, nhàm chán, thực hiện; chỉ trả về 20000bất kể đầu vào. Thử nghiệm với những thứ như vỏ mặt trời đặc biệt hoặc sử dụng các giá trị dấu phẩy động thay vì 2tất cả dẫn đến điểm kém hơn vì độ dài của mã tăng đủ để bù bất kỳ mức tăng so sánh kích thước nào.


3
Đó là tất cả những gì bạn cần biết về KPI :)
mazzy

12
Tại sao điều này nhận được nhiều phiếu như vậy?!
Xù xì

11
@Shaggy Tôi cũng bối rối về điều đó ..: S Đó là câu trả lời cho điểm cao nhất và lười biếng nhất (đừng coi đó là admBorkBork cá nhân , nhưng tôi nghĩ rằng các câu trả lời của Jelly và Java xứng đáng được nâng cao hơn rất nhiều). Mọi người có lẽ chỉ nhìn thấy phần 3 byte (hoặc nghĩ rằng điểm cao hơn là tốt hơn thấp hơn) và bỏ qua mọi thứ khác. xD Trong mô tả thử thách ban đầu của Arnauld trong Sandbox, câu trả lời này thậm chí sẽ không thể thực hiện được, vì nó cho phép tỷ lệ lỗi tối đa 95% cho mỗi I / O. À Thưởng thức các đại diện miễn phí admBorkBork . ;)
Kevin Cruijssen

6
Nó không phù hợp với tiêu chí của câu hỏi mặc dù. Tôi nghĩ mọi người bỏ phiếu vì nó quá rõ ràng, nhiều người sẽ không nghĩ về nó. Nó cũng biểu thị một thách thức với một hệ thống xếp hạng thiếu sót, nếu nó có thể bị lạm dụng theo cách đó.
Elcan

9
Mọi người ủng hộ PPCG vì tất cả các lý do, không chỉ vì điểm số thô (xem câu trả lời đá đỏ Minecraft khổng lồ của tôi chẳng hạn ). Tôi đã đưa ra câu trả lời này vì đây là một ví dụ đơn giản, rõ ràng về sự kết thúc của phổ chiến lược (phổ giữa "trả về giá trị chính xác" so với "lưu byte để trả về xấp xỉ và chịu phạt").
BradC

25

Jelly , 34 byte, điểm = 37

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

Đầu vào là chữ hoa, đầu ra là sức mạnh 1.1 với ít lỗi nhất.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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 byte, điểm = 97

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

Hãy thử trực tuyến!

  • Mục nhập này sử dụng cả các ký tự Unicode không thể phát và nhiều byte (tuy nhiên Java vẫn chấp nhận chúng). Kiểm tra TIO cho mã chính xác.
  • Đầu vào phải là trường hợp tiêu đề.
  • Mã này làm tròn các giá trị thành bội số tốt nhất của 100 (đôi khi tăng, đôi khi xuống) để hai chữ số cuối có thể được bỏ qua khi được mã hóa và sau đó giá trị có thể được xấp xỉ bằng cách nhân với 100.
  • Mục này sử dụng các giá trị băm khác nhau để phù hợp với chuỗi 25 điểm mã (chuỗi ngắn nhất tôi có thể tìm thấy).

Tín dụng

  • -48 điểm (-45 byte) nhờ Kevin Cruijssen bằng cách mã hóa các bán kính (chia cho 100) trực tiếp Stringthay vì mã hóa chúng trong một intmảng rõ ràng ..


Cảm ơn @KevinCruijssen! Đó là một sân golf đẹp, sử dụng các ký tự unicode trong một chuỗi thay vì một mảng các giá trị thập phân. :-)
Olivier Grégoire

Vui mừng tôi có thể giúp đỡ, và câu trả lời tốt đẹp! :) PS: Về lý do tại sao tôi thêm (...-7): Nhân vật không thể in (char)0được để trống nên tôi phải thêm một cái gì đó. Lần đầu tiên tôi đã thử 98là các chữ số đơn, nhưng 9đã đưa ra các tab tất nhiên, yêu cầu nhiều \t(2 byte mỗi thẻ) và 8đưa ra lỗi về một ký tự không được giải mã được sử dụng.
Kevin Cruijssen

@KevinCruijssen Thành thật mà nói, tôi đã cố gắng trong vài giờ hôm qua để có được các giá trị tốt hơn bằng cách mở rộng phép nhân của bạn thành *100-700và chơi với các giá trị dưới dạng chuỗi và hai số đó, nhưng thực tế, một số giá trị có thể làm giảm byte đếm, nhưng sau đó điểm vẫn giữ nguyên. Vì vậy, việc xác định chính xác ngẫu nhiên đã tạo ra (một trong) trường hợp tốt nhất;)
Olivier Grégoire

Nói về không thể chơi được! Mục này thực sự kỳ lạ với Firefox của tôi đến mức tôi thực sự không thể đọc phần còn lại của trang một cách chính xác :-(
Neil

9

Ngôn ngữ Wolfram 114 103 97 88 86 82 byte. điểm = 114 103 97 89 87 83 điểm

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

Ít nhất 6 điểm được lưu nhờ Dennis, một vài lời cảm ơn lirtosiastvà 6 điểm nữa nhờ user202729.

Mặc dù Mathematica có thể lấy dữ liệu hệ mặt trời (cũng như nhiều dữ liệu thiên văn bổ sung), một số điều chỉnh nhỏ là cần thiết, như được giải thích dưới đây.

Interpreter[#,"AstronomicalObject"]&sẽ trả về thực thể (tức là đối tượng tính toán máy) được liên kết với thuật ngữ được đại diện bởi #.

EntityValue[AstronomicalObject[],"Radius"]trả về bán kính, tính bằng dặm, của đơn vị. Trong trường hợp "Haumea", giá trị, 816,27 (tức là 507 * 1,61), được trả về.

Nhân của bán kính bằng cách 1.61cải đạo từ dặm đến km. Các giá trị thập phân, thay vì số nguyên, chiếm ít hơn 1% lỗi, ngay cả trong trường hợp cực đoan nhất.

[[1]]trả về độ lớn mà không có đơn vị, km. Điều này sau đó đã được thay đổi thành #&@@, mang lại kết quả tương tự.


1
Một con sói khác được xây dựng. Giống như phát hiện hạ cấp
OganM

Tôi đã trả lời nhưng tôi không biết ngôn ngữ wolfram lol
Quintec

Trên thực tế, điều này cũng yêu cầu kết nối internet (được thử nghiệm vào ngày 10.2)
user202729

@ user202729, Hai gợi ý cuối cùng của bạn, hữu ích, hiện được tích hợp. Sử dụng các thực thể giám tuyển, chẳng hạn như các cơ quan thiên văn, thực sự yêu cầu kết nối internet.
DavidC

1
Ugh, nó đơn vị mặc định đối với bán kính là dặm? Ít nhất nó có các đơn vị mặc định (tức là số liệu) cho khối lượng ...
Neil


6

Powershell, 150 141 byte, điểm số 163 153

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

Hãy thử trực tuyến!

Kịch bản thử nghiệm:

$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"

Đầu ra:

152.731283431953 = 141 * 1.08320059171598

Giải trình:

  • Tên chỉ chứa các chữ cái, bán kính chứa chữ số và dấu chấm. Vì vậy, chúng ta có thể viết tất cả dữ liệu trong một chuỗi dữ liệu và thực hiện tìm kiếm regrec.
  • Kịch bản tìm kiếm tất cả các chuỗi con từ trái sang phải và nhận kết quả cuối cùng được tìm thấy.
  • Đầu vào phải là trường hợp tiêu đề để giảm chuỗi dữ liệu.
  • Chỉ end of line modelà LF.

Thí dụ:

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 byte, điểm 178

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

4

05AB1E , điểm 100 66 60 ( 100 61 56 byte )

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

Câu trả lời Java của cảng @ OlivierGrégoire , vì vậy nếu bạn thích câu trả lời đầu tiên này, hãy đảm bảo nâng cao anh ấy!
Đầu vào trong Titlecase.

Xác nhận tất cả các trường hợp thử nghiệm.


05AB1E , điểm 100 (100 byte )

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

Nhập bằng chữ thường. Xuất ra bán kính chính xác, do đó không có hình phạt nào được thêm vào.

Xác nhận tất cả các trường hợp thử nghiệm.

Giải trình:

•*Òâ%ÌÜ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)

Xem mẹo 05AB1E này của tôi (phần Cách nén số nguyên lớn?Cách nén chuỗi không phải là một phần của từ điển? ) Để hiểu cách nén được sử dụng.

Tôi đã tạo ra một thay thế 70 byte sẽ ánh xạ mặt trời tới 600,000; [jupiter, saturn] đến 60,000; [uranus, neptune] đến 30,000; [đất, venus] đến 6,000; [sao hỏa, ganymede, titan, thủy ngân, callisto] đến 3,000; [io, mặt trăng, europa, triton, pluto, eris] đến 1,500; và [haumea; Titania] đến 750. Thật không may, nó có số điểm 117. Tôi sẽ xem liệu tôi có thể đạt được dưới 100 với cách tiếp cận khác không.


1
Tôi tìm thấy một hàm băm tốt hơn sử dụng chuỗi 25 ký tự thay vì chuỗi 30 ký tự. Kiểm tra câu trả lời Java của tôi nếu bạn muốn cập nhật câu trả lời này;)
Olivier Grégoire

@ OlivierGrégoire Cảm ơn bạn đã ủng hộ. -6 điểm và -7 byte. :)
Kevin Cruijssen

4

Toán học, 57 byte, điểm = 62 58

-4 byte / điểm nhờ vào lirtosiast !

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

Chỉ cần tìm kiếm Wolfram Alpha cho bán kính trung bình.


1
Hừm. Điều này không được tính là sử dụng internet? Trừ khi Mathicala thực sự có chứa toàn bộ động cơ WolframAlpha
ASCII - chỉ

@ ASCII-duy nhất tôi có nghĩa là, tập hợp dữ liệu của Mathematica được phép , và các WolframAlphachức năng đã được sử dụng tại ít nhất bốn lần ...
LegionMammal978

Hừm. Có vẻ giống như một quyết định tùy tiện, điều gì ngăn các ngôn ngữ khác thêm chức năng công cụ tìm kiếm? Các bộ dữ liệu IMO hơi khác một chút - tải xuống tất cả chúng chỉ lớn đến mức một máy chủ trung tâm cung cấp cho bạn khi cần
ASCII chỉ có

Chỉ có ASCII Nếu bạn lo lắng, bạn luôn có thể đăng câu hỏi lên Meta.
LegionMammal978

@leg Trong trường hợp đó, dữ liệu có thể được sử dụng ngoại tuyến sau khi tải xuống. Trong trường hợp này, nó không phải là.
dùng202729

4

Jelly , 28 byte, điểm = 31

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

Cái này sử dụng hàm băm có thể định cấu hình mà tôi đã thêm vào Jelly theo đề xuất của @ lirtosiast.

Đầu vào là trong Titlecase, đầu ra là sức mạnh của 1.1 với ít lỗi nhất.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Câu trả lời này chỉ bao gồm hai phần.

  • Đầu tiên, “__ʋ7ṗ“RUu⁽NM\sOSJj[FL‘ḥsử dụng tích hợp mới để ánh xạ mỗi trong số 20 đầu vào có thể thành 15 số nguyên khác nhau.
  • Sau đó, 1.1*nâng 1.1 lên công suất tính toán.

“__ʋ7ṗ“RUu⁽NM\sOSJj[FL‘[95,95,169,55,242],[82,85,117,141,78,77,92,115,79,83,74,106,91,70,76]

Băm được tích hợp sẵn ánh xạ đầu tiên thành một số nguyên bằng cách tăng từng số, sau đó coi kết quả là số nguyên cơ sở 250 chữ số và thêm . Điều này mang lại .[95,95,169,55,242]1376510639244

Bằng cách giảm một nửa và xếp số nguyên này cho đến khi kết quả là , chúng ta sẽ nhận được chuỗi , có sự khác biệt về phía trước .0[376510639244,188255319622,94127659811,47063829905,,5,2,1,0][188255319622,94127659811,47063829906,,3,1,1]

Tiếp theo, chúng tôi tạo ra 64 số nguyên 64 bit bằng cách áp dụng SHAKE256-4096 cho biểu diễn chuỗi của biểu diễn bên trong của đối số đúng, sau đó cắt 4096 bit kết quả thành 64 khối 64 bit.

bây giờ tính toán sản phẩm chấm của 39 khác biệt và 39 số nguyên 64 bit đầu tiên được tạo, modulo . Điều này mang lại một số nguyên trong .264[0,264)

Danh sách có độ dài 15, vì vậy chúng tôi nhân số nguyên được tạo với 15 và lấy 64 cao hơn bit của kết quả. Điều này mang lại một số nguyên trong , mà chúng tôi sử dụng để lập chỉ mục vào danh sách.[82,85,117,141,78,77,92,115,79,83,74,106,91,70,76][0,15)

Để tìm cấu hình băm thích hợp, tôi đã sử dụng một brute-forcer trong C, một phần của Jelly repo .



3

Japt , 86 byte, điểm = 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

Hãy thử nó cho tất cả các đầu vào , Tính điểm hoặc Kiểm tra lỗi cao nhất

Rất giống với câu trả lời ban đầu của Olivier. Đầu vào là tất cả chữ thường.

Sau nhiều cải tiến khác nhau đối với các giá trị đầu ra, lỗi cao nhất hiện tại là Sao Kim chỉ hơn 4%.

Giải thích bây giờ rằng mọi thứ ổn định hơn một chút:

¤¥`É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

Chuỗi cho các tên được sujusaurneeavemagatimecaiomoeutrplerhanén bằng cách sử dụng nén tích hợp của Japt. Các số đại diện cho bán kính được tính như vậy:

                          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 byte, điểm = 75

Đầu tiên vượt qua lúc này; Tôi muốn thử một giải pháp phạt 0 để tạo cho mình một đường cơ sở để giải quyết. Sẽ quay lại vào ngày mai để xem những cải tiến nào có thể được thực hiện, hy vọng vẫn bị phạt 0.

Đầu vào không phân biệt chữ hoa chữ thường.

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

Hãy thử hoặc kiểm tra tất cả các đầu vào

Các "..."đại diện cho một chuỗi chứa nhiều không thể in. Các mật mã là:

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

Để đưa ra một lời giải thích nhanh chóng: chuỗi được chia thành các đoạn gồm 2 ký tự. Sau đó, chúng tôi lập chỉ mục vào mảng đó bằng cách sử dụng một phần công thức của ovs cộng với một số gói chỉ mục và sau đó ánh xạ 2 ký tự vào điểm mã của chúng.

  • Đã lưu một byte / điểm nhờ ETH

54 byte, điểm = 58

Một cảng của giải pháp của Olivier .

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

Kiểm tra tất cả các đầu vào


Tôi nghĩ rằng bạn có thể lưu một byte bằng cách di chuyển mục nhập đầu tiên (# 23) đến cuối nơi nó thuộc về và xóa %24:-)
ETHproductions 6/12/18



@ETHproductions: À, vâng, chỉ cần tự xoay mình rằng tôi cần thêm một yếu tố giữ chỗ vào đầu mảng. Cảm ơn.
Xù xì

3

Ruby , 105 byte, điểm 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)}

Hãy thử trực tuyến!

Nếu chúng ta chia 700000 cho bán kính, chúng ta sẽ có được một chuỗi tăng tuyến tính hợp lý (mặc dù khá thất thường). Số gia trong bảng dưới đây có thể được xấp xỉ bằng các giá trị ASCII của các ký tự. Vấn đề với cách tiếp cận này là nó yêu cầu đầu vào phải được giải mã thành một giá trị sắp xếp các tên khác nhau theo kích thước.

Một vấn đề nhỏ là sự khác biệt giữa Eris và Haumea là khá lớn. Cần có ba ký tự ~~dđể mã hóa mức tăng này theo định dạng chỉ ASCII. Chuỗi hành tinh-chỉ mục có hai không gian "hành tinh ma" trong đó để đệm chỉ mục.

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 byte, điểm = 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)

Ngắt dòng chỉ dành cho khả năng đọc.

Đầu vào được lấy thông qua bảng i có sẵn với cột varar v , theo tiêu chuẩn IO của chúng tôi .

Tham gia bảng đầu vào vào bảng trong bộ nhớ trên hai ký tự đầu tiên và trả về các chữ số còn lại x100.

Xử lý "Titan" như một trường hợp đặc biệt bằng cách sử dụng IIF.

EDIT : Đã lưu 1 byte (và 1 điểm) bằng cách sử dụng STUFFđể xóa hai ký tự đầu tiên thay vì SUBSTRING. Cảm ơn, t-clausen.dk!

EDIT 2 : Tôi muốn xem điều gì sẽ xảy ra nếu tôi cố lưu một byte khác bằng cách nhân từng giá trị tra cứu với 99 thay vì 100, và tôi ngạc nhiên rằng nó thực sự làm tăng độ chính xác (ước tính ít chính xác nhất)!.

Điều này dẫn tôi đến một số thử nghiệm và thử nghiệm lỗi và một số bảng dữ liệu if-if ưa thích của Excel, nơi tôi tìm thấy một giải pháp tối ưu bằng cách sử dụng hệ số nhân 89 (tất nhiên đã thay đổi tất cả các giá trị được lưu trữ của tôi).

Vì vậy, trong khi điều này chỉ tiết kiệm cho tôi một byte, nó thực sự cải thiện điểm số của tôi thêm 4,6 so với giải pháp trước đó của tôi.

EDIT 3 : Tìm kiếm cao hơn thay vì thấp hơn và tìm thấy hệ số nhân thậm chí tốt hơn , 198 . Các giá trị vẫn chính xác một cách hợp lý trong khi rút ngắn chuỗi lưu trữ của tôi bằng khá nhiều ký tự, giúp cải thiện điểm số của tôi.


1
Bạn có thể lưu 1 byte bằng STUFF (value, 1,2, '') thay vì chuỗi con
t-clausen.dk

2

PowerShell , 203 byte, điểm 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]

Hãy thử trực tuyến!

Rất giống với câu trả lời của Olivier, bây giờ tôi thấy nó, nhưng được phát triển độc lập.


1

Than , 101 byte, điểm = 101

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

⁺§θ⁰§θχ

Lấy ký tự thứ 1 và thứ 11 (theo chu kỳ) của chuỗi đầu vào và nối chúng.

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

Nhìn chúng trong chuỗi SuJiSrUuNtEEVVMrGnTTMcClIIMoEpToPPEiHeTachia thành các cặp ký tự.

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

Chia chuỗi m.w'fv&J|\"l|\"e1 c& _c Ca ;e ;* 9a 9C 31 2; 0I .7 ,N ,7 (X (<thành các nhóm gồm ba ký tự và lấy nhóm tương ứng.

I⍘ ... γ

Giải mã kết quả dưới dạng số cơ sở 95 bằng cách sử dụng ký tự ASCII có thể in được đặt làm chữ số. Ví dụ: Ioký tự thứ 11 là I, vì vậy chúng tôi tìm kiếm IIvà tìm thấy nó là đối tượng lớn thứ 13 và kích thước của nó là 31bản đồ 19 * 95 + 17 = 1822.


1

Swift 4 , 225 byte, điểm = 241

Có thể chơi gôn nhiều hơn (có thể trong khu vực "Ga-Me-Ca"?), Nhưng Swift không thường được sử dụng (vì một lý do, có thể.)

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

và vô lương tâm

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

Dùng thử trực tuyến!

Tôi đã thử các "kích thước khóa" khác nhau cho bản đồ, nhưng tất nhiên 1 có nhiều xung đột và sử dụng ba ký tự không mang lại cho tôi i=="Titan" ?2575:17 ký tự, vì có "Io" để quản lý (và sẽ mất hơn 3 ký tự, Tôi nghĩ).


1

JavaScript (ES6), 152 byte, điểm = 163

Chà, đó là một giải pháp khá chuẩn, nhưng dù sao thì tôi cũng thích thử thách này!

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

Điểm số của tôi:

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

Hãy thử trực tuyến!


1

SAI , 152 byte, Điểm = 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!]?

Câu trả lời lười biếng sử dụng độ dài từ và chữ cái đầu tiên nhưng lý do của tôi là tôi đang sử dụng một ngôn ngữ kỳ lạ

Hãy thử trực tuyến! (sao chép dán mã, nhấn hiển thị và sau đó chạy)

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

Kết quả của tôi:

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

Tôi đã cập nhật nó để sử dụng một nửa năm 1822 (911) thay vào đó tôi có thể tạo ra một trường hợp đặc biệt cho Haumea, vì vậy lời khuyên này không còn hiệu quả nữa. Tôi đã thử sử dụng 817 (một nửa năm 1634) nhưng không được. Nếu bạn muốn làm việc kỳ diệu của mình và tìm số mới tối ưu nhất, hãy thoải mái.
Terjerber

1

C (gcc) , 118 byte, điểm = 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);}

Hãy thử trực tuyến!

Chấm điểm

Chạy xuống

Tên đối tượng được chuyển thành hàm băm một ký tự thông qua quy trình rườm rà

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

có sự phình to chỉ ra "Titan" / "Titania" là những kẻ phạm tội chính. Bao gồm ký tự cuối cùng trong hàm băm đã được xem xét, nhưng điều đó vẫn yêu cầu strlen()trong C. Lần xuất hiện đầu tiên của ký tự băm được tìm kiếm trong chuỗi băm / dữ liệu. Khi được tìm thấy, ký tự tiếp theo được lấy và sử dụng để xấp xỉ bán kính của đối tượng được đề cập.

Ký tự dữ liệu giữ logarit tự nhiên thay đổi theo tỷ lệ của bán kính. Tạo như vậy:

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

Thang đo đã được chọn thông qua thử và sai khoa học rất cao và sự thay đổi để mang lại giá trị trong phạm vi ASCII có thể in được trong khi tránh dấu gạch chéo ngược. Một số sắp xếp lại các đối tượng trong chuỗi là cần thiết do một số va chạm dữ liệu / băm.

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 byte, Điểm = 234

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

Hãy thử trực tuyến!

Hầu hết các câu trả lời được đăng dường như đã sử dụng chiến lược "mã hóa / giải mã". Tôi tự hỏi làm thế nào tôi có thể làm tốt bằng cách ước tính đường kính của các thiên thể bằng một phương trình đơn giản. Đây là một bài tập thú vị, nhưng mức tiết kiệm byte vừa phải được bù đắp bằng hình phạt chính xác.

Cốt lõi của giải pháp này là phương trình ước tính:

Radius = 39**4/x**2.18

Trong đó x là hai lần thứ tự xếp hạng của bán kính của cơ thể.

Tôi tạo giá trị của x dựa trên chuỗi đầu vào bằng cách sửa đổi giải pháp Python 2 của Outgolfer. Tôi đã lưu một vài byte trên mã của anh ấy bằng cách đọc lại các phương trình của tôi để làm việc với [2..40] thay vì [1..20].

Mã để tạo các thứ tự xếp hạng chiếm hơn 2/3 byte của toàn bộ giải pháp. Nếu bất cứ ai có cách tạo thứ hạng nhỏ gọn hơn, giải pháp này có thể được rút ngắn hơn nữa. Do hình phạt chính xác (khoảng 2,6), điểm số sẽ được cải thiện khá nhiều.

Tạo phương trình

Tôi đã sử dụng các phương pháp thống kê để tìm kiếm các phương trình đơn giản để ước tính kích thước của mỗi cơ thể dựa trên thứ hạng của nó. Trong phần tiếp theo những hiểu biết sâu sắc về giải pháp Ruby của @Level River St và khái quát hóa, tôi đã giải quyết các phương trình của biểu mẫu:

Radius = A/(Rank)**B

Làm việc trong R, tôi đã sử dụng các mô hình tuyến tính trên nhật ký bán kính để phát triển các ước tính ban đầu và sau đó sử dụng tối ưu hóa phi tuyến tính, tạo ra tối ưu hóa với kết quả của các mô hình tuyến tính, để tìm kiếm các giải pháp giảm thiểu chức năng phạt được chỉ định trong vấn đề.

Giá trị ước tính của A trong phương trình trên là bảy chữ số, vì vậy tôi đã tìm kiếm một biểu thức đơn giản để lưu một vài byte. Tôi tìm biểu thức của mẫu

x**y

cho hai chữ số x và 1 chữ số y (cho tổng số năm byte, lưu hai byte hoặc khoảng năm điểm, bị phạt) không quá khác biệt so với giá trị tối ưu của A và không làm tăng mức phạt nhiều và kết thúc lên với (không thể giải thích được):

39**4

Thuật toán chấm điểm dường như thực sự làm tổn thương phương pháp này-- Tôi đoán rằng nó sẽ làm tốt hơn theo định mức lỗi L2 hoặc L1. Mặc dù bạn đang lãng phí byte lưu trữ tên nào.
lirtosiast

@lirtosiast Đồng ý với cả hai điểm. Thật thú vị, một hình vuông nhỏ nhất phù hợp (tiêu chuẩn L2) cũng khá tốt theo thuật toán chấm điểm này. Nó chỉ có hình phạt tồi tệ hơn khoảng 5% so với phương trình tốt nhất mà tôi tìm thấy. Về việc lưu trữ tên: Tôi không thể tìm ra một cách nhỏ gọn hơn để tạo ra một chuỗi số tăng dần từ nhập văn bản. Các phương pháp số học modulo được thực hiện trong các câu trả lời khác ngẫu nhiên hóa thứ tự.
CCB60

0

TI-BASIC (TI-84), 285 byte, Điểm = 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

Một chương trình "index in string to list" đơn giản. Có thể được chơi gôn hơn nữa.

Đầu vào nằm trong Ansvà là một trong những tên của các đối tượng được viết hoa đầy đủ.
Đầu ra là trong Ansvà được tự động in ra.

Thí dụ:

"MOON
MOON
prgmCDGFC
            1737
"IO
IO
prgmCDGFC
            1822

Giải thích:
(Danh sách Radii và chuỗi tên đã được rút ngắn để rút ngắn. ...Được sử dụng để chỉ phần còn lại của danh sách / chuỗi.)

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

Mô hình trực quan:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.