Nazywają mnie inspektorem Morse


20

Twoim zadaniem, jeśli zdecydujesz się to zaakceptować, jest zdecydowanie, czy dany ciąg wejściowy jest ciężki do kropek, czy ciężki do kreski.

Ciąg jest ciężki od kropek, gdy jego reprezentacja Morse'a zawiera więcej kropek niż myślników. Na przykład litera E jest pojedynczą kropką, co oznacza, że ​​jest gruba na kropkę.

Wejście

  • Łańcuch wejściowy będzie zawierał tylko znaki z zakresu [a-z]lub [A-Z]. Możesz zdecydować, czy wszystkie powinny być wielkie, czy wszystkie małe. AAAjest w porządku, aaajest w porządku, aAanie jest.
  • Ciąg wejściowy zawsze będzie miał co najmniej 1 znak.
  • Możesz założyć, że ciągi wejściowe nigdy nie będą miały takiej samej liczby kropek i myślników.

Wynik

Powinieneś zwrócić Truthy dla danych wejściowych, które zawierają więcej znaków kropek.
Powinieneś zwrócić Falsy dla danych, które zawierają więcej znaków myślnika.
Edycja: Pozwolę również na wartość dodatnią dla kropki i ujemną dla kreski.

Przypadki testowe

| input | morse representation | result          |
|------------------------------------------------|
| S     | ...                  | Truthy          |
| k     | -.-                  | Falsy           |
| HELLO | .... . .-.. .-.. --- | Truthy          |
| code  | -.-. --- -.. .       | Falsy           |

Odniesienie

Międzynarodowy kod Morse'a

To jest . Najkrótszy kod w bajtach wygrywa.



4
Czy możemy zwrócić wartość powyżej 0 dla dotheavy i wartość ujemną dla dash-heavy?
Wcielenie nieznajomości

@EmbodimentofIgnorance To działa dla mnie, o ile określisz to w swoim poście. Nie sądzę, że zwykle przechodzi pozytywny test fałszowania, ale w tym przypadku wydaje się dobrym rozwiązaniem, więc pozwolę
Bassdrop Cumberwubwubwub

Odpowiedzi:


5

APL (Dyalog Extended) , 24  15 bajtów SBCS

-9 dzięki Ven

Anonimowa funkcja ukrytego przedrostka, przyjmująca za argument wielkie litery.

>/'.-'⍧∊∘⌂morse

Wypróbuj online!

⌂morse konwertować do listy ciągów Morse
 następnie
ε nlist (spłaszczyć)
'.-'⍧ policzyć liczbę kropek i kresek w tym, że
>/ więcej punktów niż kresek? (litera większa niż redukcja)


dlaczego nie mieć domyślnie rozszerzonego wstępnego ładowania plików dfns?
ngn

@ngn Jest teraz wbudowany
Adám

7

IBM PC DOS, zestaw 8088, 54 35 bajtów

-19 bajtów przy użyciu metody różnicowej

ac2c 41d0 d8d7 7206 51b1 04d2 e859 240f 2c03 02e0 e2ea 3534 4527 4125 1303 1462 4523 13

Niezmontowane:

; compare dashes and dots in a morse code string
; input:
;   I: pointer to input string (default SI)
;   IL: length of input string (default CX)
;   TBL: pointer to data table (default BX)
; output:
;   Sign/OF flags: Dot-heavy: SF == OF (JGE), Dash-heavy: SF != OF (JL)
MORSE_DD    MACRO   I, IL, TBL
            LOCAL   LOOP_LETTER, ODD
        IFDIFI <I>,<SI>     ; skip if S is already SI
    MOV  SI, I              ; load string into SI 
        ENDIF
        IFDIFI <IL>,<CX>    ; skip if IL is already CX
    MOV  CX, IL             ; set up loop counter
        ENDIF
        IFDIFI <TBL>,<BX>   ; skip if TBL is already BX
    MOV  BX, OFFSET TBL     ; load letter table into BX
        ENDIF
