Jak szybko mogę powiedzieć twój program?

26

Niedawno postanowiłem pobrać oprogramowanie do dyktowania, aby pomóc w pisaniu. Jednak to nie działa zbyt dobrze, gdy koduję, ponieważ muszę przejść z wypowiadania słów na symbole iz powrotem. Gorzej, gdy piszę w ezoterycznym języku, który jest wszystkimi symbolami.

Aby korzystanie z programu dyktowania było bardziej spójne, postanowiłem przełączyć go na tryb postaci, w którym zamiast tego wypowiadam tylko nazwę każdej postaci. Problem rozwiązany! Chociaż opóźnia to nieco datę premiery mojej powieści ...

Zakładając, że im dłuższe imię postaci, tym dłużej trzeba mówić, ile czasu zajmie mi przeliterowanie niektórych moich programów / zdań?

Dane techniczne

Biorąc pod uwagę ciąg znaków składający się tylko z drukowalnego ASCII, zwróć sumę nazwy Unicode każdego znaku. Na przykład /jest wywoływany SOLIDUSz 7 znaków i Ama LATIN CAPITAL LETTER A22 znaki.

Ale pamiętajcie, muszę głośno powiedzieć waszym programom, aby je wykonały, więc ich wynik będzie zależał od tego, ile czasu zajmie mi ich wypowiedzenie, tj. Jako suma długości nazwy Unicode każdej postaci.

Przypadki testowe:

W formacie input => outputbez wejściowych / końcowych spacji na wejściu.

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

Zasady:

  • Dane wejściowe do programu będą składać się wyłącznie z drukowalnych znaków ASCII, to znaczy punktów kodowych od 32 (spacja) do 126 (tylda).
    • Dla wygody, oto lista długości znaków, z którymi musisz sobie poradzić: [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]
  • Oto program referencyjny, którego możesz użyć do oceny swojego programu.
    • Peter Taylor wskazał, że program referencyjny normalizuje niektóre znaki Unicode . Powinien nadal działać w przypadku większości rozwiązań, ale w razie potrzeby możesz go poprawić
  • Ponieważ mówisz, jak naprawdę wyglądają postacie, twoje rozwiązanie zostanie ocenione według wyświetlanych postaci , a nie bajtów. Jest to skierowane do języków z niestandardowymi kodowaniami.
    • Możesz założyć, że zapamiętałem całą bibliotekę Unicode i mogę powiedzieć dowolne dziwne znaki, których używasz.
  • Przepraszam Rogem, ale odpowiedzi muszą składać się z możliwych do wyświetlenia postaci. Niezadrukowalne są w porządku, muszę tylko móc głośno czytać postacie.
  • Cokolwiek robisz, nie używaj go w swoim programie.
Jo King
źródło
9
ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORMto będzie pełne imię mojego dziecka
Quintec
1
Ten program osiąga 6 w trybie słownym: Wypróbuj online!
Neil
2
Program referencyjny jest wadliwy. Rozważ [ten test] ( tio.run / ##dY5PC4JAEMXvfYphYcNsWcrSi@Ahrx3rlB223FTSXdk/... ) gdzie \x[2126]jest liczony jako \x[3a9].
Peter Taylor

Odpowiedzi:

13

Java 8, wynik 846 838 822 816

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

-8 słabo dzięki @tsh zastępując _1w .
-22 wynik dzięki @ ASCII tylko zastępując z ˇi $z .

Wypróbuj online.

Wyjaśnienie:

I ˇsą używane zamiast si cchciałbym normalnie używać, ponieważ małe litery są 20 (tj LATIN SMALL LETTER S), ale ( TAMIL OM) jest 8 i ˇ( CARON) wynosi 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
Kevin Cruijssen
źródło
1
Podoba mi się, jak ten materiał Java pokonuje odpowiedź 05AB1E zarówno pod względem bajtów, jak i pod względem wyniku ...
Erik Outgolfer
@EriktheOutgolfer Ikr. Chyba wbudowane. ;)
Kevin Cruijssen
@KevinCruijssen Oszczędza kilka bajtów, których nie musisz push compressed integer 87235805968599116032550323044578484972930006625267106917841: P
Quintec
1
Użyj zamiast _1zaoszczędzić niektóre punkty.
tsh
1
@KevinCruijssen Peter Taylor's ( OHM SIGN) ma 8 znaków. Również haha, nie wiedziałem, że to nie jest poprawne, po prostu założyłem, że jest poprawne w C # i Peter _1też użył ( program do wyszukiwania krótkich nazw zmiennych , nie można użyć znaku pola)
tylko ASCII
11

