オートグラムプログラム


34

この文は、2つのa、2つのc、2つのd、28のe、5つのf、3つのg、8つのh、11つのi、3つのl、2つのm、13のn、9のo、2つのp、5のr、25を使用しますs、23個のt、6個のv、10個のw、2個のx、5個のy、1個のz。

そのような文はオートグラムと呼ばれます。タスクは、同様のプロパティを持つプログラムまたは関数を作成することです。入力としてバイトを受け取り、そのバイトがプログラムのソースコードに現れる回数を表す整数を出力します。入力がソースに表示されない場合、0を出力する必要があります。

プログラムは、直接または間接的に独自のソースコードを読み取ってはなりませんが、その代わりに、出力を提供するために必要なすべてのデータはハードコードされたクインスタイルでなければなりません。プログラムの長さは少なくとも1バイトでなければなりません。

これはであるため、最短のエントリ(バイト単位)が優先されます。回答は受け付けませんので、お好きな言語で最短のソリューションを競ってください。

投稿に説明を含めることを強くお勧めします。

リーダーボード

以下は、総合スコアと言語ごとのリーダーボードです。


5
サンドボックス。(それは2014年以来そこにある!)
ナサニエル

機能は許可されていますか、それとも完全なプログラムのみですか?
ウリエル

1
注:これに類似した回答は、もはや有効とはみなされません。
user202729

1
FWIW、適切な馬の定義は、私がこの挑戦のために本当に望むより少し強いです。たとえば、連続する範囲内のすべての文字を使用し、入力がその範囲内にある場合に「1を出力するプログラム」を見ると非常にうれしいです。プログラムの別の部分」。そのため、私は網膜の例を許可したいと思っていましたが、すでに1バイトしかないため、他の人が投稿を延期した場合は失望するでしょう。(@ user202729)
ナサニエル

1
上記のコメントのため、クインルールが適用されるという記述を削除しました。(ソースコードを読み取らないことについての部分を保持しました。)
ナサニエル

回答:


15

オクターブ、44バイト

@(x)sum([[39,'(())*,239==@[[]]msuxx']]==x)*2

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

関数内の各文字を入力として使用する場合の関数の結果:

'  (  )  *  ,  2  3  9  =  @  [  ]  m  s  u  x  
2  4  4  2  2  2  2  2  4  2  4  4  2  2  2  4  

他のすべての入力文字はゼロを返します。

私が逃げなければならなかったという事実は、'これをずっと長くしました。4つの括弧を説明するために、文字列に重複がありました。ただし、アポストロフィの複製にはアポストロフィが必要なため、これは正しい結果からさらに遠ざかります。したがって、アポストロフィの数をそのASCII値でカウントする必要がありました39。もちろん、これは私もキャラクターをチェックしなければならなかったことを意味しました、3そして9それをすべてずっと長くしました。


2
これは私がもっと見たいと思っているようなものです。(標準のクインを取り、コードを追加して文字をカウントするのではなく、問題を最適化します。)
ナサニエル

7

Excel、84バイト

