Seberapa cepat saya bisa mengatakan program Anda?


26

Baru-baru ini saya memutuskan untuk mengunduh beberapa perangkat lunak dikte, untuk membantu penulisan saya. Namun, itu tidak berfungsi dengan baik ketika saya mengkode, karena saya harus berubah dari mengucapkan kata-kata menjadi simbol dan kembali lagi. Ini bahkan lebih buruk ketika aku coding dalam bahasa esoteris yang semua simbol.

Untuk membuat saya menggunakan program dikte lebih konsisten, saya memutuskan untuk beralih ke mode karakter, di mana saya hanya mengucapkan nama masing-masing karakter saja. Masalah terpecahkan! Meskipun ini sedikit menunda tanggal rilis novelku ...

Jadi, dengan asumsi bahwa semakin lama nama karakter, semakin lama waktu yang dibutuhkan untuk mengatakan, berapa lama waktu yang saya butuhkan untuk mengeja beberapa program / kalimat saya?

Spesifikasi

Diberikan string yang hanya terdiri dari ASCII yang dapat dicetak, kembalikan jumlah nama unicode masing-masing karakter. Misalnya, /disebut SOLIDUSdengan 7 karakter, dan Aadalah LATIN CAPITAL LETTER Adengan 22 karakter.

Tapi ingat, saya harus mengatakan program Anda dengan keras untuk mengeksekusinya, sehingga skor mereka akan didasarkan pada berapa lama saya mengatakannya, yaitu sebagai jumlah dari panjang nama unicode masing-masing karakter.

Kasus uji:

Dalam format input => outputtanpa spasi tambahan / spasi di input.

A      => 22
/      => 7
Once upon a time...           => 304
slurp.uninames>>.comb.sum.say => 530
JoKing => 124
!" #$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~        =>  1591
Double-check your \s on the last test case ;)   => 755
<say "<$_>~~.EVAL">~~.EVAL     => 388
,[.,]  => 58
19     => 19

Aturan:

  • Input ke program Anda hanya akan terdiri dari karakter ASCII yang dapat dicetak, yaitu codepoints 32 (spasi) hingga 126 (tilde).
    • Demi kenyamanan, berikut adalah daftar panjang karakter yang harus Anda tangani: [5,16,14,11,11,12,9,10,16,17,8,9,5,12,9,7,10,9,9,11,10,10,9,11,11,10,5,9,14,11,17,13,13,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,19,15,20,17,8,12,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,18,13,19,5]
  • Berikut ini adalah program referensi yang dapat Anda gunakan untuk menilai program Anda.
    • Peter Taylor telah menunjukkan bahwa program referensi menormalkan beberapa karakter unicode . Seharusnya masih berfungsi untuk sebagian besar solusi, tetapi jangan ragu untuk memperbaikinya jika Anda perlu
  • Karena Anda mengatakan seperti apa sebenarnya karakter itu, solusi Anda akan dinilai oleh karakter yang ditampilkan, bukan byte yang terlibat. Ini diarahkan pada bahasa dengan penyandian khusus.
    • Anda dapat mengasumsikan bahwa saya telah menghafal seluruh pustaka Unicode dan dapat mengatakan karakter aneh apa pun yang Anda gunakan.
  • Maaf Rogem, tetapi jawaban harus terdiri dari karakter yang dapat ditampilkan. Unprintables baik-baik saja, saya hanya harus bisa membaca karakter dengan keras.
  • Apa pun yang Anda lakukan, jangan gunakan dalam program Anda.

9
ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORMini akan menjadi nama lengkap anak saya
Quintec

1
Skor program ini 6 dalam mode kata: Cobalah online!
Neil

