Code Golf Measurer©2019


20

Code Golf Measurer©2019

使用されるHexdumpsはxxd次のようになります。

00000000: 666f 6f20 6261 7220 7370 616d 2065 6767  foo bar spam egg
00000010: 730a                                     s.

あなたの仕事は、この形式の16進ダンプを使用バイト数に変換することです。

ルール:

  • 通常の抜け穴は禁止されています。
  • これはであるため、バイト単位の最短の有効な回答が優先されます。
  • テキストの最後に改行を含める場合も含めない場合もあります(0a)。これは、hexdumpが改行(0a)で終わる場合、その入力の出力が1つ減る可能性があることを意味します。
  • 空の入力(文字通り何もない:空のリスト/文字列など)は0を出力する必要があります。
  • 入力は任意の形式で取得できます
  • 入力は制御文字のない有効なASCIIです
  • 入力には、hexdump全体が含まれている必要があります

テストケース:

00000000: 4865 6c6c 6f2c 2077 6f72 6c64 2120 4865  Hello, world! He
00000010: 6c6c 6f2c 2077 6f72 6c64 210a            llo, world!.

28または27を返します

00000000: 0a                                       .

1または0を返します

00000000: 6368 616c 6c65 6e67 650a                 challenge.

10または9を返します

00000000: 4865 6c6c 6f2c 2077 6f72 6c64 21         Hello, world!

13を返します


0を返します(これは文字通り何もありません:空のリスト/文字列など)

説明は、非標準言語に適しています。


入力がasciiであると仮定できますか?制御文字を含めることができますか?入力ルールは何ですか?一部の言語では、複数行にわたる入力を処理できません。すべての行が等しくなるように最後の行をパディングできますか?空白の入力を含めるのはなぜですか?
Stewie Griffin

@StewieGriffinはい。いいえ。はい; xxd空の文字列が入力された場合、何も出力されないためです。
gadzooks02

1
@StewieGriffinあなたは私が答えている間にあなたのコメントを編集したので、ここに拡張があります:はい; いいえ。ダンプ全体が含まれていれば、必要に応じて入力できます。最後の回答をご覧ください。はい; xxdに空の文字列が入力された場合、何も出力されないため
gadzooks02

1
@JonathanAllanああ、そうだね。
gadzooks02

1
右側にASCII化されたデータが含まれていないhexdump形式を数えるのは興味深いかもしれません。誰もが16進数部分を取り除き、残りをバイトカウントするだけです。hexdumpの最後の行のみを指定してこれを行う場合、その行の16進数の数をカウントするだけでなく、16進数(位置)の解析が強制されます。(マシンコードの解答のobjdump分解やnasmリストを見ているときに手でやるのと同じです。)私はそれをサンドボックスに投稿すべきだと思います...
Peter Cordes

回答:


12

Retina 0.8.2、8バイト

.{51}

.

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

.{51}

各行の最初の51文字を削除します。(行には52〜67文字しか使用できないため、これは常に行ごとに1回一致します。)

.

残りの非改行文字をカウントします。

空の入力をサポートする必要がない場合は7バイト:

.{52}


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

.{52}

各行の最初の52文字を削除します。(行には52〜67文字しか使用できないため、これは常に行ごとに1回一致します。)


残りの文字数(改行を含む)よりも1多い数を数えます。



@Grimyそれはただ...すごい...あなたはあなた自身の答えとしてそれを投稿しなければなりません。
ニール

最初は気づきませんでしたが、実際にはほぼ同じ答えがすでにあります
グリムミー




5

APL(Dyalog Extended)、18バイト

完全なプログラム。文字列のリスト(つまり、文字のリスト)のプロンプト。

2÷⍨≢∊(1↓≠⊆⊢)¨49↑¨⎕

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

 プロンプト

49↑¨ それぞれから最初の49文字を取ります