Perl 6 , wynik 337

+*.uninames.&[~].ords

Wypróbuj online!

nwellnhof
źródło
To .&[~]zamiast tego .joinjest fajną sztuczką. Nigdy nie pamiętam, jakie operatory redukcji można zastosować tą metodą
Jo King
7

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

Pobiera dane wejściowe jako tablicę znaków.

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

Wypróbuj lub uruchom wszystkie przypadki testowe na TIO

( APOSTROPHEjest pomijany w szóstym przypadku testowym w TIO, ponieważ Japt nie obsługuje pojedynczych i podwójnych cudzysłowów w tym samym ciągu wejściowym)


Wyjaśnienie

®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

Budowanie łańcucha

(Wyniki obejmują kroki i dodatkowe znaki potrzebne do cofnięcia każdej modyfikacji)

  1. Tablica dała wynik wyjściowy wynoszący 2161 .
  2. Przekształcanie każdego z nich w pojedynczy znak w bazie >=23i łączenie z ocenionym ciągiem 1832 .
  3. Zastąpienie obu przebiegów mi kpojedynczą, wielką literą 963 .
  4. Wciąż było zbyt wiele drogich liter, więc później spróbowałem się ich pozbyć, zmniejszając punkty kodowe wszystkich znaków. 5była postacią z najniższą wartością codepoint ( 53), więc zacząłem od 52, która uzyskała wynik 756
  5. Po wypróbowaniu wszystkich numerów, które pozostawiają żadnych liter w łańcuchu, 51dał najlepszy wynik 738
  6. Wreszcie zastąpienie cudzysłowów nieco tańszymi odwrotnymi chwytami daje wynik 734 . Backticks w Japt są zwykle używane do zamykania i dekompresji skompresowanego łańcucha, ale na szczęście żaden z znaków w tym łańcuchu nie jest zawarty w bibliotece Shoco

Ostatni łańcuch zawiera więc znaki w następujących punktach kodowych:

[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]
Kudłaty
źródło
4

05AB1E , wynik 963

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

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

Î               # 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)

Zobacz moją wskazówkę 05AB1E (sekcje Jak kompresować duże liczby całkowite? I Jak kompresować listy liczb całkowitych? ), Aby zrozumieć, dlaczego tak •Fδà‚<0?9½mΣ@×ƶC₁vc-™uΔ_ε'•21вjest [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].

Kevin Cruijssen
źródło
4

C # (interaktywny kompilator Visual C #) (wynik 1627 1116 1096 1037 1019 902)

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

Nie korzysta z wbudowanej bazy danych: tylko specjalna obudowa na litery i tabela odnośników.

Zestaw testów online .

Nie może zdobyć punktacji, ponieważ większość znaków nie znajduje się w zakresie, w tym zmienne CARON i OHM SIGNsymbole zodiaku używane do kodowania tabeli odnośników.

Dzięki ASCII tylko za wiele sugestii.

