入力文字ごとにプログラムの最初の位置を出力します


43

チャレンジ

p空でない入力文字列が与えられると、空でないプログラム/関数を記述します。これは、のソースコードでの各文字の最初の出現s位置を出力します。sp

たとえば、プログラムが

main() { cout << magic << cin }
^0   ^5   ^10  ^15  ^20  ^25

そして、それは入力を受け取りabcd{、出力は

[1, x, 9, x, 7] (0-based)        [2, x, 10, x, 8] (1-based)

ここでは、x文字位置のための有効な出力ではありません任意の出力を表し(例えば、負の数、0あなたは1ベースのインデックスを使用している場合は、NaNInf、文字列potato、あなたのプログラムの長さよりも数の大きい、など)。

制限事項

ソースコードの読み取りは許可されていません(適切なクインのように)。コメントの使用は許可されますが、スコアにカウントされます。

入力と出力は、合理的な形式で行うことができますが、でなければならない明確な(唯一の追加区切り文字、無randストリームと答えがそこにどこかにあると主張)、一貫性のある(例えば、x上からは常にあるべき同じ値)と人間読めます。たとえば、文字列または文字配列。入力は、印刷可能なASCII文字の文字列(または配列)であると想定できます。Unicodeセット全体を処理する必要はありません。


コード内のカスタムコードページまたは印刷不可能なASCII

言語でカスタムコードページ(Jelly、APLなど)を使用している場合は、それを考慮する必要があります(したがって、プログラム€æÆは入力の[1, x, 2]ために出力する必要があります€%æ)。-1(入力がASCIIのみであるため)常に非ASCII文字のみを使用して出力することは、有効な解決策ではありません。プログラムがネイティブにカスタムコードページを受け入れると仮定できます。つまり、プログラムに文字Aを整数に変換する方法65(ASCIIエンコーディング)がある場合、コードページの65番目の文字をに変換すると仮定できます65


次の課題に触発されました:ポジショナルアウェアネス


大文字は重要ですか?
Kritixi Lithos


@KritixiLithos確かにそうです。
Sanchises 16

プログラムがインデックス0から9のみを使用する場合、セパレータが必要01030708070ですか、出力できますか?
デニス

@デニスいいえ、そうではありません。明確で、一貫性があり、人間が読める形式です。セパレータを必要とすることは、チャレンジに興味深いものを追加しないので、どうしてもバイト数の少なさを乱用します。;)
Sanchises 16

回答:


24

Python2、55バイト

a=" )dfi(+m,nprut.';";print map(('a="'+a).find,input())

コードで使用されるすべての文字を含む文字列で始まり、インデックスを検索します


5
これが退屈な答えであるかはわかりません。標準のクインを使用することは、これほど面白くないと思います。:)
マーティンエンダー

これはPython 2なので、これはほとんどの入力で中断しませんか?壊れている場合は、を使用する必要がありますraw_input
TidB 16

@TidBうーん、いいえ?どのような入力を念頭に置いていますか?
ロッド

@Rod Nevermind、私はちょっと愚かだった。イテレート可能オブジェクトを入力すると、常に機能します。愚かな私。
TidB 16

12

言語、56,623バイト

以下は、最初の256バイトの16進ダンプです。残りのバイトは任意に選択できます。

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

Brainfuckなどの慣例に従って、出力はバイト単位です。

使い方

これは、具体的には単純なcatプログラム,[.,]です。

ソースコードにはすべての256バイトの値が順番に含まれているため、各バイトのインデックスはその値と一致します。


4
うーん、私はLenguageは...人々は3桁outgolfedされている唯一の言語だと思う
Sanchises

2
また、Lenguageは、他の言語ではリモートでさえ競争することのないチートの方法を常に見つけている唯一の言語です。:P
デニス

+[,.]はるかに良いスコアを作成しませんか?
Sanchises

