彼らは私をインスペクターモールスと呼んでいます


20

あなたの使命は、あなたがそれを受け入れることを選択した場合、与えられた入力文字列がドットヘビーであるか、ダッシュヘビーであるかを決定することです。

文字列は、モールス表現にダッシュよりも多くのドットが含まれている場合、ドットが多くなります。たとえば、文字Eは単一のドットであり、ドットが多いことを意味します。

入力

  • 入力文字列には、[a-z]またはの範囲の文字のみが含まれます[A-Z]すべて大文字にするか、すべて小文字にするかを決定できます。AAA結構です、aaa結構です、そうでaAaはありません。
  • 入力文字列の長さは常に少なくとも1文字です。
  • 入力文字列のドットとダッシュの量が同じになることはないと想定できます。

出力

より多くのドット文字を含む入力に対してTruthyを返す必要があります。
より多くのダッシュ文字を含む入力に対しては、Falsyを返す必要があります。
編集:ドットの正の値とダッシュの負の値も許可します。

テストケース

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

参照

国際モールス符号

これはです。バイト単位の最短コードが優先されます。



4
dotheavyに0より大きい値を返し、dash-heavyに負の値を返すことはできますか?
無知の

@EmbodimentofIgnorance投稿で指定する限り、それは私にとってはうまくいきます。私は通常、それが真実の偽のテストに合格するとは思わないが、この場合には良い解決策のように感じるので、私はそれを許可します
Bassdrop Cumberwubwubwub

回答:


5

APL(Dyalog Extended)24  15 バイトSBCS

-9 Venに感謝

引数として大文字を使用する匿名の暗黙の接頭辞関数。

>/'.-'⍧∊∘⌂morse

オンラインでお試しください!

⌂morse モールス文字列のリストに変換
 後、
ε NLIST(平ら)
'.-'⍧ という点で、ドットとダッシュの回数カウント
>/ ダッシュよりも多くのドットを?(点灯。より大きい)


デフォルトで拡張プリロードdfnsを持たないのはなぜですか?
NGN

@ngn現在では、内蔵された
アダム・

7

IBM PC DOS、8088アセンブリ、 54 35バイト

差メソッドを使用して-19バイト

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

組み立てられていない:

; 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

説明

MACRO(基本的には関数)としてIntel / MASM構文で実装され、8088互換の命令のみを使用します。大文字の文字列(または大文字と小文字が混在する場合は+2バイト)として入力し、出力Truthy / Falsyの結果はSF == OF(使用JGまたはJLテストするため)です。

文字差テーブルの値はバイナリニブルとして保存されるため、合計で13バイトしかかかりません。

オリジナル(54バイト):

; 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

説明

MACRO(基本的には関数)としてIntel / MASM構文で実装され、8088互換の命令のみを使用します。文字列として入力し、キャリーフラグでTruthy / Falsyの結果を出力します。スコア表には、文字ごとのダッシュとドットの数が含まれています。

入力は大文字です。2バイトを追加して、小文字または大文字と小文字を区別します。

サンプルテストプログラム(IBM PC DOSスタンドアロンCOM実行可能ファイルとして)

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

出力例:

ここに画像の説明を入力してください

テストプログラムDD.COMをダウンロードする

または、オンラインでお試しください! DOS実行可能ファイルに直接リンクするオンラインTIOについては知りませんが、ほんの数ステップでこれを使用できます。

  1. DD.COMをZIPファイルとしてダウンロードする
  2. https://virtualconsoles.com/online-emulators/DOS/にアクセスます
  3. ダウンロードしたZIPファイルをアップロードし、[開始]をクリックします
  4. 入力するDD HelloDD code、あなたの心のコンテンツに

私は何かを見逃しているかもしれませんが、そのマクロはエントリ時にAH = 0を想定していませんか?確かに、その仮定はテストプログラムを使用するときに有効です。
ガストロプナー

1
良い目!想定は、DOS実行の初期スタートアップレジスタ値に基づいています。DOSのほとんどすべてのバージョンは0000h、AXソース用です:fysnet.net/yourhelp.htm
640KB

