오토 그램 프로그램


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 년부터 시작되었습니다!)
Nathaniel

기능이 허용됩니까, 아니면 전체 프로그램 만 허용됩니까?
Uriel

1
참고 : 유사 답변 이 하나가 더 이상 유효한 것으로 간주되지 않습니다.
user202729

1
FWIW, 적절한 quine 정의는 내가이 도전에 정말로 원하는 것보다 조금 더 강합니다. 예를 들어, 연속 된 범위의 모든 문자를 사용하고 입력이 해당 범위에있는 경우 1을 출력하는 프로그램을 보게되어 매우 기쁠 것입니다. 프로그램의 다른 부분 " 그런 이유로 나는 망막 예제를 기꺼이 허용했지만 이미 1 바이트이기 때문에 다른 사람들이 게시하지 못하게하면 실망했을 것입니다. (@ user202729)
Nathaniel

1
위의 의견으로 인해 quine 규칙이 적용되는 진술을 제거했습니다. (나는 소스 코드를 읽지 않는 것에 대한 부분을 유지했다.)
Nathaniel

답변:


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  

다른 모든 입력 문자는 0을 반환합니다.

내가 탈출해야한다는 사실 '은 이것을 훨씬 더 길게 만들었습니다. 4 개의 괄호를 설명하기 위해 문자열에 복제본이 있습니다. 그러나 아포스트로피를 복제하면 아포스트로피가 필요하므로 올바른 결과에서 더 멀어집니다. 따라서 ASCII 값으로 아포스트로피 수를 세어야했습니다 39. 물론 이것은 내가 문자를 확인하는 것을 의미했다 39모든 많은 이상을, 너무.


2
이것은 내가 더 많이보고 싶은 종류입니다. (표준 퀘인을 취하고 문자를 세는 코드를 추가하는 대신 문제를 최적화합니다.)
Nathaniel

7

엑셀, 84 바이트

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

Find()A1문자열 내 에서 셀의 값을 찾습니다 "123456789,()=MINORFADEOMEN( """처음에는 문자를 이스케이프하고 just로 평가됩니다 ").

의 결과를 바탕으로 Find()Mid()함수는 숫자 문자열에서 해당 문자를 반환합니다. 이 문자열은 변경이 중지 될 때까지 반복을 통해 작성되었습니다.

문자를 A1찾을 수 없으면 Find()오류를 반환하므로 IfError()함수는이 문자를 이스케이프 처리하여 0대신 반환 합니다.

OMEN존재가에서 검색 문자열의 끝에있는 Find()기능은 자신의 위치가 반환되지 않습니다하지만 그들은 문자 수를 조정할 필요했다, 그래서 중복 문자입니다. 그것들이 없으면 끝없는 변화 횟수가있었습니다. 문자 배열은 문체 선택입니다.


5