@Sanchisesこれは約12,000バイトを節約しますが、最後に余分なnullバイトも出力します。
デニス

2
まあ、私はNULLバイトが想定され ...(これの関数は、文字列を終了することであっても)入力に、そしてあなたのプログラムで0番目の位置になります。)
Sanchises

10

言語、1.22e7バイト

12263215 NULバイトで構成されます(Hex 0x00)

NULソースに表示されないすべての文字に対してを出力します。

策略は、入力にaが含まれることがないNULためNUL、入力に文字があるs の量を常に出力します。

これは、次のBrainfuckプログラムに変換されます

,[[-].,]

そして内訳で...

,[[-].,]
,[    ,]    #Basic Input loop.
  [-]       #Zero out the cell.
     .      #Print it (A NUL).

これは、ゴルフ言語としてのLenguageの純粋な力を示しています。怖い


2
そのような賢い策略、あなたはほとんど勝ちました...あなたも逆を試みましたか、すなわち、0x00バイトと1インデックス付け?
Sanchises

大好きだったでしょうが、Brainfuck / Lenguage(または、少なくとも私が使用しているインタープリター)はEOFと0x00を区別できないため、実際にチャレンジに答えることはできません。
アタコ16

Brainfuckら。通常つまり、あなたが0のため、1のためのNULをSOHを印刷したい、バイトとして整数を印刷するには許可されている
デニス・

@Sanchisesそれがここにあることを確認できますか?
デニス

1
,[>.,]短くなりませんか?
ジョーキング

8

ゼリー10 9バイト

“ṾiЀƓv”v

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

使い方

“ṾiЀƓv”v  Main link. No arguments.

“ṾiЀƓv”   Set the left argument and the return value to s := 'ṾiЀƓv'.
        v  Execute the string s as a monadic Jelly program with argument s.

 Ṿ         Uneval; yield a string representation of s, i.e., r := '“ṾiЀƓv”'.
     Ɠ     Read one line from STDIN and evaluate it like Python would.
  iЀ      Find the index of each character in the input in r.
      v    Eval the list of indices as a monadic Jelly program with argument s.
           Why?
             This is the shortest way to add the character 'v' to the string s,
             meaning that we can use r without having to append anything.
           What?
             The v atom vectorizes at depth 1 for its left argument, meaning that
             it acts on arrays of numbers and/or characters. When fed an array of
             integers, it first converts them to strings, then concatenates the
             strings and evaluates them as a Jelly program. For example, the array
             [1, 2, 3] gets cast to the string '123', then evaluates, yielding 123.
             Something slightly different happens if the array starts with a 0. For
             example, the array [0, 1, 2] gets cast to '012' just as before, but
             Jelly views '0' and '12' as two separate tokens; numeric literals
             cannot start with a 0. Since the Jelly program is monadic, the first
             token – '0' – sets the return value to 0. Since the second token –
             '12' – is also a niladic link, the previous return value is printed
             before changing the return value to 12. Then, the program finishes
             and the last return value is printed implicitly.

8

pbrain、402の 356 340 338 329バイト

[(:<>)+,-.](>>>>>>)+([-]<<[->+>+<<]>>[-<<+>>]>>[-<+<+>>]<[->+<]<[-<->]<)+([-]+++++++[>+++++++++++++<-]>)+([-]+++++[>++++++++<-]>)+(-:<+++[->++++++<]>)+(-:++)+(-:++)+(----:+)+(-:++)+(-:+)+(-:+)+(-:+)+([-]++:++)+([>[->+>+<<]>>[-<<+>>]<:>>+:[[-]>+<]>-[<<<<[-.>]>>>>>>+>>>>>]<<[-]<<+<-]>>>)[-]>>>>>>>,[<<<<<<++<+++++++++++++:>>>>>>,]

ふ,、 @ KritixiLithosと私はこれに4日間取り組んでいます。

0x00入力文字がプログラムにない場合は印刷し、そうでない場合は16進数での文字のインデックス(1から始まる)。オンラインでお試しください!

