공식 루비 인스펙터


30

다음은 간단한 ASCII 아트 루비입니다 .

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

ASCII Gemstone Corporation의 보석상으로서 귀하의 업무는 새로 획득 한 루비를 검사하고 발견 된 결함에 대한 메모를 남깁니다.

운 좋게도 12 가지 유형의 결함 만 가능하며 공급 업체는 루비가 둘 이상의 결함을 갖지 않도록 보장합니다.

12 개는 결함 (12) 내측의 하나의 교환에 대응하는 _, /또는 \공백 문자 (와 루비 문자 ). 루비의 외주에는 결함이 없습니다.

결함은 내부 문자에 공백이있는 위치에 따라 번호가 지정됩니다.

결함 번호

따라서 결함 1이있는 루비는 다음과 같습니다.

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

결함이 11 인 루비는 다음과 같습니다.

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

다른 모든 결함에 대해서도 같은 생각입니다.

도전

결함이있는 단일 루비의 문자열을 취하는 프로그램이나 함수를 작성하십시오. 결함 번호를 인쇄하거나 반환해야합니다. 결함이 없으면 결함 번호는 0입니다.

텍스트 파일, stdin 또는 문자열 함수 인수에서 입력을 가져옵니다. 결함 번호를 반환하거나 표준 출력에 인쇄하십시오.

루비에 줄 바꿈 문자가 있다고 가정 할 수 있습니다. 당신은 할 수 없는 그 공백을 후행 또는 선도 줄 바꿈을 가지고 있다고 가정합니다.

바이트 단위의 가장 짧은 코드가 이깁니다. ( 핸디 바이트 카운터 )

테스트 사례

13 가지의 정확한 루비 유형과 그에 따른 예상 생산량 :

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

명확히하기 위해 루비 후행 공백을 가질 수 없습니다 .
Optimizer

@Optimizer Correct
Calvin의 취미

@ Calvin'sHobbies 입력 에 후행 줄 바꿈 이 없다고 가정해도 될까요?
orlp

@orlp 예. 이것이 may의 핵심입니다 .
Calvin 's Hobbies

루비는 대칭입니다. 예를 들어, 오류 # 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

루비 2.0, 69 바이트

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

16 진 덤프 (문자열에 이진 데이터를 충실하게 표시) :

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한 줄이 아니라 전체 입력을 읽을 수 있습니다 .
  3. -rdigest옵션 digest은을 제공 하는 모듈을 로드 합니다 Digest::MD5.
  4. 그런 다음 코드는 입력의 MD5를 수행하고 다이제스트의 첫 번째 바이트를 가져와 주어진 이진 문자열에서 인덱스를 가져옵니다.

MD5 먼저 문자 자체에 고유 럭키
최적화

15
운이 필요하지 않습니다. 각 바이트에는 256 개의 가능성이 있으므로 13 개의 해시와 다른 첫 번째 바이트는 그리 특이하지 않습니다. 그러나 어떤 이유로 충돌이 발생하면 해시의 두 번째 바이트를 사용합니다.
Chris Jester-Young

14
루비로 루비 인스펙터를 작성하십시오. 당연히!
Mast

다음 도전 :이 게시물 자체를 점검하십시오
Redwolf 프로그램

7

줄리아, 90 59 바이트

확실히 가장 짧은 것은 아니지만 공정한 처녀 줄리아는 왕실의 루비를 검사하는 데 큰 관심을 기울입니다.

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

문자열을 받아들이고 s해당 루비 결함 번호를 반환 하는 람다 함수를 만듭니다 . 호출하려면 이름을 지정하십시오 (예 :) f=s->....

언 골프 + 설명 :

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 배열을 얻는 더 짧은 방법을 생각할 수 없었습니다.
앤드류는 모니카

@AndrewPiliser : 감사합니다. 귀하의 의견에 감사드립니다. 제안을 사용하도록 편집했습니다. 또한 reshape()사용 하는 것보다 짧은 방법 vec()입니다. :)
Alex 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
Optimizer

내 대답은 Pyth에 최적이라고 생각합니다. Pyth에는 해시 함수가 필요합니다 ( .h지금은 내장 된 신뢰할 수없고 나쁘기 때문에 쓸모가 없습니다 hash()).
orlp

4

슬립 , 123108 + 3 = 111 바이트

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

nand o플래그로 실행

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까지의 단일 숫자입니다 . 슬립은 하나의 숫자를 출력하는 한 가지 방법, 즉 발견 된 일치 수를 출력하는 플래그 만 있습니다.n

이를 위해 위의 정규 표현식을 확장하여 o겹치는 일치 모드 의 도움으로 각 결함에 대한 올바른 횟수를 일치시킵니다 . 세분화 된 구성 요소는 다음과 같습니다.

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

예, 그것은 ?숫자를 올바르게 얻는 데 과도하게 사용 됩니다 : P


하하, 놀랍습니다. 언어에 더 많은 유형의 출력을 추가해야합니다.
BMac

4

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

파이썬 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

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

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