=IFERROR(MID("65496331125442343343233",FIND(A1,"""123456789,()=MINORFADEOMEN"),1),0)

Find()A1文字列内のセル内の値を検索します"123456789,()=MINORFADEOMEN"""最初は文字をエスケープするためのもので、評価は単に")になります。

結果に基づいてFind()Mid()関数は、数値の文字列から対応する文字を返します。この文字列は、変更が停止するまで反復により作成されました。

の文字A1が見つからない場合Find()は、エラーを返し、IfError()関数はそれをエスケープして0代わりに返します。

OMENビーイングがで検索文字列の最後のFind()機能は、自分の位置が返されることはありませんが、それらは、文字カウントを調整するために必要であったので、重複した文字です。それらがなければ、カウントを変更する無限ループがありました。文字の配置は文体的な選択です。


5

JavaScript(ES6)、70バイト

関数のソースを読み取りませんが、これは非常に長いです。入力を1文字の文字列として受け取ります。

i=>~(n='\\34=\'in(|)0257?:.>[]Odefx~'.indexOf(i))?'3733544333'[n]||2:0

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


あなたは明確な文字の量を下げるためにビットを再加工することによって、このに束を短縮することができますi=>'36335633'[i='\\36=\'i|&()25.>[]Odefx~n'.indexOf(i)]||~i&&2(8つのバイトを保存)
Yairランド

5

網膜、1バイト

厳密にクインのルールに従う場合、これは有効ではありませんが、OPは明示的にコメントで許可します。

x

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

Retinaでは、単一行プログラムが入力内のその正規表現の出現をカウントします。このチャレンジは除く任意の1文字のASCII文字によって解決され`.+*?[()^$\および改行。


5

C#(Visual C#コンパイラ)88 57バイト

x=>"\\\"(())==>>??..::3300CCaaiinoossttx".Contains(x)?3:0

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

戻り値3文字列が渡された文字が含まれている場合は、それ以外の場合は0文字列は、コードの少なくともそれぞれの文字に一度とCHARを持つために必要な正確量含ま返す3コードで回。

-31バイト、Kevin Cruijssenのおかげ


素敵なアプローチ!私から+1。周りの括弧を削除し(a)=>、入力をcharではなく文字列として取得することで、バイトを節約できます。これ.ToString()はもう必要ありません(また、必要ないa+""コードゴルフのチャレンジにも使用できます.ToString())。また、.Contains既にが含まれているaので、入力変数を別の未使用文字(xまたはなどq)にして、各文字に4ではなく3を使用することもできます。編集:最後の部分を気にしないでください"
ケビンクルーッセン

@KevinCruijssenアドバイスをありがとう。しかし、文字列は入力として有効ですか?OPが入力としてバイトを要求したと考えていますか?
ハイアルス

それが単一の文字列である限り、私はそれがかなり確信しています。とにかく、ほとんどの言語は文字列値しか入力できず、文字がまだ文字列として入力することを選択している言語もあります(Java、JavaScript、Japtなど)。通常、入力形式と出力形式は非常に柔軟です。まだ疑っている場合はコメントしてください。:)
ケビンCruijssen

1
@KevinCruijssenは理にかなっています。そして、1つをエスケープする場合、1文字につき希望の3に
達する

2
入力としての単一の文字列は私には問題ありません。
ナサニエル

4

Haskell、66バイト

最初の2つのバージョンは、基本的に、必要な文字をフィルタリングしてから長さを取得するクインです。

q c=length.filter(==c)$id<>show$"q c=length.filter(==c)$id<>show$"

オンラインで試す、すべてのキャラクターでテストしてください*


代替なし(<>)、72バイト

q c=length.filter(==c)$(++)<*>show$"q c=length.filter(==c)$(++)<*>show$"

オンラインで試す、すべてのキャラクターでテストしてください


クイン以外の代替、87 86バイト

まだ改善される可能性がありますが、3つの異なるグループのみにまとめられてうれしいです。

ほとんどのバイトをカウントしますが、私はこれが一番好きです。2,37の合計として文字/バイトカウントを計算します(いくつかの文字が複数のグループにあることに注意してください)。

u t=sum[fst e|e<-[(2," ()-237<=dflnst|"),(3," ()[\\]`mstu"),(7,"\",ee")],t`elem`snd e]

オンラインで試す、すべてのキャラクターでテストしてください


* (<>)TIOのGHCバージョンが8.0.2であるためインポート


3

パイソン254の 52 32バイト

ovsのおかげで-20バイト

("''+.23cnotu()"*2+'"*'*3).count

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


1
ラムダも入力もないのはなぜですか?
スチューウィーグリフィン

2
@StewieGriffin Pythonは、メソッド参照を自動的にバインドするため、"xxx".countと同等lambda c:"xxx".count(c)です。
ニール

@StewieGriffinとあなたは同じように両方を使用- > f="xxx".countf=lambda c:"xxx".count(c)呼ばれるf('a')
ロッド

3

11 10 8バイト

-2バイトありがとう、レオ

#sD"#sD"

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

説明

