각 입력 문자에 대해 프로그램의 첫 번째 위치를 출력하십시오.


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부터 인덱싱을 사용하는 경우 NaN, Inf문자열 potato, 프로그램의 길이보다 숫자보다, 등).

제한 사항

소스 코드를 읽는 것은 허용되지 않습니다 (예 : 적절한 quine에서). 의견 사용은 허용되지만 점수에는 포함됩니다.

입력 및 출력은 합리적인 형식으로 수행 할 수 있습니다,하지만해야합니다 모호 (만 추가하면 구분없이 rand스트림과 응답이 어딘가에 주장), 일관성 (예를 들어, x위에서 항상해야합니다 같은 값) 및 인간 - 읽을 수있는 ; 예를 들어 문자열 또는 문자 배열입니다. 입력이 인쇄 가능한 ASCII 문자의 문자열 (또는 배열)이라고 가정 할 수 있습니다. 전체 유니 코드 세트를 처리 할 필요가 없습니다.


코드에서 사용자 정의 코드 페이지 또는 인쇄 할 수없는 ASCII?

언어가 사용자 정의 코드 페이지 (Jelly, APL 등)를 사용하는 경우이를 고려해야합니다 (따라서 프로그램 €æÆ은 입력을 [1, x, 2]위해 출력해야 함 €%æ). ASCII가 아닌 문자 만 사용하여 -1항상 출력 하려면 (입력이 ASCII 전용이므로) 올바른 솔루션이 아닙니다. 프로그램이 기본적으로 사용자 정의 코드 페이지를 승인한다고 가정 할 수 있습니다. 즉, 프로그램에 문자 A를 정수 65(ASCII 인코딩) 로 변환하는 방법이있는 경우 이제 코드 페이지의 65 번째 문자를로 변환한다고 가정 할 수 있습니다 65.


다음 도전에 영감 : 위치 상 인식


대문자 사용이 중요합니까?
Kritixi Lithos

기본적으로 @KritixiLithos , yes 입니다.
Martin Ender

@KritixiLithos 그것은 실제로 않습니다.
Sanchises

내 프로그램이 인덱스 0 ~ 9 만 사용 하는 경우 구분 기호가 필요 01030708070합니까 , 예를 들어 출력 할 수 있습니까?
Dennis

@ 데니스 아니, 당신은하지 않습니다. 모호하지 않고 일관되며 사람이 읽을 수 있습니다. 구분 기호를 요구해도 도전에 흥미로운 것은 추가되지 않으므로 낮은 바이트 수를 남용하십시오. ;)
Sanchises

답변:


24

Python2, 55 바이트

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

코드에 사용 된 모든 문자가 포함 된 문자열로 시작한 다음 인덱스를 검색하십시오.


5
나는 이것이 지루한 대답인지 알지 못한다. 나는 표준 quine을 사용하는 것이 이것보다 훨씬 덜 흥미 롭다고 생각합니다. :)
Martin Ender

이것은 Python 2이므로 대부분의 입력에서 중단되지 않습니까?. 그것이 깨지면을 사용해야 raw_input합니다.
TidB

@TidB 흠, 안돼? 어떤 의견을 염두에두고 있습니까?
Rod

@로드 Nevermind, 나는 조금 바보했다. iterable을 입력하면 항상 작동합니다. 바보 나.
TidB

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 등의 관습에 따라 출력은 바이트 단위입니다.

작동 원리

이것은 간단한 고양이 프로그램 ,[.,]입니다.

소스 코드에는 모든 256 바이트 값이 순서대로 포함되므로 각 바이트의 색인은 해당 값과 일치합니다.


4
흠 나는 Lenguage가 사람들이 3 배의 크기로 능가하는 유일한 언어라고 생각합니다.
Sanchises

2
Lenguage는 다른 언어에서 원격으로 경쟁하지 않는 속임수를 찾는 방법을 끊임없이 찾는 유일한 언어입니다. : P
Dennis

+[,.]더 나은 점수를 만들지 않겠습니까 ?
Sanchises

@Sanchises 대략 12,000 바이트를 절약 할 수 있지만 끝에 여분의 null 바이트도 인쇄합니다.
Dennis