説明:

[(:<>)+,-.]
All chars listed here; like other submissions 
(>>>>>>)
@KritixiLithos added this part; I don't know what it does but saves the program
+([-]<<[->+>+<<]>>[-<<+>>]>>[-<+<+>>]<[->+<]<[-<->]<)
Comparison ;calculates z=x!=y and puts it in between x and y
Start; X _ _ _ Y
           ^
End;   X Z _ _ Y
         ^
+([-]+++++++[>+++++++++++++<-]>)
Function to add 91 to the tape
+([-]+++++[>++++++++<-]>)
Function to add 40 to the tape
+(-:<+++[->++++++<]>)
Function to add 58 to the tape
+(-:++)
Function to add 60 to the tape
+(-:++)
Function to add 62 to the tape
+(----:+)
Function to add 41 to the tape
+(-:++)
Function to add 43 to the tape
+(-:+)
Function to add 44 to the tape
+(-:+)
Function to add 45 to the tape
+(-:+)
Function to add 46 to the tape
+([-]++:++)
Function to add 93 to the tape
+([>[->+>+<<]>>[-<<+>>]<:>>+:[[-]>+<]>-[<‌​<<<[-.>]>>>>>>+>>>>>]<<[-]<<+<-]>>>)

この最後の機能はループです。選択された文字[(:<>)+,-.]を順番にループし、入力と文字を比較します。次に、このループがどのように機能するかについて、より詳細に説明します。

12-n n+2 _ n+2: _ _ _ i _ _ _ _ _ _;  n=loop counter
                  ^                ;  i=input