2
Program referensi buggy. Pertimbangkan [tes ini] ( tio.run/##dY5PC4JAEMXvfYphYcNsWcrSi@Ahrx3rlB223FTSXdk/… ) di mana \x[2126]dihitung sebagai \x[3a9].
Peter Taylor

Jawaban:


13

Java 8, skor 846 838 822 816

ௐ->ௐ.map(ˇ->Character.getName(ˇ).length()).sum()

Skor -8 berkat @tsh menggantikan _1dengan .
Skor -22 berkat @ ASCII-hanya mengganti dengan ˇdan $dengan .

Cobalah online.

Penjelasan:

The dan ˇdigunakan sebagai ganti sdan csaya biasanya menggunakan, karena huruf kecil semuanya 20 (yaitu LATIN SMALL LETTER S), tetapi ( TAMIL OM) adalah 8 dan ˇ( CARON) adalah 5.

ௐ->                         // Method with IntStream parameter and integer return-type
  ௐ.map(ˇ->                 //  Map each character to:
      Character.getName(ˇ)  //   Get the name of the character
               .length())   //   Get the length of that name
   .sum()                   //  And after the map: sum all lengths together,
                            //  and return it as result

1
Saya suka bagaimana hal-hal Java ini mengalahkan jawaban 05AB1E baik dalam hal byte maupun dari segi skor ...
Erik the Outgolfer

@EriktheOutgolfer Ikr. Dibangun, saya kira. ;)
Kevin Cruijssen

@KevinCruijssen Ini memang menyimpan beberapa byte yang Anda tidak perlu push compressed integer 87235805968599116032550323044578484972930006625267106917841: P
Quintec

1
Gunakan bukannya _1akan menghemat beberapa poin.
tsh

1
@KevinCruijssen Peter Taylor ( OHM SIGN) berukuran 8 karakter. Juga haha ​​saya tidak sadar itu tidak valid, hanya diasumsikan karena itu valid dalam C # dan Peter digunakan _1juga ( program untuk menemukan nama variabel pendek , karakter kotak tidak dapat digunakan)
ASCII-only


7

Japt v2.0a1 -x, Skor 926 908 875 865 829 791 789

Mengambil input sebagai array karakter.

®cg`061742//0.450./..//.2/5117385`c+51 r\A_p26}  n# 

Cobalah atau jalankan semua test case di TIO

( APOSTROPHEdihilangkan dari test case ke-6 pada TIO karena Japt tidak dapat menangani tanda kutip tunggal dan ganda dalam string input yang sama)


Penjelasan

®cg`...`c+51 r\A_p26}  n#      :Implicit input of character array
®                              :Map
 c                             :  Character code
  g                            :  Index into (0-based, with wrapping)
   `...`                       :    The string described below
        c+51                   :    Increment the codepoint of each by 51 (="8cKidj55gebbc9agh895c97a99baa9bba59ebhddMjfkh")
                               :    (Space closes the above method)
             r                 :    Replace
              \A               :      RegEx /[A-Z]/g
                _              :      Pass each match through a function
                 p26           :        Repeat 26 times
                    }          :      End function
                               :    (Space closes the replace method)
                               :  (Space closes the indexing method)
                       n       :  Convert to integer
                        #      :    From base 32 (note the trailing space)
                               :Implicitly reduce by addition and output

Membangun String

(Skor mencakup langkah-langkah dan karakter tambahan yang diperlukan untuk membalikkan setiap modifikasi)

  1. Array memberikan skor awal 2161 .
  2. Konversi masing-masing ke karakter tunggal di basis >=23dan bergabung ke string mencetak 1832 .
  3. Mengganti kedua run dari mdan kdengan karakter huruf besar tunggal mencetak 963 .
  4. Masih terlalu banyak surat mahal jadi selanjutnya saya mencoba untuk menghilangkannya dengan mengurangi codepoint dari semua karakter. 5adalah karakter dengan codepoint terendah ( 53) jadi saya mulai dengan 52, yang mencetak 756
  5. Setelah mencoba semua angka yang akan pergi tidak ada huruf dalam string, 51memberikan nilai terbaik dari 738
  6. Akhirnya, mengganti tanda kutip dengan backticks yang sedikit lebih murah memberi skor 734 . Backticks di Japt biasanya digunakan untuk melampirkan dan mendekompresi string terkompresi tetapi, untungnya, tidak ada karakter dalam string ini yang terkandung di perpustakaan Shoco

String terakhir, jadi, berisi karakter pada codepoint berikut:

[5,48,24,54,49,55,2,2,52,50,47,47,48,6,46,52,53,5,6,2,48,6,4,46,6,6,47,46,46,6,47,47,46,2,6,50,47,53,49,49,26,55,51,56,53]

4

05AB1E , skor 963