これにより、ASCIIのみが使用され(show混乱するため)、各文字が2回含まれます。

#sD"#sD"  -- character as input, eg. '"'
   "#sD"  -- string literal (note the redundant '"'): "#sD"
  D       -- double: "#sD#sD"
 s        -- show: "\"#sD#sD\""
#         -- number of occurences: 2

標準のクイン拡張、11バイト

#hS+s"#hS+s

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

説明

#hS+s"#hS+s  -- character as input, eg. '"'
     "#hS+s  -- string literal: "#hS+s"
  S+         -- join with itself: ("#hS+s"++)
    s        -- | and itself shown: "\"#hS+s\""
             -- : "#hS+s\"#hS+s\""
 h           -- init: "#hS+s\"#hS+s"
#            -- number of occurences in string: 1

1
文字列を表示する前に2重にすることで、引用符をより簡単に管理できます。オンラインで試してみてください。
レオ

3

Java 10、164 81 57バイト

q->"q-->>\\\"..ccoonttaaiiss(())??33::00".contains(q)?3:0

@HyarusのC#回答のポートです。必ず彼に投票してください!

説明:

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

q->      // Method with String parameter and integer return-type
  "q->\\\"..ccoonttaaiiss(())??33::00".contains(q)?
         //  If the string above contains the input character
   3     //   Return 3
  :      //  Else:
   0     //   Return 0

164バイトの答え:

c->{var s="c->{var s=%c%s%1$c;return s.format(s,34,s).replaceAll(%1$c[^%1$c+c+']',%1$c%1$c).length();}";return s.format(s,34,s).replaceAll("[^"+c+']',"").length();}

説明:

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

c->{                                  // Method with char parameter and integer return-type
  var s="c->{var s=%c%s%1$c;return s.format(s,34,s).replaceAll(%1$c[^%1$c+c+']',%1$c%1$c).length();}";
                                      //  Unformatted source code
  return s.format(s,34,s)             //  Create the formatted source code (the quine),
          .replaceAll("[^"+c+']',"")  //  remove all characters not equal to the input,
          .length();}                 //  and return the length

-part:

  • 文字列にsは、フォーマットされていないソースコードが含まれています。
  • %sを使用して、このStringをそれ自体に入力するために使用されますs.format(...)
  • %c%1$cおよびは34、二重引用符のフォーマットに使用されます。
  • s.format(s,34,s) すべてをまとめる

チャレンジパート:

  • .replaceAll("[^"+c+']',"") 入力に等しい文字を除くすべての文字を削除します。
  • .length() 次に、この文字列の長さを取得します。

注:.split(c).length(とString入力の代わりにchar)短いようですが、2つの問題がある可能性があります。

  1. 最初の文字の結果は間違っているため、cc->先頭部分として)入力すると、1文字が誤って返されます。これは+(c==99?1:0)、ソースコードとフォーマットされていないソースコード文字列の両方を追加することで修正できます(そしてに変更.split(c)します.split(c+"")が、まだ次の問題があります:
  2. 正規表現文字(つまり$)が入力された場合、.splitそれは正規表現として解釈され、誤った結果が生じます。

3

Haskell、58バイト

f c=sum[2|x<-succ '!':"f c=sum[2|x<-succ '!':,x==c]",x==c]

オンラインでお試しください!またはソリューションを確認します

同じバイト数の選択肢:

f c=sum[2|x<-tail$show"f c=sum[2|x<-tail$show,x==c]",x==c]
f c=sum[1|x<-id<>show$"f c=sum[1|x<-id<>show$,x==c]",x==c]

Haskell、90バイト

sum.($zip"1234\"$,.[\\]opu+()iklmsz652"$[4,4,11,3,3,3,16,5,3,3,3,3,3,3,3]++[2,2..]).lookup

オンラインでお試しください!またはソリューションを確認します。事実を使用sum Nothing = 0し、例えばsum (Just 4) = 4


3

Smalltalk、112 132バイト

Smalltalkはゴルフの適性で正確に知られていません:-)