2
글쎄, 나는 null 바이트 입력에 있다고 가정하고 (함수는 문자열을 종료하는
것이지만

10

길이 , 1.22e7 바이트

12263215 NUL바이트 (Hex 0x00)로 구성됩니다 .

NUL소스에 나타나지 않는 모든 문자 에 대해 a 를 출력합니다 .

소문은 입력에 결코을 포함하지 NUL않으므로 NUL입력에 문자가 있는 양을 항상 출력 한다는 것입니다.

이것은 다음 Brainfuck 프로그램으로 번역됩니다

,[[-].,]

그리고 고장으로 ...

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

이것은 골프 언어로서 Lenguage의 강력한 힘을 보여줍니다. 두려워


2
그런 영리한 멍청이, 당신은 거의 이겼습니다 ... 당신도 반대로 시도했습니다, 즉 0x00 바이트와 1 인덱싱?
Sanchises

나는 좋아할 것이지만 Brainfuck / Lenguage (또는 내가 사용하는 인터프리터)는 EOF와 0x00을 구별 할 수 없으므로 실제로 도전에 대답 할 수는 없습니다.
ATaco

Brainfuck et al. 일반적으로 정수를 바이트로 인쇄 할 수 있습니다. 즉, SOH를 1로, NUL을 0으로 인쇄합니다.
Dennis

@Sanchises 여기에 해당되는지 확인할 수 있습니까?
Dennis

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=0, n+2는 첫 번째 문자, 즉에 해당합니다 [. >[->+>+<<]>>[-<<+>>]<:그냥 카운터를 문자로 변환합니다.

포인터가 캐럿이있는 위치에 있으면 카운터 변수에서 생성 된 문자를 유지하면서 입력과 비교합니다.

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

Z0문자 입력, 또는 기타 다른 비 - 제로 정수 동일한 경우.

이제 우리는이 평등을 확인하기 위해 if 문을 제시합니다.

[[-]>+<]

Z0이 아닌 경우 , 즉 문자와 입력이 같지 않으면 다음 메모리 위치를 증가시킵니다.

이 if 문에서 나온 후 다음 메모리 공간을 줄입니다. 이제이 메모리 장소는을 포함 !Z합니다. 마지막으로 이것을 사용하여 입력과 일치하는 문자의 색인을 출력 한 다음 루프를 강제로 종료합니다. 그렇지 않으면 루프가 끝나거나 일치하는 것을 찾을 때까지 루프를 계속 진행합니다.

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


6

자바 스크립트, 34 바이트

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

이것은 스트링의 어레이로의 입력을 받아, x-1(0 기반 인덱스).


그 방법은 quines에도 허용되기 때문에 허용됩니다. 소스 파일을 열고 읽거나 소스로 초기화 된 변수를 사용하지 않습니다.
mbomb007

1
@ mbomb007 모든 JavaScript 엔진에 대해 말할 수는 없지만 Firefox에서는 소스를 읽음으로써 Function.toString이 작동합니다. 한 번에 소스를 읽을 때 소스가 더 이상 존재하지 않으면 디버그 빌드에서 충돌이 발생합니다. (디버그 빌드가 일반적으로 너무 충돌하기 때문에 최근에 시도하지 않았습니다.)
Neil

나는 그것이 s='s=%s;print s%%s';print s%s파이썬 에서하는 것과 다르지 않다고 생각합니다 . 포함되지 않으므로 f=괜찮습니다
mbomb007

1
입력 a은 문자열이어야 하기 때문에 실제로는 그렇게 할 수 없습니다 . map문자열 에는 기능 이 없습니다 .
manonthemat

@manonthemat "입력이 문자열 (또는 배열)이라고 가정 할 수 있습니다"
LarsW


5

루비, 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에서 입력을 받아도 작동합니다.
Lynn

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

3

펄 6 , 50 52 바이트

{(('R~.index$_) for}\\'R~'{((\'').index($_) for $_)}

번역 GB의 루비 솔루션로드의 파이썬 솔루션 .

문자 목록을 입력하고 Nil존재하지 않는 문자에 대해 0부터 시작하는 색인 ​​목록을 출력하는 람다 .

편집 : 감독 수정-2 바이트 추가 필요 :(


3

클로저, 43 56 48 바이트

편집 : 젠장, 잊어 버렸습니다 2! 43에서 56으로 증가했습니다.

편집 2 :이 텍스트 아래의 샘플 코드를 업데이트하고 포함하지 않는 바이트 수를 업데이트 (def f ...했지만 해시 맵 부분 만 업데이트했습니다 .

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

해시 맵은 characters만으로 구성되며 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

Pyth, 11 바이트

xL_+N"N+_Lx

"quoted string"문자열에 따옴표가있는으로 입력하고으로 이스케이프 된 프로그램은 소스에없는 문자 \-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 you a quine for this good 에이 내용을 약간 올렸습니다 . , 해당 quine에 "s"및 "k"를 추가하면이 답변도 나타납니다. 그러나, 나는 그 수정의 사소한 일에 대해 신용을 얻을 수 없습니다 ... Luis, 당신은 이것을 다시 게시하고 싶다면 그것을 삭제할 수 있습니다. 해당 질문을 찾기 전에 진행 상황을 보려면 편집 내용을보십시오. 음 ... 그것은 이었다 한 지점에서 자신처럼 크게.


@ Sanchises가 나를 위해 일합니다!
Magic Octopus Urn

쿨 쿨 쿨!
Sanchises

트윗 담아 가기
Luis Mendo

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

알아 두어야 할 중요한 사항은 이것이 실제 적인 도전 이 아니라는 입니다. 마지막 고유 문자 까지 소스 코드 만 있으면 됩니다.

코드의 시작 부분에 각 문자 중 적어도 하나를 넣었습니다. ?R<3+CD,4LINPUT(S$)WHILE"따라서 첫 번째 따옴표까지 프로그램 사본 만 저장하면됩니다.


1

파이썬, 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]:!

이것이 표준 quine 프레임 워크입니다. 기본적으로 스택 :에서 함수 [...]를 복제 한 다음로 실행됩니다 !. 그런 다음 내부 [...]는 스택의 함수 로 실행됩니다. 문자열로 캐스팅하고 :!(프로그램 자체)를 추가 한 다음으로 문자열 입력을 가져옵니다 prompt. CS문자열로 변환합니다. 문자열은 연산자가 벡터화한다는 점에서 일반 문자열과 약간 다릅니다. 이 경우 index입력을 벡터화하여 프로그램에서 입력 문자열의 각 색인을 생성하고 최종적으로 out넣습니다.

input의 Hello, World!경우 다음을 제공합니다.

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

나는 quine이없는 것을 사용하려고 시도했습니다 (즉, 소스에 나타나는 문자열을 인코딩), Stacked에는 따옴표 유형이 하나뿐입니다 '.


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

자바 8, 172122 바이트

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

Stax , 19 바이트

"'sym[]I+"'"s+ym[]I

실행 및 디버깅

한 줄에 한 문자 씩 0부터 시작하는 인덱스를 출력합니다. "34bL"34bL내가 이전에 쓴 quine을 수정하는 것보다 짧다는 것이 밝혀졌습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.