Îv•Fδà‚<0?9½mΣ@×ƶC₁vc-™uΔ_ε'•21вεD3‹i22α₂и}}˜yÇ32-è+

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

Î               # Push 0 and the input-string
 v              # Loop `y` over the characters of this input-string:
  Fδà‚<0?9½mΣ@×ƶCvc-™uΔ_ε'•
               '#  Push compressed integer 87235805968599116032550323044578484972930006625267106917841
   21в          #  Converted to Base-21 as list: [5,16,14,11,11,12,9,10,16,17,8,9,5,12,9,7,10,9,9,11,10,10,9,11,11,10,5,9,14,11,17,13,13,0,19,15,20,17,8,12,2,18,13,19,5]
    ε           #  Map over this list:
     D3i       #   If the value is smaller than 3:
         22α    #    Take the absolute difference of this value with 22
            ₂и  #    Repeat it 26 times as list
    }}          #  Close the if-statement and map
      ˜         #  Flatten the list
       yÇ       #  Get the unicode value of the current character
         32-    #  Subtract 32
            è   #  Index it into the list of integers
             +  #  And add it to the sum
                # (and output the sum implicitly as result after the loop)

Lihat ini 05AB1E ujung tambang (bagian Cara kompres bilangan bulat besar? Dan Cara daftar bilangan bulat kompres? ) Untuk memahami mengapa •Fδà‚<0?9½mΣ@×ƶC₁vc-™uΔ_ε'•21вadalah [5,16,14,11,11,12,9,10,16,17,8,9,5,12,9,7,10,9,9,11,10,10,9,11,11,10,5,9,14,11,17,13,13,0,19,15,20,17,8,12,2,18,13,19,5].


4

C # (Visual C # Interactive Compiler) (skor 1627 1116 1096 1037 1019 902)

Ω=>Ω.Sum(ˇ=>(31&-ˇ)>5&ˇ>62?22-ˇ/91*2:"♁♌♊♇♇♈♅♆♌♍♄♅♁♈♅♃♆♅♅♇♆♆♅♇♇♆♁♅♊♇♍♉♉♏♋♐♍♄♈♎♉♏♁"[ˇ-6-ˇ/33*26]-9788)

Ini tidak menggunakan database bawaan: hanya beberapa casing khusus untuk huruf dan tabel pencarian.

Test suite online .

Tidak dapat mencetak sendiri, karena sebagian besar karakter tidak dalam jangkauan, termasuk variabel CARONdanOHM SIGN dan simbol zodiak yang digunakan untuk menyandikan tabel pencarian.

Terima kasih kepada ASCII-only untuk banyak saran.


Program penilaian apa yang Anda gunakan
ASCII

tio.run/##NZDrdpNAFIX/z1OMY0wgwhCg0NAEanpT22jVaquGiAQnYbgMhIHWGJO36gv0xSJrBf@cdS57r72@E3A54HR3UbFgyMuCsoVEWenM7d3To@08PeKbKhU82xG2suDJdgd2xLauikPNbLc9R9eONU32FFPtakeI5CyOExrly5CShC4iSuMoonEcEcriZZryrFyGSZFygiZebdP1rmZOZcsUdwMwzwriB6Fw7xfQh5RBRh4m0zVAIyRBRYGaBpCybw8BumYBgVWesVpb0pRgjPc3vXcAEE@qIscVo8xPCXccHGTpDPMqxdxf7XWG3gPoMruqifcLVauNz1wEn7detDuC2H0pyVjpqZp@YJiHfetoMLSd41ejk9Oz84vXb95eXo3fvb/@8PHTzecvt3dfv32fuO70h/fTnwW/yHwR0ihOUpbly4KX1f3D79Wf9d/NtskyLBWgs6yaJUQOQhLEcJVVBXRdDmukMiQw8XkJS1KXwOcEDsQG3TAAGtYU0EXDludst/j8djR20f@u@UK/D5A0wdK0oa1H1WrCLbARwV1BSzKmjAgttPYly9hAaDsQrueCL26QONj9Aw
ASCII-satunya

2
@ Hanya ASCII, saya menggunakan jawaban Python di bawah ini; jawaban Java juga memberikan 1627. Masalahnya tampaknya bahwa solusi referensi buggy: Ω adalah U + 2126, OHM TANDA , bukan SURAT MODAL YUNANI OMEGA.
Peter Taylor