ある組立ゴルファーから別のゴルファーへ:いいね!純粋に8088互換の命令を使用するための追加のスタイルポイント。これは、コードゴルフが最適化とほぼ同等のプラットフォームであり、本当に失われた芸術です。を使用して、XLAT意図したとおりの処理を実行できます。サイズよりも速度を実際に最適化している場合は、WORDサイズの検索を実行する必要があります。貧弱な8ビット外部バスを備えた8088でも、コードサイズを増やすことなくスループットを2倍にし、XCHG1つまたは2つの命令を節約するため、これは依然として速度の向上につながります。
コーディグレイ

@CodyGrayありがとう!チャレンジがプラットフォームと命令セットとうまく並んでいるとき、それは常に楽しいです。さらに、元のPCの8088で1バイト(などXLAT)で何かを達成できる場合は、ビット単位の右4桁シフト(a内LOOP)を行うのに6バイトかかりますが、すっきりしています。
640KB

うん。パフォーマンスを向上させるには、プッシュとポップを排除して、1ずつ4回シフトすることをお勧めします。それ以上のバイト数(+2)もないため、全体としては正味の勝利ですが、ゴルフには向いていません。課題 ISAに合わない場合、本当に楽しいのは、既存の構成要素を適用する新しい革新的な方法を見つけるために心を伸ばす必要がある場合です。8088では、1バイトの文字列命令がパフォーマンスとゴルフの両方に適しています。実際のコードで使用します。XLATはあまり使用されないことが多いのですが、現代のアーキテクチャではLUTに偏っているためだと思います。
コーディグレイ

7

JAVA(JDK) 131の 124 110 84 64バイト

興味深いことに、「ドット」は一点鎖線で、「ダッシュ」は一点鎖線です。

すべての大文字で入力を取得しますIntStreamString8バイト余分に実際のバージョンをスクロールダウンします)。私はこれをゴルフするのに非常に多くの助けがありました:20バイトのゴルフの有効期限切れのデータ、26バイトのゴルフのニール、18バイトのゴルフのオリヴィエ・グレゴワール、2バイトのゴルフのケビン・クルーセンに感謝します。

二重引用符内に26個の印刷できない文字が含まれています。

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

オンラインでお試しください!

ゴルフをしていない:

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バイト

純粋主義者向け。入力をとして受け取りますString。20バイトのゴルフの有効期限切れデータ、26バイトのゴルフのニール、10バイトのゴルフのオリビエグレゴワールに感謝します。

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

オンラインでお試しください。

ゴルフをしていない:

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
なぜ使用しないの"35344527512513031462452313".charAt(a-65)-51ですか?
ニール


1
@OlivierGrégoire末尾のセミコロンを削除するのを忘れたため、66バイトは実際には65バイトです。ただし、印刷できない文字を使用すると、さらに1バイトを保存できます。64バイト
Kevin Cruijssen

4

ゼリー、21 バイト

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

オンラインでお試しください!

どうやって?

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

05AB1E22 21バイト

Kevin Cruijssenのおかげで1バイト節約

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

オンラインでお試しください!

説明

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

35344527512513031462452313はベース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

マップをに置き換えると、バイトを保存できますS
ケビンクルーッセン

@KevinCruijssen:ありがとう!私はそれを試みたと確信していましたが、明らかにそうではありませんでした:)
Emigna

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

@アーナウルド:面白い!どのようにしてそれを見つけましたか?ない手で、私は願っています:P
Emigna

1
すべての単語ペアを総当たり攻撃し、最長一致はでしたaboutlopez。次に、同じ乗数とモジュロを使用した他の一致を探しました。(したがって、最適であることが絶対に保証されるわけではありません。)
Arnauld






2

スタックス、20 バイト

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

実行してデバッグする

開梱されていない、コメントされていない、これはこのように見える

"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

これを実行する



1

Retina 0.8.2、51バイト

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

^<

オンラインでお試しください!リンクにはテストケースが含まれます。大文字のみを使用できます(大文字と小文字が混在する場合は+6バイト)。@Arnauldの文字列を恥知らずに盗みましたが、とにかく同じアルゴリズムを使用するつもりでした。説明:

T`L`35344527412513031462452313
.