(次の暗黙関数をそれぞれに適用します。

 引数

 ある文字の実行に切り刻む

 パディング文字(スペース)とは異なります

1↓ 最初の「単語」をドロップします

ϵ nlist(平坦化)

 集計

2÷⍨ 2で割る


4

ゼリー、5 バイト

Ẉ_51S

整数バイトカウントを生成する行のリストを受け入れる単項リンク。

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

どうやって?

Ẉ_51S - Link: list of lists of characters, H
Ẉ     - length of each (line in H)
  51  - literal fifty-one
 _    - subtract (vectorises)
    S - sum

行のリストを受け入れることができます。また、説明を追加しますか?
gadzooks02

ああ、空の入力は空のリストですか、それとも単一の空行のリストですか?(これはエッジケースであるため、投稿で明らかにする必要があります。)
ジョナサンアラン

それは空のリスト/文字列/などです。これを明確にしました。
gadzooks02

おかげで、説明も追加されました。
ジョナサンアラン

3

C(gcc)64 55バイト

r;s[];f(l){while(*s=0,gets(s),l=strlen(s))r+=l-51;l=r;}

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

YSCのおかげで9バイト削り取られました!

以下は、おそらく長い入力に対して失敗するArnauldのJavaScriptソリューションに触発された、より脆弱なバージョンです。

C(gcc)、50バイト

s[];f(l){l=read(0,s,1<<31);l=l?l/68*16+l%68-51:0;}

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


1
に変更return rして59バイトl=r
girobuz

2
@JonathanFrechの未定義の動作は、コードゴルフではまったく問題ありません。
G.スリーペン

1
@YSC Hm、しかし、rをグローバルにすることは、何かを行う関数を定義する場合(そうでない場合main)、複数回呼び出すことができるはずだというルールに違反すると思います。
G.スリーペン


2
@girobuz while()のバイト数はと同じfor(;;)です。したがって、;while()は1バイトより長くなりfor(;;)ます。
ジョナサンフレッヒ

3

Pythonの3、48の 46バイト

lambda s:(len(s)or 51)+1-52*len(s.split('\n'))

入力は文字列として関数に渡されます。この関数は、入力(改行を含む)の長さを増分し、各行ごとに52を引きます。

オンラインで試す


2
私が見たものf=から、ヘッダーに `f =`として移動することができ、ラムダだけをコードとして残し、2バイトを保存します:オンラインで試してみてください!
gadzooks02

@ gadzooks02ありがとう、編集します。これf=は、Python不一致サーバーから選んだ習慣です。
IFcoltransG



2

05AB1E8 6バイト

€g51-O

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

文字列のリストとして入力します。

€g     get lengths of each line
51-    subtract 51 from each
O      push the sum of the resulting list
       implicitly print

1
申し訳ありませんが、入力にはhexdump全体が含まれている必要があります。(各行の末尾の文字をスキップします)
gadzooks02

ああ、私の悪い。これをスマートフォンで作成しました。16進コードの背後に何かがあるとは思わなかった。修正しました。
ドリアン

2

MathGolf7 6 バイト(非競合)

m£Ex-Σ

現在、MathGolfにはスペースを含む文字列入力のバグがあるため、競合していません(現時点では)。それらは自動的にリストに変換されます(スペースで分割されます)。TIOでは、すべてのスペースをa Bに置き換えて、意図したとおりに機能することを示しました。

文字列のリストとして入力します。

512バイトで生成するメソッドを見つけて-1バイト(3バイトでそれを行う10以上の方法の履歴を参照してください。)

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

説明:

m    # Map each string in the (implicit) input-list
 £   #  Pop the string and get the length
E    # Push 15
 x   # Reverse, but keep it an integer
     # (NOTE: simply `51` would be interpret as two values on the stack: 5 and 1)
  -  # Subtract each of the lengths by this
Σ    # Take the sum of the list
     # (after which the entire stack joined together is output implicitly as result)

この回答を投稿してからMathGolfのバグを修正していないと仮定すると、それは競合ではなく無効です。
pppery

2

IBM / Lotus Notes式言語、53バイト

@Sum(@Length(@Explode(@Right(@Left(i;"  ");": ")))/2)

FormulaにはTIOがないため、テストケースのスクリーンショットを以下に示します。

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

式は計算フィールドにあり、「Returns」の後に値を提供します。

説明

これは、Formulaがループを必要とせずにリストに関数を再帰的に適用する方法の良いデモンストレーションです。式は、編集可能な入力フィールド「i」と同じフォームの計算フィールドにあります。

  1. 途中から始めます。@Leftまた@Right、文字列の区切り文字または複数の文字を使用できます。したがって:、最初に出現する2つのスペースの右側を検索し、次に左側を検索します。Formulaは改行をリスト区切り文字と見なしているため、これを入力の各行に適用します。
  2. @ExplodeFormulaと同等のsplit関数であり、デフォルトはスペースです。,または;です。ここでもフィールドの各行に適用されますが、今回は結果が単一のリストに結合されます。
  3. @Lengthその後、リストの各メンバーに適用されます。いずれの場合も、戻り値を2で除算します。
  4. @Sum リスト全体と結果を出力します。

1
通訳(オンラインまたはダウンロード)へのリンクはありますか?
gadzooks02

残念ながら違います。フォーミュラは、IBM製品に結び付けられている独自の言語です(このサイトでこれが許可されていて、答えが「はい」であるが、Cops&Robbersのチャレンジではないかどうかをしばらく前に尋ねました)。前回私が調べたとき、Domino Designer(Formulaをサポート)は、IBMから無料でダウンロードできます。残念ながら、Windowsのみで、自宅でLinuxを実行しているため、確認できません。この回答は昼休み中に書かれたもので、残念ながらレガシーのNotesアプリをまだサポートしているのに、仕事中のマシンにはまだNotesがあります:-)
ElPedro