LOOP_LETTER:
    LODSB                   ; load next char from DS:SI into AL, advance SI
    ;AND  AL, 0DFH           ; uppercase the input letter (+2 bytes)
    SUB  AL, 'A'            ; convert letter to zero-based index
    RCR  AL, 1              ; divide index by 2, set CF if odd index
    XLAT                    ; lookup letter in table
    JC   ODD                ; if odd index use low nibble; if even use high nibble
    PUSH CX                 ; save loop counter (since SHR can only take CL on 8088)
    MOV  CL, 4              ; set up right shift for 4 bits
    SHR  AL, CL             ; shift right
    POP  CX                 ; restore loop counter
ODD:
    AND  AL, 0FH            ; mask low nibble
    SUB  AL, 3              ; unbias dash/dot difference +3 positive
    ADD  AH, AL             ; add letter difference to sum (set result flags)
    LOOP LOOP_LETTER
        ENDM

TBL DB 035H, 034H, 045H, 027H, 041H, 025H, 013H, 003H, 014H, 062H, 045H, 023H, 013H

Wyjaśnienie

Zaimplementowano w składni Intel / MASM jako MAKRO (w zasadzie funkcja), używając tylko instrukcji zgodnych z 8088. Wprowadź ciąg wielkich liter (lub +2 bajty, aby zezwolić na pisanie wielkimi literami), wyślij wynik Truthy / Falsy SF == OF(użyj JGlubJL przetestuj).

Wartości w tabeli różnic między literami są przechowywane jako binarne skrypty, więc w sumie zajmuje tylko 13 bajtów.

Oryginalny (54 bajty):

; compare dashes and dots in a Morse code string
; input:
;   I: pointer to input string (default SI)
;   IL: length of input string (default CX)
;   TBL: pointer to data table
; output:
;   Carry Flag: CF=1 (CY) if dot-heavy, CF=0 (NC) if dash-heavy
MORSE_DD    MACRO   I, IL, TBL
            LOCAL   LOOP_LETTER
        IFDIFI <I>,<SI>     ; skip if S is already SI
    MOV  SI, I              ; load string into SI 
        ENDIF
        IFDIFI <IL>,<CX>    ; skip if IL is already CX
    MOV  CX, IL             ; set up loop counter
        ENDIF
    MOV  BX, OFFSET TBL     ; load score table into BX
    XOR  DX, DX             ; clear DX to hold total score
LOOP_LETTER:
    LODSB                   ; load next char from DS:SI into AL, advance SI
    ;AND  AL, 0DFH           ; uppercase the input letter (+2 bytes)
    SUB  AL, 'A'            ; convert letter to zero-based index
    XLAT                    ; lookup letter in table
    MOV  AH, AL             ; examine dot nibble
    AND  AH, 0FH            ; mask off dash nibble
    ADD  DH, AH             ; add letter dot count to total
    PUSH CX                 ; save loop counter (since SHR can only take CL)
    MOV  CL, 4              ; set up right shift for 4 bits
    SHR  AL, CL             ; shift right
    POP  CX                 ; restore loop counter
    ADD  DL, AL             ; add letter dash count to total
    LOOP LOOP_LETTER
    CMP  DL, DH             ; if dot-heavy CF=1, if dash-heavy CF=0
        ENDM

; data table A-Z: MSN = count of dash, LSN = count of dot
TBL DB 011H, 013H, 022H, 012H, 001H, 013H, 021H, 004H, 002H 
    DB 031H, 021H, 013H, 020H, 011H, 030H, 022H, 031H, 012H
    DB 003H, 010H, 012H, 013H, 021H, 022H, 031H, 022H

Wyjaśnienie

Zaimplementowane w składni Intel / MASM jako MAKRO (w zasadzie funkcja), przy użyciu instrukcji zgodnych tylko z 8088. Wprowadź jako ciąg, a wynik Truthy / Falsy spowoduje przeniesienie flagi. Tabela wyników zawiera liczbę myślników i kropek na literę.

Dane wejściowe są pisane wielkimi literami. Dodaj 2 bajty, aby zapisać małe lub mieszane małe litery.