ループ内では、スタックはそのように見えます。ループはまで実行され12-nます0。それから、カウンターがありn+2ます。このカウンターは、選択した各文字の機能の番号でもあります。したがってn=0n+2は、最初の文字に対応し[ます。>[->+>+<<]>>[-<<+>>]<:それだけで、カウンターをキャラクターに変換します。

ポインタがキャレットの位置に来たら、カウンタ変数から生成された文字と入力を比較しながら、それらを保存します。

12-n n+2 _ n+2: Z _ _ i _ _ _ _ _ _;  n=loop counter
                ^                  ;  i=input

Zある0文字が入力、または他のいくつかの他の非ゼロ整数に等しい場合。

ここで、この平等性をチェックするifステートメントを作成します。

[[-]>+<]

場合はZ非ゼロである、すなわち、文字入力がされていない同じ、我々は次のメモリ場所をインクリメントします。

このifステートメントから出た後、次の記憶場所をデクリメントします。今、この記憶場所にはが含まれています!Z。最後にこれを使用して、入力と一致する場合は文字のインデックスを出力し、ループを強制的に終了します。そうでない場合は、ループが終了するか一致が見つかるまでループを続けます。

[-]>>>>>>>
Clears first byte; goes to position to start program
,[<<<<<<++<+++++++++++++:>>>>>>,]
Loops inputs


6

Javascript、34バイト

f=a=>a.map(v=>('f='+f).indexOf(v))

これは、文字列の配列として入力を受け取りxある-1(0ベースのインデックス)。


その方法は、クインにも受け入れられるため、許可されています。ソースファイルを開いて読み取ったり、ソースに初期化された変数を使用したりしません。
mbomb007 16

1
@ mbomb007すべてのJavaScriptエンジンについて話すことはできませんが、FirefoxではFunction.toStringはソースを読み取ることで機能します。ある時点で、ソースを読み取ろうとしたときにソースが存在しなかった場合、デバッグビルドでクラッシュします。(デバッグビルドは一般に非常にクラッシュするため、最近試したことはありません。)
ニール

s='s=%s;print s%%s';print s%sPython で行うことと何の違いもないと思います。が含まれていないf=ため、大丈夫です
mbomb007

1
入力aは文字列であるため、実際には実行できません。map文字列用の関数はありません。
manonthemat

@manonthemat「あなたが入力した文字列(または列)であると仮定することができます」
LarsW


5

Ruby、41 88 86 71 69 67 61 56バイト

a='p$<.chrs{| #index};"';$<.chars{|c|p"a='#{a}".index c}

6バイトを削除したThx Lynn


1
a='p$<.chrsm{| #index};"';p$<.chars.map{|c|"a='#{a}".index c}STDINから入力を取得しても機能するはずです。
リン

4

> <>(魚)70バイト

 #.0+4*a5;!?l|!?f4*b+l1--naolc3*1+0.01?!|~ed+0.0+2e-{:;!?+1:i-1:r}+2:"

おそらく私が今まで作った中で最も長い> <> 1のライナー。

別の行(0のインデックス)で見つかった各文字の出力を印刷します。

見つからない文字は常にコードの長さ+ 1を出力します(現在の状態では問題ないと思われる場合はこれを変更できます)。この場合、71は常に「見つからない」文字になります。

時間ができたら説明を実行します。

いくつかのテストケース。

## K = 1 \ n1 \ n71

# "#= 1 \ n69 \ n1

オンラインで試す

> <>言語


71は、見つからない場合の出力としては問題ないと思います。一貫性があり、明確で、人間が読める形式です。「正の整数ではない出力」よりも重要だと思います。この決定を反映するためにルールを拡張しました。
Sanchises 16


3

Clojure、43 56 48バイト

編集:くそー忘れた 2!43から56に増加しました。

編集2:このテキストの下のサンプルコードを更新し、バイト数を更新して、含まれません(def f ...)、ハッシュマップ部分のみを更新しました。

{\{ 0\\   1\  3\0   4\1 10\3 14\4 20\2 34 \} 43}

ハッシュマップは文字のみで構成され01234{\\}、その場所をエンコードします。Clojureでは、この完全な例に示されているように、ハッシュマップは関数を使用fできます(ハッシュマップ定義に置き換えることができます)。

; Keeping track of the zero-based index:
;      00000000001111111111222222222233333333334444444444
;      01234567890123456789012345678901234567890123456789
(def f {\{ 0\\   1\  3\0   4\1 10\3 14\4 20\2 34 \} 43})

(map f "0123456789{} \\abcdef") ; (4 10 34 14 20 nil nil nil nil nil 0 43 3 1 nil nil nil nil nil nil)
(apply str (keys f))            ; " 01234{\\}"

私はこれが重要だと思う:)


2

JavaScript、39バイト

p=s=>[...s].map(c=>`p=${p}`.indexOf(c))

console.log( p('mapP') )


1
説明して[...s]もらえますか?
エレセン16

スプレッドオペレーターとして知られています。ES6ゴルフのヒントでもう少し見ることができます
ワシントンGuedes

2
ソースコードの読み取りは許可されていません
Arnauld

2

Pyth、11バイト

xL_+N"N+_Lx

"quoted string"文字列内の引用符が先行する\でエスケープされたaの入力を受け取り-1、ソースにない文字に対してゼロインデックス値のリストを出力するプログラム。

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

使い方

xL_+N"N+_Lx    Program. Input: Q
xL_+N"N+_Lx"Q  Implicit quote closure and implicit input
     "N+_Lx"   Yield the string "N+_Lx"
   +N          Prepend a quote
  _            Reverse
 L          Q  Map over Q:
x               Yield the index of the character in the string
               Implicitly print

2

05AB1E、19バイト

"'ìsvDyk,"'"ìsvDyk,

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

これは、欠落した文字の代わりに-1を出力します。


Luis Mendoがこれを(わずかに修正して)Golfに投稿しました、そのクインに「s」と「k」を追加すると、この回答も得られます。しかし、私はその些細な変更を称賛することはできません...ルイス、これを再投稿したいなら私にメッセージを送ることができます。それを削除します。その質問を見つける前に私の進捗を確認したい場合は、編集を表示します。まあ...それある時点で彼のようなものでした