1
ところで、このサイトでLotus Notesを検索すると、私はこの言語でゴルフをしようとするのに十分な愚か者であることがわかります:-)
ElPedro

1

JavaScript(ES6)、34バイト

s=>(n=s.length)&&(n/68<<4)+n%68-51

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

コメント済み

s =>                // s = input string
  (n = s.length) && // n = length of s; return 0 right away if n = 0 (special case)
  (n / 68 << 4) +   // otherwise compute the number of full lines and multiply it by 16
  n % 68 - 51       // add the length of the last line minus 51





0

Zsh、36バイト

zshのデフォルトフラグの場合:

for l (${(f)1})((c+=$#l-52))
<<<$[c]

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

${(f)1}$1改行で分割し、空の行を破棄します。$[ arithmetic expansion ]ループが設定したことがない空の場合、デバイスを保護$c

Zsh、28バイト

-o extendedglob

<<<${#${(F)${(f)1}#?(#c52)}}

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

(f)改行で分割し、${ #?(#c52)}先頭の52文字を削除し(F)、リスト単位ではなく文字単位で${# }カウントするように改行で結合します。


0

asm2bf、135バイト

ゴルフバージョン:

lbl 3
mov r2,51
lbl 1
in_ r1
dec r2
jz_ r1,4
jnz r2,1
lbl 2
in_ r1
jz_ r1,4
sub r1,10
jz_ r1,3
inc r3
jmp 2
lbl 4
out r3

コメント版:

lbl 3               ; Main loop - the kinda entry point

    mov r2, 51      ; Loop 51 times.
    lbl 1           ; Loop start.
        in_ r1      ; Read character
        dec r2      ; Decrement the loop accumulator.
        jz_ r1, 4   ; If zero was read, end.
        jnz r2, 1   ; If we still loop, loop again.

    lbl 2           ; Second loop, accumulating the result.
        in_ r1      ; Read a character.
        jz_ r1, 4   ; If character is zero, end the loop and print result.
        sub r1, 10  ; Decrement r1 by 10 for next check.
        jz_ r1, 3   ; If the character - 10 (the newline) is zero, jump to 3
        inc r3      ; Increment character read amount.
        jmp 2
lbl 4
    out r3          ; Print out the result as an ASCII character.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.