Przykładowy program testowy (jako samodzielny plik COM komputera IBM PC DOS)

    SHR  SI, 1              ; point SI to DOS PSP
    LODSW                   ; load arg length into AL, advance SI to 82H
    MOV  CL, AL             ; set up loop counter in CH
    DEC  CX                 ; remove leading space from letter count

    MORSE_DD SI, CX, TBL    ; execute above function, result is in CF

    MOV  DX, OFFSET F       ; default output to "Falsy" string
    JA   DISP_OUT           ; if CF=0, result is falsy, skip to output
    MOV  DX, OFFSET T       ; otherwise CF=1, set output to "Truthy" string
DISP_OUT:
    MOV  AH, 09H            ; DOS API display string function
    INT  21H
    RET

T   DB "Truthy$"
F   DB "Falsy$"

Przykładowe dane wyjściowe:

wprowadź opis zdjęcia tutaj

Pobierz program testowy DD.COM

Lub wypróbuj online! Nie znam internetowego TIO do bezpośredniego linku do pliku wykonywalnego DOS, jednak możesz tego użyć w kilku krokach:

  1. Pobierz DD.COM jako plik ZIP
  2. Idź do https://virtualconsoles.com/online-emulators/DOS/
  3. Prześlij pobrany plik ZIP, kliknij przycisk Start
  4. Wpisz DD Hellolub DD codedo treści twojego serca

Być może czegoś mi brakuje, ale czy to makro nie przyjmuje AH = 0 przy wejściu? To prawda, że ​​założenie to jest ważne podczas korzystania z programu testowego.
gastropner

1
Dobre oko! Założenie opiera się na wartościach rejestru początkowego uruchamiania DOS, które dla prawie wszystkich wersji DOS są 0000hdla źródła AX: fysnet.net/yourhelp.htm
640KB

Od jednego golfisty do drugiego: fajnie ! Dodatkowe punkty stylu za korzystanie z instrukcji całkowicie zgodnych z 8088. To platforma, na której gra w golfa jest w dużej mierze równoważna z optymalizacją i naprawdę zagubioną sztuką. Fajny użytek z XLATrobienia dokładnie tego, co powinien. Jeśli faktycznie optymalizowałeś szybkość w porównaniu z rozmiarem, chciałbyś wykonać wyszukiwania wielkości WORD. Nadal jest to szybka wygrana nawet w 8088 z jej anemiczną 8-bitową zewnętrzną magistralą, ponieważ podwajasz przepustowość bez zwiększania rozmiaru kodu, z wyjątkiem XCHGinstrukcji lub dwóch.
Cody Gray

@CodyGray dzięki! Zawsze jest fajnie, gdy wyzwanie dobrze układa się z platformą i zestawem instrukcji. Plus jest fajnie, gdy można osiągnąć coś na oryginalnym komputerze 8088 w 1 bajcie (np. XLAT), Nawet jeśli potrzeba 6 bajtów, aby wykonać przesunięcie bitowe w prawo o 4 miejsca (wewnątrz a LOOP).
640 KB

Tak. Aby uzyskać wydajność, zdecydowanie chcesz wykonać 4 oddzielne zmiany o 1, eliminując push i pop. To nawet nie tak dużo więcej bajtów (+2), więc ogólnie wygrana netto, ale niezbyt dobra do gry w golfa. Prawdziwa zabawa przychodzi, gdy wyzwanie nie zgadza się z ISA, i musisz rozwinąć umysł, aby znaleźć nowe, innowacyjne sposoby stosowania istniejących elementów konstrukcyjnych. 1-bajtowe instrukcje strun są naprawdę fajne na 8088 pod względem wydajności, a także gry w golfa. Używam ich w prawdziwym kodzie. Sądzę, że XLAT nie ma dla mnie większego zastosowania, ponieważ nowoczesna architektura uprzedziła mnie do LUT.
Cody Gray

7

Java (JDK) , 131 124 110 84 64 bajty

Co ciekawe, „kropka” jest ciężka, a „kreska” jest ciężka.

Pobiera dane we wszystkich wielkich literach jako IntStream(przewiń w dół, aby uzyskać wersję z wartością rzeczywistą, Stringaby uzyskać dodatkowe 8 bajtów). Miałem sporo pomocy w golfa: dzięki Expired Data za grę w golfa 20 bajtów, Neilowi w golfa za 26 bajtów, Olivierowi Grégoire'owi za grę w golfa 18 bajtów i Kevinowi Cruijssenowi za grę w golfa 2 bajty.