자바 스크립트 (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 Rand

5

망막 , 1 바이트

quine 규칙을 엄격하게 따르는 경우에는 유효하지 않지만 OP는 명시 적으로 comment에 허용합니다 .

x

온라인으로 사용해보십시오!

망막에서 한 줄 프로그램은 입력에서 해당 정규 표현식의 발생 횟수를 계산합니다. 이 문제는 제외한 모든 단일 ASCII 문자로 해결된다 `, ., +, *, ?, [, (, ), ^, $, \와 줄 바꿈.


5

C # (Visual C # 컴파일러) , 88 57 바이트

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

온라인으로 사용해보십시오!

문자열에 전달 된 문자가 포함되어 있으면 3을 반환 하고, 그렇지 않으면 0을 반환합니다. 문자열에는 코드의 각 문자가 한 번 이상 포함되어 있으며 코드에 문자를 3 번 포함 하는 데 필요한 양이 정확히 들어 있습니다.

Kevin Cruijssen 덕분에 -31 바이트


좋은 접근 방식! 나에게서 +1 괄호를 제거하고 (a)=>char 대신 문자열로 입력을 가져 와서 바이트를 절약 할 수 있으므로 .ToString()더 이상 필요하지 않으며 a+""코드 골프 과제에는 필요하지 않을 수도 있습니다 .ToString(). 또한 .Contains이미을 포함하고 있기 때문에 a입력 변수를 사용하지 않는 다른 문자 ( x또는 같은 q)를 4 대신 각 문자마다 3으로 만들 수 있습니다 . 편집 : 마지막 부분은 신경 쓰지 마십시오 ". 지금도 4 번 사용됩니다.
Kevin Cruijssen

@KevinCruijssen 조언에 감사드립니다. 그러나 문자열이 입력으로 유효합니까? OP가 바이트를 입력으로 요청했다고 생각합니까?
Hyarus

단일 문자열 인 한 확실합니다. 대부분의 언어는 어쨌든 문자열 값만 입력 할 수 있으며 문자는 여전히 문자열로 입력하도록 선택합니다 (예 : Java, JavaScript 및 Japt 등). 입력 및 출력 형식은 일반적으로 매우 유연합니다. 그러나 항상 코멘트는 여전히 의심하는 경우 :).
케빈 Cruijssen

1
@KevinCruijssen은 합리적으로 들립니다. 그리고 우리가 ""중 하나를 벗어나면 우리는 심지어 문자 당 원하는 3 개까지 얻을 수 있습니다
Hyarus

2
입력으로 단일 문자열은 괜찮습니다.
Nathaniel

4

하스켈 , 66 바이트

처음 두 버전은 본질적으로 필요한 문자를 필터링 한 다음 길이를 취하는 quine입니다.

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$"

온라인으로 시도 하거나 모든 캐릭터로 테스트 하십시오 !


비 Quine 대안, 87 86 바이트

여전히 향상 될 수 있지만, 세 그룹으로 나눠서 기쁩니다.

바이트 수가 가장 많지만이 것을 가장 좋아합니다. 문자 / 바이트 수를 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

파이썬 2 , 54 52 32 바이트

ovs 덕분에 -20 바이트

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

온라인으로 사용해보십시오!


1
람다 나 입력이없는 방법은 무엇입니까?
Stewie Griffin

2
@StewieGriffin Python은 메소드 참조를 자동으로 바인딩하므로 "xxx".count와 같습니다 lambda c:"xxx".count(c).
Neil

@StewieGriffin과 같은 방법으로 둘 다 사용합니다-> 다음 f="xxx".countf=lambda c:"xxx".count(c)같이 불립니다f('a')
Rod

3

껍질 , 11 10 8 바이트

-2 바이트를위한 Leo 감사 합니다!

#sD"#sD"

온라인으로 사용해보십시오!

설명

이렇게하면 ASCII 만 사용하고 ( show엉망이 되기 때문에 ) 각 문자가 두 번 포함됩니다.

#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
문자열을 표시하기 전에 두배로하여 따옴표를보다 쉽게 ​​관리 할 수 ​​있습니다. 온라인으로 시도하십시오!
Leo

3

자바 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

오래된 바이트 답변 :

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와 함께이 문자열을 입력하는 데 사용됩니다 s.format(...).
  • %c, %1$c그리고 34이중 따옴표를 포맷하는 데 사용됩니다.
  • s.format(s,34,s) 다 합쳐

도전 과제 :

  • .replaceAll("[^"+c+']',"") 입력과 같은 문자를 제외한 모든 문자를 제거합니다.
  • .length() 그런 다음이 문자열의 길이를 사용합니다.

참고 : .split(c).length( String대신 입력이있는 경우 char) 짧아 보일 수 있지만 두 가지 문제가 있습니다.

  1. 첫 번째 문자는 잘못된 결과를 제공하므로 c( c->앞 부분 과 함께 )를 입력하면 한 문자를 너무 적게 반환합니다. +(c==99?1:0)소스 코드와 형식화되지 않은 소스 코드 문자열을 모두 추가 하고로 변경 .split(c)하면 .split(c+"")문제를 해결할 수 있지만 여전히 다음과 같은 문제가 있습니다.
  2. 정규식 문자 (예 :) $가 입력되면 .split정규식으로 해석되어 잘못된 결과를 제공합니다.

3

하스켈 , 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]

하스켈 , 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

스몰 토크 , 112132 바이트

스몰 토크는 정확하게 골프 적합성으로 알려져 있지 않습니다 :-)

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에 오신 것을 환영합니다!
Martin Ender

2

자바 스크립트, 31 바이트

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

온라인으로 사용해보십시오


1
나는 이것이 자신의 소스 코드를 읽는다고 생각하지 않습니까? 그것은 대담하게 질문에 명시 적으로 금지되어 있습니다.
Nathaniel

1
@Nathaniel, 여기를 참조 하십시오 .
Shaggy

2
흠. 솔직히 나는 그것이 바보라고 생각하지만, 내가 생각하는 메타 합의에 동의하지는 않습니다.
Nathaniel

1
@Nathaniel eval을 쉽게 만드는 모든 프로그램의 경우 quine을 쉽게 만듭니다.
user202729

1
@ user202729 나는 다음과 같이 생각하지 않습니까? 예를 들어 파이썬에서는 같은 트릭을 수행 할 수 없습니다. 이것은 eval이 아닌 리버스 eval입니다.
Nathaniel



2

하스켈 , 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

온라인으로 사용해보십시오!

하스켈 , 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

온라인으로 사용해보십시오!

하스켈 , 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

온라인으로 사용해보십시오!

설명

이 답변은 굉장히 정교하지 않습니다. 프로그램에 존재하는 각 문자마다 하나씩 일련의 선언입니다. 결국 우리는 프로그램에 존재하지 않는 문자에 대해 0을 반환하는 모든 것을 잡습니다.

나는 프로그램에 필요한 문자 수를 최소화하기 위해 몇 가지 트릭을 사용하고 거기에서 숫자가 올바르게 나타날 때까지 물건으로 뒤섞 었습니다. 마지막 선언에서 변수 이름을 모두 3 개로 채웠다는 것을 알 수 있습니다. 3 개의 프로그램의 차이점은 새로운 줄을 사용하기로 선택했는지 또는 ;줄 바꿈을 선택했는지와 Chars를 입력 또는 문자열로 선택했는지 여부입니다. 이 ;접근법은 본질적으로 다른 것보다 우월하지 않은 것처럼 보이며 단지 운이 좋아지고 짧아집니다. 그러나 Chars는 Strings 가하지 않는 함수 이름 뒤에 공백이 필요하기 때문에 Strings를 사용하는 것이 Chars보다 더 좋은 아이디어 인 것 같습니다.


: | 설명에서 철자가 무슨 일이 있었는지
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 개의 새로운 줄이 사용되었습니다.

보통 나는 순서대로 만들기 라벨을 사용하여 NSSN, NSSSN, NSSTN, NSSSSN, NSSSTN, NSSTSN, NSSTTN, 등 그러나 바이너리 숫자 인쇄하기 때문에 S=0/ T=1사용하는 I 출력에 필요한 수에 영향을, 내가 레이블을 사용 NSSN, NSSSN, NSSTN, 그리고 NSSSTN대신 준 이는 이진 숫자 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은 \t( 9) 이되며 ,이 경우 0첫 번째 If 0검사에서 LABEL_TAB/ 로 이동하여 대신 NSSSTN눌렀다가 인쇄 37합니다.

온라인으로 시도하십시오 (원시 공백, 탭 및 줄 바꾸기 만).

입력 : 개행

대신 STDIN은 \n( 10) 이되며 ,이 경우 0두 번째 If 0검사가 진행되고 Label_NEWLINE/ 로 이동 한 다음 대신 NSSSN푸시하여 인쇄 33합니다.

온라인으로 시도하십시오 (원시 공백, 탭 및 줄 바꾸기 만).

입력 : 다른 것

다른 입력 문자는 NSTN세 번째 If 0검사 후에 (Jump to Label_PRINT로) 0여전히 스택에 있던 것을 인쇄합니다 (처음에는 복제했습니다).

온라인으로 시도하십시오 (원시 공백, 탭 및 줄 바꾸기 만).


1
이것은이 도전에 대한 훌륭한 언어입니다.
qwr

2

apt , 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

펄, 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 진수로 발생하는 횟수를 인쇄합니다.

이 프로그램은 간단합니다. 대부분의 소스 코드는 가능한 각 바이트에 대한 답변을 제공하는 리터럴 테이블이 차지합니다. 후행 0은 생략되고 인접한 0은 런타임 압축되지만 그 이외의 특별한 트릭은 없습니다. 나머지 프로그램은 단순히 입력을 읽고 표에서 답을 찾습니다.

예를 들어, 22, 12, 6, 3, 5, 2, 4, 0, 1, 0소스 코드 의 부분 은 자릿수의 빈도를 제공하므로 소스 코드에는 22 개의 0, 12, 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 중 하나를 X로 변경하여 보상합니다. 그 외에, 이것은 큰 삼항 조건에 따라 값을 반환하기 위해 할당 트릭을 사용하여 정수를 취하는 함수 일뿐입니다.


0*84332211다른 C 답변에서 와 같이 숫자 상수를 0 다음으로 이동하여 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
이 코드는 독자적인 코드가 아닙니까?
Razvan Socol

@RazvanSocol JavaScript 솔루션 인 것 같습니다
l4m2

@ RazvanSocol 잘 파일에 저장할 필요가 없으므로 괜찮습니다. 많은 fungeoids와 JS도이 작업을 수행합니다
ASCII 전용

나는 당신이 "자신의 소스 코드를 읽는"것으로 계산되는 코드를 읽고 있다고 주장합니다. 이제 대부분의 솔루션과 마찬가지로 프로그램의 문자열 사본이 "소스 코드를 읽는 것"이라고 주장 할 수 있지만 문자열은 실행되지 않습니다.
qwr

1

apt , 14 바이트

Qi"QiUè² " ²èU

시도 해봐


설명

                   :Implicit input of character string U
  "QiUè² "         :String literal
Qi                 :Append a quotation mark
           ²       :Repeat twice
            èU     :Count the occurrences of U


1

젤리 , 16 바이트

“;⁾w⁸a2”;⁾“”w⁸a2

온라인으로 사용해보십시오!

모든 캐릭터는 정확히 두 번 나타납니다.

“;⁾w⁸a2”;⁾“”w⁸a2
“;⁾w⁸a2”;⁾“”     the string ;⁾w⁸a2“”
            w⁸a2 return 2 if input in string

1

x86, 42 40 바이트

여기서는 다른 전략과 동일한 전략을 사용합니다. 고유 바이트로 프로그램의 문자열 복사본을 만든 다음 al입력 al이 문자열 에 있으면 2를 반환 합니다. 실제로 실행되는 코드를 읽을 수있게하면 l4m2의 솔루션을 얻게 됩니다.

멋진 문자열 명령을 사용해야합니다 scasb. 내가 아는 한, 중복 바이트는 없지만 이것은 쉽게 망칠 수있는 것입니다. 문자열 주소를로드하는 데 5 바이트가 걸리지 만 더 짧은 해결책을 알지 못합니다 (64 비트 learip오프셋은 6 바이트가 필요합니다).

-2를 02두 번 사용하지 않도록 뒤로 점프하여 -2

.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 

16 진 덤프 (이진 파일 형식은 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'string도 그렇습니다 '''1'⊢-⍳⍳0.

APL 배열은 기본적으로 1- 인덱싱되며 흥미롭게도 index-of 함수 1 + max index는 요소를 찾을 수 없으면 반환 합니다.

따라서 문자열에서 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 답변에서 영감을 얻었습니다 .

이전 버전이 고장났습니다. paste필요하지 않은 점을 지적 한 @Giuseppe 덕분에 18 바이트 정도를 절약했습니다. 이 답변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"입니다. 따라서 복사를 제외한 전체 코드를 넣은 다음 카운트를 두 배로 늘 렸습니다.


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