公式Rubyインスペクター


30

以下は、単純なASCIIアートルビーです。

  ___
 /\_/\
/_/ \_\
\ \_/ /
 \/_\/

ASCII Gemstone Corporationの宝石商としての仕事は、新しく取得したルビーを検査し、発見した欠陥についてメモを残すことです。

幸いなことに、可能な欠陥は12種類のみであり、サプライヤはルビーに複数の欠陥がないことを保証しています。

12の欠陥12内の一つの置換に対応する_/または\空白文字(とルビの文字)。ルビーの外周に欠陥はありません。

欠陥は、どの内部キャラクターがその場所にスペースを持っているかに応じて番号が付けられます。

欠陥数

したがって、欠陥1のルビーは次のようになります。

  ___
 /\_/\
/_/  _\
\ \_/ /
 \/_\/

欠陥11のルビーは次のようになります。

  ___
 /\_/\
/_/ \_\
\ \_/ /
 \ _\/

他のすべての欠陥についても同じ考えです。

チャレンジ

欠陥の可能性のある単一のルビーの文字列を取り込むプログラムまたは関数を作成します。欠陥番号を印刷するか返送してください。欠陥がない場合、欠陥番号は0です。

テキストファイル、標準入力、または文字列関数の引数から入力を取得します。欠陥番号を返すか、標準出力に出力します。

あなたはルビーの末尾に改行があると仮定するかもしれません。後続のスペースや先頭の改行があるとは思わないかもしれません

バイト単位の最短コードが優先されます。(便利なバイトカウンター。

テストケース

ルビーの正確な13種類と、それに続く予想される出力:

  ___
 /\_/\
/_/ \_\
\ \_/ /
 \/_\/
0
  ___
 /\_/\
/_/  _\
\ \_/ /
 \/_\/
1
  ___
 /\ /\
/_/ \_\
\ \_/ /
 \/_\/
2
  ___
 /\_/\
/_  \_\
\ \_/ /
 \/_\/
3
  ___
 /\_/\
/_/ \_\
\  _/ /
 \/_\/
4
  ___
 /\_/\
/_/ \_\
\ \ / /
 \/_\/
5
  ___
 /\_/\
/_/ \_\
\ \_  /
 \/_\/
6
  ___
 /\_/\
/_/ \ \
\ \_/ /
 \/_\/
7
  ___
 /\_ \
/_/ \_\
\ \_/ /
 \/_\/
8
  ___
 / _/\
/_/ \_\
\ \_/ /
 \/_\/
9
  ___
 /\_/\
/ / \_\
\ \_/ /
 \/_\/
10
  ___
 /\_/\
/_/ \_\
\ \_/ /
 \ _\/
11
  ___
 /\_/\
/_/ \_\
\ \_/ /
 \/_ /
12

明確にするために、ルビーに末尾スペースを入れることはできませんよね?
オプティマイザー

@Optimizer正しい
カルビンの趣味

@ Calvin'sHobbies入力に末尾の改行がないことも想定できますか?
orlp

@orlpはい。それは、全体のポイントの5月
カルバンの趣味

ルビーは対称的です。たとえば、エラー#7はエラー#10と同じではありませんか?
-DavidC

回答:


13

CJam、27 23バイト

F7EC5ZV4DI8G6]qBb67%J%#

基数11を変換し、mod 67を取得し、結果のmod 19を取得してから、配列にあるもののインデックスを見つけます

[15, 7, 14, 12, 5, 3, 0, 4, 13, 18, 8, 16, 6]

魔法!

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


34

Ruby 2.0、69バイト

#!ruby -Kn0rdigest
p'×ñF<ìX‚ɲŸ_'.index Digest::MD5.digest(gets)[0]

Hexdump(文字列内のバイナリデータを忠実に表示するため):