Zawiera 26 niedrukowalnych znaków w podwójnych cudzysłowach.

c->c.map(a->"".charAt(a-65)-4).sum()>0

Wypróbuj online!

Nie golfowany:

c -> // lambda taking input as an IntStream in upper case and returning a boolean
  c.map(a -> "" // map each character's ASCII value to its net dot impact (unprintable characters here)
    .charAt(a - 65) // translate the ASCII code into a zero-based index into the above string (65 is 'A')
    - 4) // unprintables are > 0, this restores the proper values
  .sum() > 0 // add up all the values, positive sum indicates a dot-heavy input string

Java (JDK) , 131 124 110 84 72 bajty

Dla purystów; przyjmuje dane wejściowe jako String. Dzięki Expired Data za grę w golfa 20 bajtów, Neilowi w golfa 26 bajtów i Olivierowi Grégoire'owi w golfa 10 bajtów.

s->s.chars().map(a->"".charAt(a-65)-4).sum()>0

Wypróbuj online.

Nie golfowany:

s -> // lambda taking input as a String in upper case and returning a boolean
  s.chars() // convert to a stream of characters
  .map(a -> "" // map each character's ASCII value to its net dot impact (unprintable characters here)
    .charAt(a - 65) // translate the ASCII code into a zero-based index into the above string (65 is 'A')
    - 4) // unprintables are > 0, this restores the proper values
  .sum() > 0 // add up all the values, positive sum indicates a dot-heavy input string



2
Dlaczego nie użyć "35344527512513031462452313".charAt(a-65)-51?
Neil


1
@ OlivierGrégoire Twój 66-bajt ma w rzeczywistości 65 lat, ponieważ zapomniałeś usunąć dolnego średnika. Można jednak zapisać jeszcze 1 bajt przy użyciu znaków niedrukowalnych: 64 bajty
Kevin Cruijssen

4

Galaretka , 21 bajtów