クラスCharacterで定義されているメソッド(VA SmalltalkおよびSqueakでテスト済み、VisualWorksやPharoなどの他の方言でも動作するはずです):

a^(0to:6),#(10 18)at:(#('' ',[]^|+68cForu' '#0adefln' '1it' '()' ':s' ' ' '''')findFirst:[:s|s includes:self])+1

ソースで発生する文字は、発生回数によってグループ化されます。グループは、レシーバーを含む最初のグループでテストされ、一致するオカレンスカウントが返されます。

古い方法:

a^('''''((((())))):::[[[[]]]]^^^^^0000066666aaaacccccdddddeefffFFFFFiiilllnnnnnrrrrrsssTTTTTuuuu'includes:self)ifTrue:[6]ifFalse:[0]

メソッドに出現するすべての文字は(ストリング定数で繰り返されることにより)正確に6回出現するため、メソッドはレシーバーがストリングに含まれているかどうかをチェックし、含まれている場合は6を返し、そうでない場合は0を返します。

上記のようにメソッドを定義した後、次を使用して検証できます。

| code |
code := Character sourceCodeAt: #a.
((0 to: 255) collect: [:b | b asCharacter]) reject: [:c | c a = (code occurrencesOf: c)]

結果は空になります。


1
PPCGへようこそ!
マーティンエンダー

2

JavaScript、31バイト

f=c=>~-`f=${f}`.split(c).length

オンラインで試す


1
これは独自のソースコードを読み取ると思いますか?それは質問で太字で明示的に禁止されています。
ナサニエル

1
@ナサニエル、こちらをご覧ください
シャギー

2
うーん 正直なところ、私はそれは愚かだと思いますが、メタコンセンサスに私が思うに本当に反対することはできません。
ナサニエル

1
@Nathaniel evalを簡単にするすべてのプログラムでは、クインも簡単になります。
user202729

1
@ user202729続くとは思いませんか?たとえば、Pythonで同じトリックを行うことはできません。これは逆評価であり、評価ではありません
ナサニエル



2

Haskell、96バイト

n"n"=15;n"="=14;n" "=2;n";"=13;n"\\"=3;n"\""=25;n"0"=2;n"1"=4;n"2"=4;n"3"=4;n"4"=5;n"5"=5;n n3=0

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

Haskell、109バイト

n 'n'=15;n '='=14;n ' '=14;n ';'=13;n '\\'=3;n '\''=25;n '0'=2;n '1'=5;n '2'=4;n '3'=4;n '4'=5;n '5'=5;n n3=0

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

Haskell、122バイト

n 'n'=21
n '='=14
n ' '=14
n '\n'=12
n '\\'=4
n '\''=32
n '0'=2
n '1'=5
n '2'=5
n '3'=3
n '4'=5
n '5'=5
n nnnnnn4'''''''=0

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

説明

これらの答えはそれほど洗練されていません。これは一連の宣言であり、プログラムに存在する各文字ごとに1つです。最後に、プログラムに存在しない文字に対して0を返すcatch allがあります。

プログラムで必要な文字数を最小限に抑えるためにいくつかのトリックを使用し、そこから数字が正しくなるまでいろいろと調整しました。最後の宣言で変数名を3つすべて埋め込んだことがわかります。3つのプログラムの違いは、;改行を使用するか改行に使用するか、Charsを入力として使用するかStringsとして使用するかを選択することです。この;方法は、運が良かっただけで他の方法よりも本質的に優れているようには見えませんが、文字列ではなく関数名の後にスペースが必要なので、文字列を使用する方が文字よりも優れたアイデアのようです。


:| 説明でスペルに何が起こったのか
ASCIIのみ

2

空白、140バイト

[S S S N
_Push_0][S N
S _Duplicate][S N
S _Duplicate][T N
T   S _Read_STDIN_as_character][T   T   T   _Retrieve][S S S T  S S T   N
_Push_9][T  S S T   _Subtract][S N
S _Duplicate][N
T   S S T   N
_If_0_Jump_to_Label_TAB][S S S T    N
_Push_1][T  S S T   _Subtract][S N
S _Duplicate][N
T   S S N
_If_0_Jump_to_Label_NEWLINE][S S S T    S T T   S N
_Push_22][T S S T   _Subtract][N
T   S T N
_If_0_Jump_to_Label_SPACE][N
S T N
_Jump_to_Label_PRINT][N
S S S T N
_Create_Label_TAB][S S S T  S S T   S T N
_Push_37][N
S T N
_Jump_to_Label_PRINT][N
S S S N
_Create_Label_NEWLINE][S S S T  S S S S T   N
_Push_33][N
S T N
_Jump_to_Label_PRINT][N
S S T   N
_Create_Label_SPACE][S S S T    S S S T T   S N
_Push_70][N
S S N
_Create_Label_PRINT][T  N
S T _Print_as_integer]

強調表示としてのみ追加される文字S(スペース)、T(タブ)、およびN(改行)。
[..._some_action]説明としてのみ追加。

70個のスペース、37個のタブ、33個の改行が使用されています。

通常、ラベルの作成NSSNNSSSNNSSTNNSSSSNNSSSTNNSSTSNNSSTTN、などしかし、バイナリが多数印刷するためにS=0/ T=1使用されていることは、私は出力に必要な数に影響を与え、私はラベルを使用しNSSNNSSSNNSSTN、とNSSSTN代わりに、与えました2進数SSSTSSSSTN(33;改行の量)、SSSTSSTSTN(37;タブの量)、およびSSSTSSSTTSN(70;スペースの量)で印刷される完全な量のスペース/タブ。

擬似コードの説明:

Character c = STDIN-input as character
If c is a tab:
  Print 37
Else if c is a new-line:
  Print 33
Else if c is a space:
  Print 70
Else
  Print 0

実行例:

入力:スペース

Command       Explanation                   Stack       Heap     STDIN   STDOUT   STDERR

SSSN          Push 0                        [0]
SNS           Duplicate top (0)             [0,0]
SNS           Duplicate top (0)             [0,0,0]
TNTS          Read STDIN as character       [0,0]       {0:32}   \n
TTT           Retrieve                      [0,32]      {0:32}
SSSTSSTN      Push 9                        [0,32,9]    {0:32}
TSST          Subtract top two (32-9)       [0,23]      {0:32}
SNS           Duplicate top (23)            [0,23,23]   {0:32}
NTSSTN        If 0: Jump to Label_TAB       [0,23]      {0:32}
SSSTN         Push 1                        [0,23,1]    {0:32}
TSST          Subtract top two (23-1)       [0,22]      {0:32}
SNS           Duplicate top (22)            [0,22,22]   {0:32}
NTSSN         If 0: Jump to Label_NEWLINE   [0,22]      {0:32}
SSSTSTTSN     Push 22                       [0,22,22]   {0:32}
TSST          Subtract top two (22-22)      [0,0]       {0:32}
NTSTN         If 0: Jump to Label_SPACE     [0]         {0:32}
NSSTN         Create Label_SPACE            [0]         {0:32}
SSSTSSSTTSN   Push 70                       [0,70]      {0:32}
NSTN          Jump to Label_PRINT           [0,70]      {0:32}
NSSN          Create Label_PRINT            [0,70]      {0:32}
TNST          Print as integer              [0]         {0:32}            70
                                                                                  error

プログラムがエラーで停止します:出口が定義されていません。
オンラインで試してください(未加工のスペース、タブ、改行のみ)。

入力:タブ

STDINは \t9代わりに()にこの場合0、最初のIf 0チェックでLABEL_TAB/に移動しNSSSTN37代わりにプッシュして印刷します。

オンラインで試してください(未加工のスペース、タブ、改行のみ)。

入力:改行

STDINは代わりに\n10)になり、その場合は0、2番目のIf 0チェックでLabel_NEWLINE/ NSSSNに進み、33代わりにプッシュして印刷します。

オンラインで試してください(未加工のスペース、タブ、改行のみ)。

入力:その他

その他の入力文字はすべて NSTN3番目のIf 0チェックの後、(Label_PRINTにジャンプ)0れ、スタックに残っているものを印刷します(最初に複製しました)。

オンラインで試してください(未加工のスペース、タブ、改行のみ)。


1
これはこの課題に最適な言語です。
qwr

2

Japt、27バイト

\Ua"" a a a " ÄU\\\"a "aU Ä
            " ÄU\\\"a "     // Given this string literal,
                       aU   // find the last index of the input
                          Ä // and add +1.
\Ua"" a a a                 // Do nothing useful, but make the results match.

既存のJaptの回答よりも長いが、異なるアプローチを使用します。
すべての文字が固有の回数発生する必要があるという固有の制限があります。

入力を文字列として受け取ります。

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


2

Perl、130バイト

+print+0+((0)x40,6,6,0,3,43,0,0,0,22,12,6,3,5,2,4,0,1,0,0,0,1,0,1,(0)x28,1,0,1,(0)x6,1,(0)x4,1,(0)x4,1,1,1,0,2,0,1,0,0,0,5)[ord<>]

改行やその他の空白はありません。標準出力から行を読み取りますが、最初のバイトのみを考慮し、そのバイトが独自のソースコードで発生した回数を、改行なしで10進数で出力します。

プログラムは簡単です。ほとんどのソースコードは、可能な各バイトの答えを提供するリテラルテーブルで占められています。末尾のゼロは省略され、隣接するゼロは実行時に圧縮されますが、それ以外の特別なトリックはありません。プログラムの残りの部分は、単に入力を読み取り、テーブルで回答を検索します。

たとえば22, 12, 6, 3, 5, 2, 4, 0, 1, 0、ソースコードの一部は数字の頻度を示しているため、ソースコードには22個のゼロ、12個の1、6個の2などがあります。その結果、0プログラムの標準入力を入力すると、プログラムが印刷されます22


2

C(gcc)、1033バイト

#include <stdio.h>
int main(int argc,char *argv[]){int r=0*14811;switch((int)argv[1][0]){case' ':r=6;break;case'"':r=3;break;case'#':r=2;break;case'%':r=2;break;case'\'':r=101;break;case'(':r=5;break;case')':r=5;break;case'*':r=5*1*1;break;case'.':r=2;break;case':':r=51;break;case';':r=103;break;case'<':r=2;break;case'=':r=52;break;case'>':r=2;break;case'[':r=4;break;case'\\':r=3;break;case']':r=4;break;case'0':r=11;break;case'1':r=20;break;case'2':r=20;break;case'3':r=9;break;case'4':r=7;break;case'5':r=12;break;case'6':r=3;break;case'7':r=2;break;case'8':r=5;break;case'9':r=2;break;case'a':r=106;break;case'b':r=51;break;case'c':r=55;break;case'd':r=4;break;case'e':r=102;break;case'f':r=2;break;case'g':r=4;break;case'h':r=4;break;case'i':r=10;break;case'k':r=51;break;case'l':r=2;break;case'm':r=2;break;case'n':r=8;break;case'o':r=2;break;case'p':r=2;break;case'r':r=108;break;case's':r=53;break;case't':r=8;break;case'u':r=2;break;case'v':r=3;break;case'w':r=2;break;case'{':r=3;break;case'}':r=3;break;}printf("%d",r);}

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

これはゴルフの答えという意味ではありませんが、私がよく知らない言語でこの課題を達成しようとするのは楽しかったです。数字の出現を見つける時が来るまで、それは特に難しい課題ではありませんでしたが、今ではそれが課題でした。少し創造的なバランスをとる必要がありました:)


2

C(gcc)、192バイト

F(J){J=J-70?J-40?J-41?J-74?J-'{'?J-'}'?J-39?J-48?J-49?J-50?J-51?J-52?J-53?J-54?J-55?J-56?J-57?J-47?J-61?J-63?J-45?J-58?J-59?0:1:23:23:23:1:2:3:3:4:4:14:14:10:10:15:6:4:2:2:25:1:1:1;}//84332211

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

さらにゴルフダウンする可能性があります。最後のコメントを「スクラッチスペース」として使用して、数字を追加します。桁をXからYに変更する必要がある場合、スクラッチのYの1つをXに変更して補正します。それ以外は、整数を受け取る単なる関数であり、代入のトリックを使用して、大きな3項条件に基づいて値を返します。


0*84332211他のCの回答のように数値定数をゼロの後に移動することで1バイトを節約できますが、それを小さくリファクタリングすることでバイトを節約することもできるので、まだ気にしません。
LambdaBeta

あまり一般的でない数値の範囲チェックを使用してバイトを節約できますか?つまり、4〜9の文字がまれな文字である場合、条件チェックを使用してそれらを一度に処理できます。
qwr

ほぼ間違いなく。特定のシンボルが表示されないように、またはビットパターンを使用できるように(たとえばJ&1?、すべての奇数文字に一致するように)物の賢い名前を選択することで、さらに多くを削除できます。時間があれば、さらにゴルフをするかもしれません。
LambdaBeta

2

x86 .COM、17バイト、論争の的

0120 BF2001        MOV     DI,0120 (120 be the current address)
0123 B91100        MOV     CX,0011
0126 AE            SCASB
0127 7502          JNZ     012B
0129 FEC4          INC     AH
012B E2F9          LOOP    0126
012D C1E808        SHR     AX,8
0130 C3            RET

36バイト

0100 BF????        MOV     DI,(an copy of this code)
0103 B91200        MOV     CX,0012
0106 AE            SCASB
0107 7503          JNZ     010C
0109 80C402        ADD     AH,02
010C E2F8          LOOP    0106
010E C1E808        SHR     AX,8
0111 C3            RET

2
これは独自のコードではありませんか?
ラズバンソコル

@RazvanSocol JavaScriptソリューションのようなものだと思う
-l4m2

@RazvanSocolはファイルに保存する必要がないので大丈夫です。fungeoidsとJSの多くもこれを行う
ASCIIのみ

私はあなたが実行されたコードを読んでいると主張します。それは「自分のソースコードを読む」と数えます。ここで、ほとんどのソリューションがそうであるように、プログラムの文字列コピーを持っていると主張することもできますが、「ソースコードの読み取り」ですが、文字列は実行されません。
-qwr




1

x86の、42の、40バイト

ここでは、他と同じ戦略を使用します。一意のバイトを持つプログラムの文字列コピーを作成しal、入力alが文字列内にある場合は2を返します。実際に実行されるコードを読み取れるようにすると、l4m2のソリューションが得られます

私はクールなストリングインストラクションを利用するようになりましたscasb。私の知る限り、重複するバイトはありませんが、これは簡単に失敗するものです。文字列アドレスの読み込みには5バイトかかりますが、これより短い解決策は知りません(64ビットlearipオフセットは6バイトかかります)。

-2 02回使用することを避けるために後方にジャンプする。

.section .text
.globl main
main:
        mov     $0xff, %eax

start:
        push    $20             # program length
        pop     %ecx            # counter
        mov     $str, %edi      # load string

loop:
        scasb                   # if (al == *(edi++))  
        jne     loop1           
        mov     $2, %al         # ret 2
end:    ret             
loop1:
        loop    loop            # do while (--counter)
        xor     %eax, %eax      # ret 0
        jmp     end

str:    .byte 0x6a,0x14,0x59,0xbf,0xf4,0x83,0x04,0x08 
        .byte 0xae,0x75,0x03,0xb0,0x02,0xc3,0xe2,0xf8
        .byte 0x31,0xc0,0xeb,0xf9 

Hexdump(バイナリファイル形式elf32-i386、objファイルには残念ながらアドレスの00バイトがあるためstr):

000003e0  6a 14 59 bf f4 83 04 08  ae 75 03 b0 02 c3 e2 f8  |j.Y......u......|
000003f0  31 c0 eb f9 6a 14 59 bf  f4 83 04 08 ae 75 03 b0  |1...j.Y......u..|
00000400  02 c3 e2 f8 31 c0 eb f9                           |....1...|

x86、256バイト

巨大なコメントに相当する退屈な答え。入力するとcl、すぐに1を返しますal。暇なときに実際に答えます。

00000039  b0 01 c3 00 02 03 04 05  06 07 08 09 0a 0b 0c 0d  |................|
00000049  0e 0f 10 11 12 13 14 15  16 17 18 19 1a 1b 1c 1d  |................|
00000059  1e 1f 20 21 22 23 24 25  26 27 28 29 2a 2b 2c 2d  |.. !"#$%&'()*+,-|
00000069  2e 2f 30 31 32 33 34 35  36 37 38 39 3a 3b 3c 3d  |./0123456789:;<=|
00000079  3e 3f 40 41 42 43 44 45  46 47 48 49 4a 4b 4c 4d  |>?@ABCDEFGHIJKLM|
00000089  4e 4f 50 51 52 53 54 55  56 57 58 59 5a 5b 5c 5d  |NOPQRSTUVWXYZ[\]|
00000099  5e 5f 60 61 62 63 64 65  66 67 68 69 6a 6b 6c 6d  |^_`abcdefghijklm|
000000a9  6e 6f 70 71 72 73 74 75  76 77 78 79 7a 7b 7c 7d  |nopqrstuvwxyz{|}|
000000b9  7e 7f 80 81 82 83 84 85  86 87 88 89 8a 8b 8c 8d  |~...............|
000000c9  8e 8f 90 91 92 93 94 95  96 97 98 99 9a 9b 9c 9d  |................|
000000d9  9e 9f a0 a1 a2 a3 a4 a5  a6 a7 a8 a9 aa ab ac ad  |................|
000000e9  ae af b1 b2 b3 b4 b5 b6  b7 b8 b9 ba bb bc bd be  |................|
000000f9  bf c0 c1 c2 c4 c5 c6 c7  c8 c9 ca cb cc cd ce cf  |................|
00000109  d0 d1 d2 d3 d4 d5 d6 d7  d8 d9 da db dc dd de df  |................|
00000119  e0 e1 e2 e3 e4 e5 e6 e7  e8 e9 ea eb ec ed ee ef  |................|
00000129  f0 f1 f2 f3 f4 f5 f6 f7  f8 f9 fa fb fc fd fe ff  |................|

1

APL(Dyalog Classic)、30バイト

⊢⊢⊢11-11-11-'''''''1''⊢-⍳⍳0'⍳⊢

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

説明

APLでは、文字列内の単一引用符'''''''1''⊢-⍳⍳0'は二重化によってエスケープされます。文字列にも'''1'⊢-⍳⍳0、プログラムで使用されるすべての文字が含まれます。

APL配列はデフォルトで1インデックスが付けられ、興味深いことに、1 + max index要素が見つからない場合はindex-of関数が返されます。

そのため、文字列でindex-ofを使用すると、入力が返されます

Input    Index    Count
'        1        10
1        4        7
⊢        6        5
-        7        4
⍳        8        3
0        10       1
<other>  11       0

ご覧のとおり11 - index、プログラム内のキャラクターの数を示します。したがって、基本的なアルゴリズムは

11-'''''''1''⊢-⍳⍳0'⍳⊢

残りは、キャラクターの数がスロットにうまく収まるようにキャラクター数を膨らませています。


1

R、135バイト

このPythonの回答に触発されました。

以前のバージョンは壊れていました。@Giuseppeがpaste18バイトかそこらを節約する必要がないことを指摘してくれたことに感謝します。この答えlengths(regmatches(z,gregexpr(x,z)))からです。

function(x,z=rep(c("afilo2679=:","hmpu15'","nstxz","cgr","e","()",'"',","),c(2:5,7,9,15,16)))sum(lengths(regmatches(z,gregexpr(x,z))))

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



0

ルビー、48バイト

->x{%q[->x{%q[].count(x.chr)*2}].count(x.chr)*2}

%q[str]"str"エスケープせずに文字列リテラルをネストできるため、文字列リテラルを記述するよりも便利な方法です。そのため、コピーを除くコード全体をその中に入れてから、カウントを2倍にします。


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