00000000  23 21 72 75 62 79 20 2d  4b 6e 30 72 64 69 67 65  |#!ruby -Kn0rdige|
00000010  73 74 0a 70 27 d7 f1 46  3c 1f ec 58 82 c9 b2 9f  |st.p'..F<..X....|
00000020  5f 02 27 2e 69 6e 64 65  78 20 44 69 67 65 73 74  |_.'.index Digest|
00000030  3a 3a 4d 44 35 2e 64 69  67 65 73 74 28 67 65 74  |::MD5.digest(get|
00000040  73 29 5b 30 5d                                    |s)[0]|

説明:

  1. この-Knオプションは、ソースファイルをASCII-8BIT(バイナリ)として読み取ります。
  2. この-0オプションではgets、1行だけでなく、入力全体を読み込むことができます。
  3. -rdigestオプションは、ロードdigest提供するモジュールを、Digest::MD5
  4. 次に、コードは入力のMD5を実行し、ダイジェストの最初のバイトを取得し、指定されたバイナリ文字列のインデックスを取得します。

幸運なことに、MD5は最初の文字自体でユニークです
オプティマイザー

15
運は必要ありません。各バイトには256個の可能性があるため、13個のハッシュに対して最初のバイトが異なることはそれほど珍しいことではありません。しかし、何らかの理由でそれらが衝突した場合、ハッシュの2番目のバイトを使用するだけです。
クリスジェスターヤング

14
RubyでRubyインスペクターを作成します。当然!
マスト

次の挑戦:この記事自体を点検
Redwolfプログラム

7

ジュリア、 90 59バイト

間違いなく最短ではありませんが、公正な乙女ジュリアはロイヤルルビーの検査に細心の注意を払っています。

s->search(s[vec([18 10 16 24 25 26 19 11 9 15 32 34])],' ')

これは、文字列を受け入れs、対応するルビー欠陥番号を返すラムダ関数を作成します。呼び出すには、名前を付けf=s->...ます。

Ungolfed +説明:

function f(s)
    # Strings can be indexed like arrays, so we can define d to
    # be a vector of indices corresponding to potential defect
    # locations

    d = vec([18 10 16 24 25 26 19 11 9 15 32 34])

    # Check the specified locations for defects, returning the
    # defect number as the index where a space was found and
    # was not expected. If no spaces are found, 0 is returned.

    search(s[d], ' ')
end

例:

julia> f("  ___
 /\\ /\\
/_/ \\_\\
\\ \\_/ \/
 \\/_\\/")
2

julia> f("  ___
 /\\_/\\
/_/ \\_\\
\\ \\_/ \/
 \\/_\\/")
0

入力ではバックスラッシュをエスケープする必要があることに注意してください。@ Calvin'sHobbiesで問題ないことを確認しました。

質問や提案がある場合はお知らせください!


編集: Andrew Piliserの助けを借りて31バイトを保存しました!


forループsearchと配列のインデックス付けを取り除くことができます。s->(d=reshape([18 10 16 24 25 26 19 11 9 15 32 34],12);search(s[d],' '))。形状の変更は好きではありませんが、1D配列を取得するより短い方法は考えられませんでした。
アンドリューは、Reinstate Monica

@AndrewPiliser:ありがとう、本当にありがとうございます!あなたの提案を使用するように編集しました。また、reshape()を使用するよりも短い方法ですvec()。:)
アレックスA.

7

> <>(魚)、177バイト

これは長くてもユニークなソリューションです。プログラムには、コード内の固定位置に入力文字を挿入する以外に、算術演算や分岐は含まれていません

検査されたすべてのルビ構築文字(/ \ _)は、命令ポインター(IP)の方向を変更する> <>コード内の「ミラー」になる可能性があることに注意してください。

これらの入力文字を使用して、コード変更命令でそれらから迷路を構築し、pすべての出口(入力のミラーの欠落によって作成される)で対応する番号を印刷できます。

iiiiiiiii19pi1cpi18piiii2bpi27pii28pi3apiiiii37pi49pi36piiiii00pi45pii46p

    ;
   ;n
  ;nb
 ;n6S    0n;
 n3SB   cn;
 8SB!  4n;
 SB!  1n;
>B! U9n;
 ! U5
  U7n
 Uan;
 2n;
 n;
 ;

S B U文字に変更するものです/ \ _それぞれ。入力がフルルビの場合、最終的なコードは次のようになります。

\iiiiiiii19pi1cpi18piiii2bpi27pii28pi3apiiiii37pi49pi36piiiii00pi45pii46p

    ;
   ;n
  ;nb
 ;n6/    0n;
 n3/\   cn;
 8/\!  4n;
 /\!  1n;
>\! _9n;
 ! _5
  _7n
 _an;
 2n;
 n;
 ;

この素晴らしいオンライン視覚通訳でプログラムを試すことができます。改行を入力できないので、代わりにいくつかのダミー文字を使用する必要があります。そのため、例えば、完全なルビを入力できますSS___LS/\_/\L/_/S\_\L\S\_/S/LS\/_\/。(スペースもマークダウンのためにSに変更されました。)


5

CJam、41 31 29 28バイト

"-RI)11a!"q103b1e3%A/c#

いつものように、印刷できない文字については、このリンクをたどってください

こちらからオンラインでお試しください

すぐに説明


以前のアプローチ:

これは、数字/変換ロジックを変更することで削減できることをかなり確信しています。しかし、ここに最初の試みがあります:

"<KJ[]\"O=":iqN-"/\\_ "4,er4b1e3%A/#

いつものように、印刷不能文字にはこのリンクを使用します。

ロジックはとても簡単です

  • "Hash for each defect":i -これにより、欠陥ごとのハッシュがインデックスとして取得されます
  • qN-"/\\_ "4,er -これは文字を数字に変換します
  • 4b1e3%A/ -これは、変換後の基本数の一意の数です
  • # 次に、ハッシュで一意の番号のインデックスを見つけるだけです

こちらからオンラインでお試しください


近いので、私はあなたより1文字短いです!
-orlp

ああ、すでに28があります。忙しすぎて更新できませんでした
オプティマイザー

私の答えはPythに最適だと思います。Pythには本当にハッシュ関数が必要です(.h組み込みの信頼性が低くて悪いので、今は役に立ちませんhash())。
-orlp

4

スリップ123108 + 3 = 111バイト

^6 (`\\`_.?<?.?[ _]?|`_(`\.?(<.?|>)|`/.?.?>.?.?).?)| `_(`\.?<.?>?.?.?|`/(.?>.?.?.?|<`_))| `/\`_.?(.<.?>?.?)?

noフラグで実行します。すなわち

py -3 slip.py regex.txt input.txt no

または、オンライン試してください


スリップは、2Dパターンマッチングの課題の一部として作成された正規表現に似た言語です。スリップはp、次のプログラムを介して位置フラグを使用して欠陥の場所を検出できます。

^6? `_[/\]|( `/|^6 `\)\`_

次のパターンのいずれかを探します(ここでS一致が開始されることを示します)。

S_/    S_\    /_S    \_S    S/      _
                              _      \S

オンラインで試してください —座標は(x、y)ペアとして出力されます。以下を除いて、すべてが通常の正規表現のようになります。

  • ` エスケープに使用され、
  • <> マッチポインターをそれぞれ左/右に回し、
  • ^6 マッチポインターを左向きに設定します。
  • \ マッチポインターを右に直角にスリップします(たとえば、ポインターが右向きの場合、行を下に移動します)

しかし、残念なことに、必要なのは、検出された場所ではなく検出され欠陥を示す 0〜12の単一の数値です。スリップには、1つの数値を出力する1つの方法しかありません。見つかった一致の数を出力するフラグです。n

そのため、o重複する一致モードを使用して、上記の正規表現を展開して、各欠陥の正しい回数に一致させます。分解すると、コンポーネントは次のとおりです。

1 11:    `_`\.?<.?>?.?.?
2 10:    `/\`_.?(.<.?>?.?)?
4 9:     `_`/(.?>.?.?.?|<`_)
3 12:   ^6 `_`/.?.?>.?.?.?
5 7:    ^6 `\\`_.?<?.?[ _]?
6 8:    ^6 `_`\.?(<.?|>).?

はい、それ?は数字を正しくするための過度の使用です:P


ハハ、すごい。言語にさらに多くの種類の出力を追加する必要があります。
BMac

4

JavaScript(ES6)、67 72

指定された12の場所で空白を探すだけです

保存された5バイトを編集、thx @apsillers

F=b=>[..."0h9fnopia8evx"].map((v,i)=>b[parseInt(v,34)]>' '?0:d=i)|d

Firefox / FireBugコンソールでテストする

x='  ___\n /\\_/\\\n/_/ \\_\\\n\\ \\_/ /\n \\/_\\/' // no defects
;[...x].forEach((c,p,a)=>{
  a[p]=' ' // put a blank
  y=a.join('') // rebuild a string
  d=F(y) // check
  if (d) console.log('\n'+y+'\n'+d) // if defect, output
  a[p]=c // remove the blamk
})

出力

  ___
 / _/\
/_/ \_\
\ \_/ /
 \/_\/
9

  ___
 /\ /\
/_/ \_\
\ \_/ /
 \/_\/
2

  ___
 /\_ \
/_/ \_\
\ \_/ /
 \/_\/
8

  ___
 /\_/\
/ / \_\
\ \_/ /
 \/_\/
10

  ___
 /\_/\
/_  \_\
\ \_/ /
 \/_\/
3

  ___
 /\_/\
/_/  _\
\ \_/ /
 \/_\/
1

  ___
 /\_/\
/_/ \ \
\ \_/ /
 \/_\/
7

  ___
 /\_/\
/_/ \_\
\  _/ /
 \/_\/
4

  ___
 /\_/\
/_/ \_\
\ \ / /
 \/_\/
5

  ___
 /\_/\
/_/ \_\
\ \_  /
 \/_\/
6

  ___
 /\_/\
/_/ \_\
\ \_/ /
 \ _\/
11

  ___
 /\_/\
/_/ \_\
\ \_/ /
 \/_ /
12

@apsillersそれは良い、さらに良いです、ありがとう。入力文字列は常に「」で始まるため、先頭の0は最初のループでdをiに初期化するため、「d = 0」は削除できます。
-edc65

2

C、98 84バイト

g(char*b){char*c="/'-5670(&,=?",*a=c;for(;*c&&!(*b=b[*c++-30]-32?0:c-a););return*b;}

更新:文字列についてもう少し賢くなり、欠陥のないルビーの問題を修正しました。

ほどい:

g(char*b){
    char*c="/'-5670(&,=?",*a=c;
    for(;*c&&!(*b=b[*c++-30]-32?0:c-a);)
        ;
    return*b;
}

とても簡単です 100バイトです。

検査用の:

#include "stdio.h"
int main() {
    char b[100];
    scanf("%35c", b);
    printf("%d\n", g(b));
    return 0;
}

STDINへの入力。

使い方

ルビーの各欠陥は、異なるキャラクターにあります。このリストは、入力文字列の各欠陥が発生する場所を示しています。

Defect 1: 17
Defect 2: 9
Defect 3: 15
Defect 4: 23
Defect 5: 24
Defect 6: 25
Defect 7: 18
Defect 8: 10
Defect 9: 8
Defect 10: 14
Defect 11: 31
Defect 12: 33

{17,9,15,23,24,25,18,10,8,14,31,33}コストの配列を大量に作成するため、このリストを作成するより短い方法を見つけます。各数値に30を加算すると、印刷可能なASCII文字として表現できる整数のリストが生成されることに注意してください。このリストは次のとおりです"/'-5670(&,=?"。したがって、文字列(コード内c)をこの文字列に設定し、このリストから取得するすべての値から30を減算するだけで、元の整数配列を取得できます。リストに沿ってどれだけ取得したかを追跡するaために等しいと定義しますc。コードに残っているのはforループだけです。cまだ終了していないことを確認bし、現在の文字がcスペース(ASCII 32)かどうかを確認します。そうである場合、最初の未使用の要素を設定しますb 欠陥番号にそれを返します。


2

Python 2、146 88 86 71バイト

この関数fは、各セグメントの位置をテストし、欠陥セグメントのインデックスを返します。入力文字列の最初のバイトのテストにより、0欠陥が見つからなかった場合に戻ることが保証されます。

セグメントオフセットをコンパクトな文字列にパックし、ord()それらを使用して回復します。

f=lambda s:sum(n*(s[ord('ARJPXYZSKIO`b'[n])-65]<'!')for n in range(13))

完璧なルビーでテストする:

f('  ___\n /\\_/\\\n/_/ \\_\\\n\\ \\_/ /\n \\/_\\/')
0

セグメント2をスペースに置き換えたテスト:

f('  ___\n /\\ /\\\n/_/ \\_\\\n\\ \\_/ /\n \\/_\\/')
2

編集:素晴らしいsum(n*bool for n in...)テクニックを@xnorに感謝します。

EDIT2:ゴルフのヒントを追加してくれた@ Sp3000に感謝します。


2
indicator-sumを使用して文字を保存できると思いますsum(n*(s[...]==' ')for ...)
xnor

1
置き換えられた文字はすべてスペースの後にあることを考えると、おそらくバイトの<'!'代わりに何かをすることができ==' 'ます。を使用してリストを生成することもできmap(ord, ...)ますが、印刷できないものについてどう思うかわかりません:)
Sp3000

1

ピス、35 31 28バイト

hx"*6#,54@"C%imCds.zT67

パッチを適用したPythが必要現在の最新バージョンのPythには、.z末尾の文字が削除されるというバグがあります。

このバージョンはハッシュ関数を使用せず、Pythの基本変換関数を悪用して、非常に愚かだが機能するハッシュを計算します。次に、そのハッシュを文字に変換し、そのインデックスを文字列で検索します。

答えには印刷できない文字が含まれています。このPython3コードを使用して、マシン上でプログラムを正確に生成してください。

garbage = [42, 22, 54, 35, 44, 28, 31, 53, 52, 64, 16, 11]
prg = 'hx"' + "".join(chr(c) for c in garbage) +'"C%imCds.zT67'
open("golf_gen.pyth", "w").write(prg)
print(len(prg))

1

Haskell、73バイト

f l=last[x|x<-[0..12],l!!([0,17,9,15,23,24,25,18,10,8,14,31,33]!!x)==' ']

他の多くのソリューションと同じ戦略:特定の場所でスペースを探します。インデックス0には常にヒットがあるため、ルックアップは最後の要素を取得するインデックスのリストを返します。


0

05AB1E、16 バイト

•W)Ì3ô;4(•₆вèðk>

オンラインそれを試してみたり、すべてのテストケースを検証します

説明:

W3ô;4(•        # Push compressed integer 2272064612422082397
          ₆в      # Converted to Base-36 as list: [17,9,15,23,24,25,18,10,8,14,31,33]
            è     # Index each into the (implicit) input-string
             ðk   # Get the 0-based index of the first space in the indexed characters
                  # (-1 if not found, which means the ruby had no defects)
               >  # And increase it by 1 (which is output implicitly as result)

(セクション鉱山のこの05AB1Eのヒントを参照してください?大きな整数を圧縮する方法どのように圧縮整数リストへ?理由を理解すること•W)Ì3ô;4(•である2272064612422082397•W)Ì3ô;4(•₆вされます[17,9,15,23,24,25,18,10,8,14,31,33]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.