各文字を、ドットとダッシュの数の差に加えて、3つに変更O=0H=7ます。

$*<>>>

その数を<3と3 で表した差を>表します。(残念ながら、ドットは正規表現で特別なため使用できません。)

+`<>|><

<sと>sの一致したペアを削除します。

^<

まだドットが残っているかどうかを確認します。


1

Bash + coreutils、 64  60バイト

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

オンラインでお試しください!

小文字の文字列を受け取り、偽りの場合はゼロ、真偽の場合は非ゼロを出力します

説明

trとsedを使用して、次のようなdcプログラムを作成します(入力例「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

ただパイプラインではなく、使用するコマンド置換でDCを入れて2つのバイトをGolfed、その後、交換することにより、別のバイト<space>3とはz(便利な、私はその時点でスタック上の3つのアイテムを持っている!)で、私のsedプログラムの前後に引用符を置き換えることにより、別のバイトエスケープする単一のバックスラッシュ&
ソフィア・レヒナー


1

TI-BASIC(TI-84)、111バイト

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

ドットの重さを決定するために、他の回答のいくつかと同じ文字列を使用しました。入力文字列がドットを多く含む場合、
プログラムはtrue(1)を返し、そうでない場合はfalsy()を返します0
入力文字列はすべて大文字にする必要があります。
入力はに保存されAnsます。出力はAnsプログラムに保存され、プログラムが完了すると自動的に印刷されます。

ゴルフをしていない:

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

例:

"HELLO
HELLO
prgmCDGF3
           1
"CODE
CODE
prgmCDGF3
           0

説明:
(TI-BASICにはコメントがありません。コメントを;示すと仮定します)

: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

注: プログラムのバイトカウントは、[MEM] > [2] > [7](124バイト)の値を使用して評価され、次にプログラム名の長さを減算します。CDGF3、(5バイト)、およびプログラムの保存:

124-5-8 = 111バイト




0

C ++(Visual Studio 2017でコンパイル)171bytes

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];}

テスト目的のために存在するメインプログラムも考慮に入れた場合。

これは、未使用の「整頓された」バリアントです

#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;
}

すべて小文字を想定


1
TIOリンクを追加できます。(また、私はあなたが無修正コードにタイプミスを持っていると思います:これ22はそうでなければなりません2。)
Arnauld

ええ、これはタイプミスかもしれません。ゴルフバージョンではそれを修正したと思います。ョさて、私はその原料の手掛かり(私は一度それを見て、vs2017とTiOとの結果がおそらく全く良い変わりないだろうので、それは使用してコンパイライムを備えていますdidntはないでしょうか?)持っていない
ベンダーデル

1
145バイト。実際、VSとTIOで結果が異なる場合があります。それは私にとっても時々異なり、実際にGCCを使用しています(MinGWとはいえ)。
ガストロプナー

1
用@ceilingcatの微調整131バイト
gastropner

1
@gastropner 111バイトで構築両方の配列を1つに結合しました。"132...そして、"112...なる"353...51のASCII値である3
ceilingcat

0

c(118文字) は、ドットより上に正の値を、ダッシュより上に負の値を返します

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

ゴルフをしていない

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


私は完全に比較理解していないと告白しなければならない1& ( v > (c[I] - 65))のと同じで、v > c[I] - 65我々は@ceilingcatにリフながら、その全部取り除くことができるように、今までに偽の私は想像できないが、56バイト
gastropner


0

パイソン2、90の 86バイト

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

私の地元でモールスと働いた図書館。-4バイト。ヒント@JoKingをありがとう!

また、Python 3の場合は1バイト多くなります。

Python 3、87バイト

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

質問では、「。」と「-」の数は等しくないと想定していますが、等しい場合、このコードはTrueを返します。


つまり、必要に応じてinput代わりに使用できますraw_input...
Jo King

@JoKing試しました。エラーをスローしていたため、raw_inputに頼らなければなりませんでした
Koishore Roy

以来、あなただけの、文字列の前後に引用符を配置する必要がinput試用版とそのプログラムに渡す前にSTDIN
ジョー・キング

それは非常に公平な点です。私はそれを見逃しているのは愚かだと思います!:3
コイショアロイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.