Oị“ÆġwıMƥ)ɠịṙ{’D¤Æm>4

Wypróbuj online!

W jaki sposób?

Oị“ÆġwıMƥ)ɠịṙ{’D¤Æm>4 - Link: list of characters ([A-Z]), S
                ¤     - nilad followed by link(s) as a nilad:
  “ÆġwıMƥ)ɠịṙ{’       -   base 250 integer = 14257356342446455638623624
               D      -   to decimal digits
                      -   -- that is the number of dots less the number of dashes plus 4
                      -      ... for each of OPQRSTUVWXYZABCDEFGHIJKLMN
O                     - ordinals of S   e.g. "ATHROUGHZ" -> [65,84,72,82,79,85,71,72,90]
 ị                    - index into (1-indexed & modular, so O gets the 79%26 = 1st item
                      -                                  or A gets the 65%26 = 13th item
                 Æm   - arithmetic mean
                   >4 - greater than 4?

4

05AB1E , 22 21 bajtów

Oszczędność bajtu dzięki Kevinowi Cruijssenowi

SA•U(Õþć6Δ
»›I•‡3-O.±

Wypróbuj online!

Wyjaśnienie

•U(Õþć6Δ
»›I•

jest 35344527512513031462452313 skompresowany do podstawy 255.

S              # split input into list of chars
       ‡       # transliterate
 A             # the lowercase alphabet
  •...•        # with the digits from the compressed string
        3-     # subtract 3 from each              
          O    # then sum the result
           .±  # and take the sign

Możesz zapisać bajt, zastępując mapę na S.
Kevin Cruijssen

@KevinCruijssen: Dzięki! Byłem pewien, że tego spróbowałem, ale najwyraźniej nie :)
Emigna

3
usdgpsahsoaboutlopezgbidoldov = ord(c)*3%83%8

@Arnauld: Ciekawe! Jak się tego dowiedziałeś? Mam nadzieję, że nie ręcznie: P
Emigna

1
Brutalnie wymusiłem wszystkie pary słów i najdłuższy mecz był aboutlopez. Potem szukałem innych dopasowań z tym samym mnożnikiem i modulo. (Więc absolutnie nie ma gwarancji, że będzie optymalna.)
Arnauld




3

Python 2 , 73 70 69 bajtów

lambda s:sum(int(`0x21427b563e90d7783540f`[ord(c)%25])-3for c in s)>0

Wypróbuj online!

Tylko wielkie litery

-3 bajty, dzięki Erikowi Outgolfer


Zarówno wersja wielka, jak i mała:

Python 2 , 73 71 bajtów

lambda s:sum(int(oct(0x1d7255e954b0ccca54cb)[ord(c)%32])-3for c in s)>0

Wypróbuj online!



2

Stax , 20 bajtów

ÉBÜ◙ƒ╣<Hf6─òɼsäS╗◄↔

Uruchom i debuguj

Rozpakowane, niepolowane i skomentowane, wygląda to tak.

"45D.J57KBJa`"I"    string literal with code points [52 53 68 46 74 53 55 75 66 74 97 34 73]
$                   flatten to string "52536846745355756674973473"
;                   push input
@                   get string characters at indices 
                    (using input codepoints as indices; lookups wrap around)
:V                  arithmetic mean
53>                 is greater than 53

Uruchom ten


2

Rubinowy , 64 bajty

->s{n=0;s.bytes{|i|n+=("[E[LduRgmQSMK"[i%13].ord>>i%2*3)%8-3};n}

Wypróbuj online!

Wykorzystuje 13-bajtowy ciąg magiczny, po 2 cyfry 0..7zakodowane w każdym bajcie. Odejmij 3 dla zakresu -3..4.

Kod ASCII dla A(a także N) wziętego modulo 13 jest przez przypadek równy zero.


1

Retina 0.8.2 , 51 bajtów

T`L`35344527412513031462452313
.
$*<>>>
+`<>|><

^<

Wypróbuj online! Link zawiera przypadki testowe. Akceptuje tylko duże litery (+6 bajtów dla mieszanych). Bezwstydnie kradnie ciąg @ Arnaulda, ale i tak zamierzałem użyć tego samego algorytmu. Wyjaśnienie:

T`L`35344527412513031462452313
.

Zmień każdą literę na różnicę w liczbie kropek i myślników plus trzy, więc O=0i H=7.

$*<>>>

Reprezentują różnicę jako liczbę <s i trzy >s. (Niestety nie mogę używać kropek, ponieważ są one wyjątkowe w wyrażeniach regularnych).

+`<>|><

Usuń dopasowane pary <s i >s.

^<

Sprawdź, czy pozostały jeszcze jakieś kropki.


1

Bash + coreutils,  64  60 bajtów

tr a-z 35344526512513031462452313|sed s/./\&z-+/g|dc -eIK?^p

Wypróbuj online!

Bierze ciąg znaków małymi literami, zwraca zero dla fałszu, niezerowe dla prawdy

Wyjaśnienie

Używa tr i sed, aby utworzyć program dc, który wygląda (na przykład wpisz „hello”):

IK6z-+4z-+5z-+5z-+0z-+^p

IK     Push 10, then 0 to the stack
6z-+  Push 6 (three more than the dots minus dashes in 'h'), subtract 3, and accumulate
...    Do the same for all other letters, so the stack now has the total dots minus dashes
^      Raise 10 to this power - precision is zero so this turns negative/positive to falsy/truthy
p      Print result

Grał w golfa dwa bajty, po prostu wstawiając dc do potoku, zamiast używać zastępowania poleceń, a następnie inny bajt, zastępując <space>3go z(wygodnie, mam w tym momencie 3 elementy na stosie!) I kolejny bajt, zastępując cudzysłowy wokół mojego programu sed słowem pojedynczy ukośnik, aby uciec&
Sophia Lechner

1

R , 74 70 bajtów

f=utf8ToInt;sum(f("42433250265364746315325464")[f(scan(,''))-96]-52)<0

wejście powinno być pisane małymi literami, zwraca TRUE lub FALSE

Wypróbuj online


1

TI-BASIC (TI-84), 111 bajtów

:Ans→Str1:"ABCDEFGHIJKLMNOPQRSTUVWXYZ→Str2:"35344527512513031462452312→Str3:0<sum(seq(expr(sub(Str3,inString(Str2,sub(Str1,X,1)),1)),X,1,length(Str1))-3

Użyłem tego samego ciągu do określenia ciężkości kropek, jak niektóre inne odpowiedzi.
Program zwraca truey ( 1), jeśli ciąg wejściowy jest ciężki od kropek, a falsy ( 0), jeśli nie.
Łańcuch wejściowy musi być wielkimi literami.
Dane wejściowe są przechowywane w Ans. Dane wyjściowe są zapisywane Ansi automatycznie drukowane po zakończeniu programu.

Nie golfowany:

:Ans→Str1
:"ABCDEFGHIJKLMNOPQRSTUVWXYZ→Str2 
:"35344527512513031462452312→Str3
:0<sum(seq(expr(sub(Str3,inString(Str2,sub(Str1,X,1)),1)),X,1,length(Str1))-3

Przykład:

"HELLO
HELLO
prgmCDGF3
           1
"CODE
CODE
prgmCDGF3
           0

Objaśnienie:
(TI-BASIC nie ma komentarzy, załóżmy, że ;oznacza to komentarz)

:Ans→Str1                          ;store the input into Str1
:"ABCDEFGHIJKLMNOPQRSTUVWXYZ→Str2  ;store the uppercase alphabet into Str2
:"35344527512513031462452312→Str3  ;store dot-dash+3 for each letter into Str3

:0<sum(seq(expr(sub(Str3,inString(Str2,sub(Str1,X,1)),1)),X,1,length(Str1))-3 ;full logic

   sum(                                                                       ;sum the elements of
       seq(                                                               )    ;the list evaluated by
                sub(                                    )                       ;the substring of
                    Str3,                                                        ;Str3
                         inString(                  ),                           ;at the index of
                                       sub(        )                              ;the substring of
                                           Str1,                                   ;Str1
                                                X,                                 ;starting at X
                                                  1                                ;of length 1
                                  Str2,                                           ;in Str2
                                                      1                          ;of length 1
           expr(                                        ),                       ;converted to an integer
                                                          X,                    ;using X as the increment variable
                                                            1,                  ;starting at 1
                                                              length(Str1)      ;ending at the length of Str1
                                                                           -3   ;then subtract 3 from all elements in the list
  0<                                                                           ;then check if the sum is greater than 0
                                                                               ;implicitly output the result

Uwaga: Liczba bajtów programu jest obliczana przy użyciu wartości w [MEM] > [2] > [7] (124 bajty), a następnie odejmując długość nazwy programu,CDGF3 , (5 bajtów) i dodatkowe 8 bajtów używanych dla przechowywanie programu:

124 - 5 - 8 = 111 bajtów




0

C ++ (skompilowany z Visual Studio 2017) 171 bajtów

int f(string i){const char*c="1322131421130102123023121211210120032121323101112232";int j=0,h[2]={0};while(j<sizeof(i)/28)*h+=c[i[j]-97],h[1]+=c[i[j++]-71];return*h>h[1];}

jeśli weźmiemy pod uwagę główny program, który istnieje do celów testowych, jego więcej.

jest to wariant „schludny” bez golfisty

#include "stdafx.h"
int main()
{
    const int dotCount[] = {1,3,2,2,1,3,1,4,2,1,1,3,0,1,0,2,1,2,3,0,2,3,1,2,1,2};
    const int dashCount[] = {1,1,2,1,0,1,2,0,0,3,2,1,2,1,3,2,3,1,0,1,1,1,2,2,3,2};
    std::cout << "Enter String:\n";
    std::string input;
    std::cin >> input;
    int inputsHeavyness[2] = { 0 };
    for(int i = 0;i < sizeof(input)/sizeof(std::string);i++)
    {
        inputsHeavyness[0] += dotCount[input[i] - 'a'];
        inputsHeavyness[1] += dashCount[input[i] - 'a'];
    }
    if (inputsHeavyness[0] > inputsHeavyness[1])
    {
        std::cout << "Dot Heavy\n";
    }
    else
    {
        std::cout << "Dash Heavy or Neutral\n";
    }
    return 0;
}

zakłada wszystkie małe litery


1
Możesz dodać link TIO . (Poza tym myślę, że masz literówkę w nie golfowym kodzie: tak 22powinno być 2.)
Arnauld

tak, to może być literówka. Chyba naprawiłem to jednak w wersji golfowej. Tio dobrze i nie mają pojęcia o tej rzeczy (myślę, że spojrzał na nią raz i zrobił to wyposażone IM za pomocą kompilatora tak wynikach między vs2017 i tio najprawdopodobniej nie zmieniać dobre na wszystko?)
der bender

1
145 bajtów . Wyniki mogą się różnić między VS a TIO. Czasami też się to różni i faktycznie używam GCC (chociaż MinGW).
gastropner

1
Poprawiono @ceilingcat na 131 bajtów
gastropner

1
Opierając się na @gastropner 111 bajtów Połączono obie tablice w jedną; "132...i "112...stają się "353...i 51są wartością ASCII3
ceilingcat

0

c (118 znaków) zwraca wartość dodatnią dla nadmiernej kropki i wartość ujemną dla nadmiernej kreski

int n(char* c){int v=25124858,d=3541434,i=0,o=0;for(;c[i]!=0;i++)o=(1&(v>(c[i]-65)))>0?(1&(d>>(c[i]-65)))>0?o+1:o-1:o;return o;}

bez golfa

int n(char* c)
{
  // Bitwise alpha map: 
  // more dots = 1
  // more dashes or equal = 0
  int d=3541434;  
  // validation bit map.
  // dot/dash heavy = 1
  // even = 0
  int v=25124858;
  int i=0,o=0;
  for(;c[i]!=0;i++)   // iterate through all values
  {
    // There is no way to make this pretty
    // I did my best.
    // If the little endian validation bit corresponding
    // to the capitol letter ascii value - 65 = 0,
    // the output does not increment or decrement.
    // If the value is one it increases or decreases based
    // on the value of the d bitmap.
    o=(1& ( v > (c[I] - 65))) > 0 ?
      (1 & (d >> (c[I] - 65))) > 0 ?
        o + 1 :
        o - 1 :
      o;
  }
  return o;
}


Muszę wyznać, że nie do końca rozumiem porównanie 1& ( v > (c[I] - 65)), które jest takie samo, jak v > c[I] - 65nie mogę sobie wyobrazić, że jest zawsze fałszywe, więc moglibyśmy to wszystko usunąć podczas riffowania na @ceilingcat przez 56 bajtów
gastropner

0

MathGolf , 22 bajty

{▄="Yⁿ∩┐↑rⁿ¼~<↔"$▒3-§+

Wypróbuj online!

Używa tej samej metody, co wiele innych odpowiedzi, gdzie ⁿ∩┐↑rⁿ¼~<↔"reprezentuje magiczną liczbę 35344527512513031462452313.


0

Python 2, 90 86 bajtów

import morse
s=''.join(morse.string_to_morse(input()))
print s.count('.')>s.count('-')

pracowałem nad moją lokalną biblioteką Morse'a . -4 bajty. Dzięki za wskazówkę @JoKing!

Ponadto jest to 1 bajt więcej, jeśli jest w Pythonie 3.

Python 3, 87 bajtów

import morse
s=''.join(morse.string_to_morse(input()))
print(s.count('.')>s.count('-'))

Chociaż pytanie zakłada, że ​​liczba „.” I „-” nie będzie równa; jeśli są one równe, ten kod zwróci True.


To znaczy, możesz użyć inputzamiast, raw_inputjeśli chcesz ...
Jo King

@JoKing próbowałem.
Zgłaszał

musisz po prostu wstawić cudzysłowy wokół ciągu, ponieważ inputewaluuje STDIN przed przekazaniem go do programu
Jo King

To bardzo uczciwa kwestia. Czuję się głupio, że tego przegapiłem! : 3
Koishore Roy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.