1
Nama Skor 5: ˇ, tidak ada nama lain yang lebih pendek dari 8 yang diterima C #, juga tidak diverifikasi dengan program Java
ASCII-satunya

1
@ Kevin, sesuai komentar saya sebelumnya implementasi referensi buggy. Saya pikir itu menerapkan normalisasi untuk mengubah karakter sumber OHM SIGN menjadi GREEK CAPITAL LETTER OMEGA.
Peter Taylor

4

R; Nilai: 3330 1586 1443

Juga menantang di R karena kurangnya built-in.

Yah kodenya sekarang kebanyakan @ Giuseppe tapi tidak apa-apa. Saya dapat membuat edit kecil ke golf lebih lanjut dengan mengganti * dengan ~, dan s dengan titik.

Terima kasih kepada @Nick Kennedy untuk mendapatkan ini ke 1443 dengan menggunakan sihir misterius "versi UTF8 yang dikodekan dari urutan nomor"

function(.)sum((c(+",752230178/0,30.1002110221,052844",61~26,+":6;8/3",59~26,+"94:,")-39)[+.-31]);`+`=utf8ToInt;`~`=rep

Cobalah online


1769 poin - membuat upaya minimal untuk mengompresi nilai-nilai ...
Giuseppe

2
juga, utf8ToIntadalah perintah yang sangat membantu untuk bermain golf :-) Saya belum pernah menggunakan PPCG selama sebulan atau lebih, jadi senang melihat orang baru bermain golf di R!
Giuseppe

Ah, saya punya cara untuk mengompresnya, tetapi tidak menyadari utf8ToInt. Saya harus mengerjakan ini nanti malam / besok.
CT Hall

1
Itu hanya lebih banyak baris kode di bawah program / snippet yang tidak memengaruhi bytecount - berguna untuk melakukan beberapa tes di
ASCII-only

1
Turun ke 1443: tio.run / ##xc09DoIwFADgu3ShTR/... Menggunakan versi UTF8 yang disandikan dari urutan nomor.
Nick Kennedy


2

Perl 5 -pl , skor 723

s,\N{OX}*.,_charnames'viacode ord$&,ge,$_=y,,,c

Cobalah online!

Penjelasan

s,        ,                        ,ge  # Replace globally
  \N{OX}*   # zero or more OX characters 🐂, loads the
            # _charnames module as side effect,
         .  # any character
           _charnames'viacode ord$&  # with its Unicode character name
                                     # (using old package delimiter).
                                      ,$_=y,,,c  # Set $_ to its length

2

Attache , 1934

Sum@{ToBase[FromBase[Ords@"!ZByru=#9fBYb$a3Si0^pU,ZP#3$cd'(c-_lhu]h(]5;!W|?M4:<_^sU;N&XFN`t:u"-32,95],23][Ords@_-32]}

Cobalah online!

Kompresi dan pengindeksan sederhana.


: P sepertinya menggunakan pencarian yang lebih cerdas (lihat jawaban C #) akan membantu dengan skor. Atau bahkan hanya menggunakan charset yang tidak mengandung huruf untuk dikompres
ASCII-hanya

1

C # (Visual C # Interactive Compiler) , Nilai: 4007 3988 3759 3551 2551

ˇ=>ˇ.Sum(_=>new[]{5,16,14,11,11,12,9,10,16,17,8,9,5,12,9,7,10,9,9,11,10,10,9,11,11,10,5,9,14,11,17,13,13,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,19,15,20,17,8,12,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,18,13,19,5}[_-32])

Saya merasa hancur oleh solusi Peter Taylor di atas. Terima kasih kepada Peter Taylor karena menunjukkan tabel pencarian sederhana lebih baik daripada solusi kamus saya sebelumnya.

Cobalah online!


Ini jauh lebih buruk daripada tabel pencarian langsung: _1=>_1.Select(_2=>new int[]{5,16,14,11,11,12,9,10,16,17,8,9,5,12,9,7,10,9,9,11,10,10,9,11,11,10,5,9,14,11,17,13,13,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,19,15,20,17,8,12,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,18,13,19,5}[_2-32]).Sum()skor 2786.
Peter Taylor
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.