@Sanchisesは私のために働きます!
魔法のタコ

クールクールクール!
-Sanchises

Replying to @yokohama
ルイスメンドー

2

SmileBASIC、128 96 88 86バイト

?R<3+CD,4LINPUT(S$)WHILE""<S$?INSTR("?R<3+CD,4LINPUT(S$)WHILE"+CHR$(34),SHIFT(S$))WEND

理解するべき重要なことは、これは実際にはないことです難しい挑戦で。最後の一意の文字までのソースコードのみが必要です。

コードの先頭に各文字を少なくとも1つ入れます。?R<3+CD,4LINPUT(S$)WHILE"したがって、プログラムのコピーを最初の引用符まで保存するだけです。


1

Python、90 88バイト

a,b,d=" ()+.7:[]efilmnor","a,b,d=\"",lambda e:[[b.find(d),a.find(d)+7][d in a]for d in e]

テストケース:

print(d("a,b(]q"))
#[0, 1, 2, 8, 15, -1]

1

積み上げ、非競合、36バイト

この言語はまだ開発中であると言ったとき、私はそれを意味しました。どうやら、promptスタック全体を消費するために使用されます。これが私がいいものを持てない理由です。ここで試してみてください!

[tostr ':!' + prompt CS index out]:!

これは標準のクインフレームワークです。基本的に、スタック上で:関数[...]を複製し、その後で実行され!ます。次に、[...]スタック内の関数で内部を実行します。文字列にキャストし、:!(プログラム自体)を追加し、で文字列入力を取得しpromptます。CS文字列に変換します。文字列は、演算子をベクトル化するという点で通常の文字列とは少し異なります。この場合、index入力をベクトル化して、プログラム内の入力文字列の各インデックスを生成し、最終的にoutパットします。

入力のHello, World!場合、これは以下を与えます。

(-1 27 -1 -1 2 -1 6 -1 2 5 -1 26 9)

私は、クインなしのものを使用しようとしました(つまり、ソースに表示される文字列をエンコードします)が、Stackedには1種類の引用符しかあり'ません。


1

、12バイト

m€`:'""m€`:'

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

説明

説明では、¨文字列の区切りと文字の区切りに使用しています'

m€`:'""m€`:'  -- implicit input, for example: ¨m"a1`¨
      "m€`:'  -- string literal: ¨m€`:'¨
  `:'"        -- append character '"': ¨m€`:'"¨
m             -- map function over each character (example with 'a'):
 €            -- | index of first occurrence (1-indexed): 0
              -- : [1,6,0,0,3]

1

Java 8、172 122バイト

a->{/*.indexOf(c)+\" ;}orh:Systmup*/for(char c:a)System.out.print("a->{/*.indexOf(c)+\\\" ;}orh:Systmup".indexOf(c)+" ");}

0インデックス付き -1で、ソースコードの一部ではない文字をします。

説明:

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

a->{                         // Method with character-array parameter and no return-type
  /*.indexOf(c)+\" ;}orh:Systmup*/
                             //  Comment containing the remaining characters of the code
  for(char c:a)              //  Loop over the input-array
    System.out.print(        //   Print:
      "a->{/*.indexOf(c)+\\\" ;}orh:Systmup"
                             //    String containing all the characters used in the code
      .indexOf(c)+" ");}     //    Print the index of the char, plus a space as delimiter



1

Perl 5-pl 43のバイト

改行で区切られた入力を使用-1し、プログラムに表示されない文字を印刷します。

$s=q{$_=index"\$s=q{$s};eval\$s",$_};eval$s

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


@Sanchisesが修正されました。ごめんなさい。明らかに正しく読まなかった!
ドムヘイスティングス

問題ない。この挑戦に新たな命を吹き込んでくれてありがとう!
Sanchises

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