Peter Taylor
źródło
Jakiego programu
tylko ASCII
tio.run/##NZDrdpNAFIX/z1OMY0wgwhCg0NAEanpT22jVaquGiAQnYbgMhIHWGJO36gv0xSJrBf@cdS57r72@E3A54HR3UbFgyMuCsoVEWenM7d3To@08PeKbKhU82xG2suDJdgd2xLauikPNbLc9R9eONU32FFPtakeI5CyOExrly5CShC4iSuMoonEcEcriZZryrFyGSZFygiZebdP1rmZOZcsUdwMwzwriB6Fw7xfQh5RBRh4m0zVAIyRBRYGaBpCybw8BumYBgVWesVpb0pRgjPc3vXcAEE@qIscVo8xPCXccHGTpDPMqxdxf7XWG3gPoMruqifcLVauNz1wEn7detDuC2H0pyVjpqZp@YJiHfetoMLSd41ejk9Oz84vXb95eXo3fvb/@8PHTzecvt3dfv32fuO70h/fTnwW/yHwR0ihOUpbly4KX1f3D79Wf9d/NtskyLBWgs6yaJUQOQhLEcJVVBXRdDmukMiQw8XkJS1KXwOcEDsQG3TAAGtYU0EXDludst/j8djR20f@u@UK/D5A0wdK0oa1H1WrCLbARwV1BSzKmjAgttPYly9hAaDsQrueCL26QONj9Aw
ASCII tylko
2
@ Tylko ASCII, użyłem poniższej odpowiedzi w języku Python; odpowiedź Java daje również 1627. Problemem wydaje się być to, że rozwiązanie referencyjne jest błędne: Ω to U + 2126, ZNAK OHM , a nie GRECKA LIST KAPITAŁOWY OMEGA.
Peter Taylor
1
Ocena 5 imion:,, nie ma innych nazw krótszych niż 8, które C # akceptuje, również niezweryfikowane z programem Java
tylko ASCII
1
@Kevin, zgodnie z moim wcześniejszym komentarzem implementacja referencyjna jest błędna. Myślę, że stosuje normalizację, aby zmienić znak źródłowy OHM SIGN w GREEK CAPITAL LETTER OMEGA.
Peter Taylor
4

R; Wynik: 3330 1586 1443

Trudne również w R z powodu braku wbudowanych.

Cóż, kod jest teraz w większości @ Giuseppe, ale to w porządku. Byłem w stanie dokonać niewielkiej edycji gry w golfa, zastępując * znakiem ~, a s kropką.

Dzięki @Nick Kennedy za sprowadzenie tego do 1443 za pomocą tajemnej magii „zakodowanej w UTF8 wersji sekwencji liczb”

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

Wypróbuj online

CT Hall
źródło
1769 punktów - podejmuje minimalną próbę kompresji wartości ...
Giuseppe
2
również utf8ToIntjest bardzo pomocnym poleceniem do gry w golfa :-) Nie jestem na PPCG od około miesiąca, więc miło jest widzieć nowych ludzi grających w golfa w R!
Giuseppe
Ach, miałem sposób to skompresować, ale nie byłem świadomy utf8ToInt. Będę musiał popracować nad tym później wieczorem / jutro.
CT Hall
1
Jest to po prostu więcej wierszy kodu pod programem / fragmentem kodu, które nie wpływają na liczbę bajtów - przydatne w niektórych testach
tylko ASCII
1
W dół do 1443: tio.run / ##xc09DoIwFADgu3ShTR/... Korzystanie z wersji sekwencji liczb zakodowanej w UTF8.
Nick Kennedy
3

Python 3 , wynik 993

lambda _:len(''.join(map(__import__('unicodedata').name,_)))

Wypróbuj online!

Poniżej 1000, wszystkie wskazówki są nadal mile widziane.

-16 dzięki Kirill L.

nedla2004
źródło
2
993
Kirill L.
1
Możesz zastąpić _przez ˇza 987.
Lynn
2

Perl 5 -pl , wynik 723

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

Wypróbuj online!

Wyjaśnienie

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
nwellnhof
źródło
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]}

Wypróbuj online!

Prosta kompresja i indeksowanie.

Conor O'Brien
źródło
: P wygląda na to, że użycie inteligentniejszego wyszukiwania (patrz odpowiedź w języku C #) pomogłoby w uzyskaniu wyniku. Lub nawet używając zestawu znaków, który nie zawiera liter do kompresji
tylko ASCII
1

C # (interaktywny kompilator Visual C #) , wynik: 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])

Czuję się przygnieciony rozwiązaniem Petera Taylora powyżej. Dzięki Peterowi Taylorowi za wskazanie prostej tabeli odnośników było lepsze niż moje poprzednie rozwiązanie słownikowe.

Wypróbuj online!

Wcielenie ignorancji
źródło
Jest to znacznie gorsze niż tabela bezpośredniej _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()oceny : wyniki 2786.
Peter Taylor