"enciph5r47g"를 해봅시다


35

이것은 "deciph4r4ng"를 수행하자


이 도전에서 당신의 임무는 문자열을 암호화하는 것입니다. 운 좋게도 알고리즘은 매우 간단합니다. 왼쪽에서 오른쪽으로 읽는 경우 각 일반적인 쓰기 문자 (ASCII 범위 32-126)는 숫자 N (0-9) 으로 바꿔야 합니다. N + 1 문자와 동일하다는 것을 나타냅니다. 그 전에 위치. 문자가 원래 문자열의 이전 10 개 위치에 나타나지 않는 경우는 예외입니다. 이 경우 문자를 다시 인쇄하면됩니다. 효과적으로, 원래 챌린지에서 작업을 취소 할 수 있어야합니다.

입력 문자열 "Programming"은 다음과 같이 인코딩됩니다.

예 1

따라서 예상 출력은 "Prog2am0in6"입니다.

설명 및 규칙

  • 입력 문자열에는 32-126 범위의 ASCII 문자 만 포함됩니다. 결코 비워지지 않을 것이라고 가정 할 수 있습니다.
  • 원래 문자열에는 숫자가 포함되지 않아야합니다.
  • 문자가 인코딩되면 이후 숫자로 참조 될 수 있습니다. 예를 들어 "alpaca"로 인코딩해야합니다 "alp2c1".
  • 참조는 문자열을 감싸지 않습니다. 이전 문자 만 참조 할 수 있습니다.
  • 전체 프로그램 또는 함수를 작성하여 결과를 인쇄하거나 출력 할 수 있습니다.
  • 이것은 코드 골프이므로 바이트 단위의 최단 답변이 이깁니다.
  • 표준 허점은 금지되어 있습니다.

테스트 사례

Input : abcd
Output: abcd

Input : aaaa
Output: a000

Input : banana
Output: ban111

Input : Hello World!
Output: Hel0o W2r5d!

Input : this is a test
Output: this 222a19e52

Input : golfing is good for you
Output: golfin5 3s24o0d4f3r3y3u

Input : Programming Puzzles & Code Golf
Output: Prog2am0in6 Puz0les7&1Cod74G4lf

Input : Replicants are like any other machine. They're either a benefit or a hazard.
Output: Replicants 4re3lik448ny3oth8r5mac6in8.8T64y'r371it9376a1b5n1fit7or2a1h2z17d.

6
귀하의 테스트 사례는 항상 대체를 위해 가능한 가장 낮은 자릿수를 사용합니다. 이 동작이 필요합니까, 아니면 둘 이상의 가능성이있을 때 더 높은 숫자를 사용할 수 있습니까?
Leo

@Leo 유효한 한 0-9 사이의 숫자를 사용할 수 있습니다.
엔지니어 토스트

이것은 움직이지 않는 것을 제외하고는 앞뒤로 인코더 와 같습니다. :)
pipe

답변:


6

05AB1E , 20 19 18 바이트

-2 Emigna 덕분에

õ¹vDyåiDykëy}?yìT£

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

õ                  # Push an empty string
 ¹v y              # For each character in input
   D               # Duplicate the string on the stack (call this S)
     åi            # If this character is in S
       Dyk         #   Push the index of that that character 
          ë }      # Else
           y       #   Push the character 
             ?     # Print without newline
              yì   # Prepend this character to S
                T£ # Remove all but the first 10 elements from S

나는 )¹vDyåiDykëy}?y¸ìT£또한 작동 한다고 생각 합니다.
Emigna

실제로, 귀하의 답변을 광산과 결합하면 õIvDyåiDykëy}?yìT£18 :)
Emigna

@Emigna 그것으로 당신을 업데이트 주시기 바랍니다 :)
라일리

나는 당신의 대답이 아니라면 그것을 생각하지 않았을 것입니다. 잘 했어!
Emigna

@Emigna 나는 그것이 공정한 것 같아요. 감사!
Riley

12

레티 나 , 24 23 바이트

(.)(?<=\1(.{0,9}).)
$.2

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

상당히 간단한 정규식 대체. 우리는 각 문자를 일치시키고 그 앞에 0-9 문자의 사본을 찾으려고 시도합니다. 우리가 그것을 찾으면, 우리는 사본을 얻기 위해 일치 해야하는 문자 수로 문자를 대체합니다.

결과는 가장 작은 숫자 대신 가능한 가장 큰 숫자를 사용하기 때문에 테스트 사례와 완전히 일치하지 않습니다.


4
가변 길이 look-behind는 부정 행위입니다 : p
Dada

8
@Dada 가변 길이 lookbehind는 깨달음의 길입니다.
Martin Ender

슬프게도 ... 지루하다면 펄 안에서 자유롭게 구현하십시오!
Dada

원래 작업에 영업 이익의 의견에 따라, "당신은 당신이 너무 오래가 유효의로 0-9을 원하는 한 자리를 사용할 수 있습니다."... 그래서 가능한 가장 큰 유효해야한다
하기 Doktor J

@DoktorJ 예, OP가 설명을 추가 한 후에 변경했습니다.
Martin Ender

8

자바 스크립트 (ES6), 74 57 54 바이트

ETH 프로덕션 덕분에 p=/./g대신 3 바이트를 절약했습니다 p={}(Neil에서 영감을 얻음)

s=>s.replace(p=/./g,(c,i)=>(i=p[c]-(p[c]=i))>-11?~i:c)

테스트 사례


문자열에 숫자가 포함되지 않기 때문에 s대신 사용할 수 p있습니까?
Neil

(나는 11자를 사용한다는 점에서 약간 놀랍습니다. find를 사용 하여 원본 버전 을 능가 할 수있었습니다 lastIndexOf....)
Neil

@ Neil 나는 지금 컴퓨터 앞에 있지 않지만 JS 문자열이 불변이기 때문에 작동하지 않을 것이라고 생각합니다.
Arnauld

2
문자열 리터럴의 속성 설정이 작동하지 않음을 확인할 수 있습니다. 그러나 ... 정규식에서 작동하는 것처럼 보이므로 s=>s.replace(p=/./g,(c,i)=>(i=p[c]-(p[c]=i))>-10?~i:c)3 바이트를 절약 할 수 있다고 생각합니다 .
ETHproductions

1
@YOU 여기에서 무슨 일이 있었는지 모르겠지만 마지막 편집시 모든 브라우저 에 버그 도입 된 것으로 나타났습니다 . 이제 수정되었습니다. 알아 주셔서 감사합니다!
Arnauld

7

하스켈 , 72 66 바이트

6 바이트 골프를위한 Laikoni 에게 감사 합니다!

(a:r)%s=last(a:[n|(n,b)<-zip['0'..'9']s,b==a]):r%(a:s)
e%s=e
(%"")

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

이 함수 %는 부분적으로 처리 된 문자열을 두 번째 인수에서 역순으로 유지하므로이 문자열의 처음 10 개 요소에서 검사중인 문자의 발생을 검색 할 수 있습니다. 제출은 이름없는 함수로 구성되며,이 (%"")함수는 빈 문자열을 두 번째 인수로 사용하여 이전 함수를 호출합니다.


f(a:s)=f s++(last$[a]:[show n|(n,b)<-zip[0..9]s,b==a])2 바이트를 절약합니다.
Laikoni

잠깐만 f(a:s)=f s++[last$a:[n|(n,b)<-zip['0'..'9']s,b==a]]더 절약하세요
Laikoni

사용하지 않고 이동 중에도 역전 reverse하면 1 바이트가 더 절약 됩니다. 온라인으로 사용해보십시오!
Laikoni

@Laikoni 감사합니다, 훌륭합니다!
Leo


3

펄 5 , 36 바이트

35 바이트의 코드 + -p플래그

s/(\D)(.{0,9})\K\1/length$2/e&&redo

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

몇 가지 설명 :
목표는 10 자 미만의 문자 ( )와 같은 문자 ( ... ) 가 앞에 오는 숫자가 아닌 문자 ( \D그러나 \1정규 표현식 의 역 참조 에 해당 )를 바꾸는 것입니다 ( 그룹 길이 ( ). 그리고 캐릭터가 교체되는 동안..{0,9}(\D)\1.{0,9}length$2redo


분명히 .*숫자가 필요하지 않습니다. 교체 된 숫자 이전의 범위에있는 유효한 문자가 정상입니다.
colsw

@ConnorLSW 응, 난 그냥 도전의 업데이트를보고 내 답변을 수정 해 주셔서 감사합니다.
Dada


3

apt , 18 바이트

£¯Y w bX s r"..+"X

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

설명

£   ¯  Y w bX s r"..+"X
mXY{s0,Y w bX s r"..+"X}
                          // Implicit: U = input string
mXY{                   }  // Replace each char X and index Y in U by this function:
    s0,Y                  //   Take U.slice(0,Y), the part of U before this char.
         w bX             //   Reverse, and find the first index of X in the result.
                          //   This gives how far back this char last appeared, -1 if never.
              s           //   Convert the result to a string.
                r"..+"X   //   Replace all matches of /..+/ in the result with X.
                          //   If the index is -1 or greater than 9, this will revert to X.
                          // Implicit: output result of last expression


2

05AB1E , 20 바이트

õIv¹N£RT£©yåi®ykëy}J

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

설명

õ                     # push an empty string
 Iv                   # for each [index,char] [N,y] in input
   ¹N£                # push the first N characters of input
      R               # reverse
       T£             # take the first 10 characters of this string
         ©            # save a copy in register
          yåi         # if y is in this string
             ®yk      #   push the index of y in the string in register
                ë     # else 
                 y    #   push y
                  }   # end if
                   J  # join stack as one string


2

C (tcc) , 113 바이트

이 함수는 입력 문자열의 사본을 작성하므로 입력의 최대 크기는 98 자입니다 (가장 긴 테스트 입력에 맞을 수있을만큼). 물론 다른 값으로 변경할 수 있습니다.

i,j;f(char*s){char n[99];strcpy(n,s);for(i=1;s[i];i++)for(j=i-1;j>-1&&i-j<11;j--)if(n[i]==n[j])s[i]=47+i-j;j=-1;}

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

편집하다

-15 바이트 Johan du Toit 에게 감사드립니다 .


아! 입력을 98 자로 제한하고 바이트를 저장하십시오!
pipe

좋은 해결책이지만 15 바이트를 더 절약 할 수 있습니다. i,j;f(char*s){char n[99];strcpy(n,s);for(i=1;s[i];i++)for(j=i-1;j>-1&&i-j<11;j--)if(n[i]==n[j])s[i]=47+i-j,j=-1;}
Johan du Toit

@JohanduToit 감사합니다! 질문이 하나 있습니다. s [i]는 for 루프의 조건으로 정확히 어떻게 작동합니까? 이 웹 사이트의 다른 사람들의 답변에서 여러 번 보았습니다.
Maxim Mikhaylov 2016

@Max Lawnboy. 원래는 's [i]! ='\ 0 '의 약자 인's [i] ^ '\ 0' '입니다. '\ 0'문자 리터럴은 0과 같으므로 다음과 같이 쓸 수 있습니다 : 's [i]! = 0'. C의 if 문은 값이 0인지 또는 0이 아닌지 여부 만 테스트하므로 '! = 0'은 필요하지 않습니다.
Johan du Toit


2

자바 7 102 101 바이트

void a(char[]a){for(int b=a.length,c;--b>0;)for(c=b;c-->0&c+11>b;)if(a[c]==a[b])a[b]=(char)(b-c+47);}

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

Kevin Cruijssen 덕분에 -1 바이트 . 나는 항상 간다 연산자를 사용하는 변명을 즐깁니다.


--c>=0? c-->0바이트를 저장하기 위해 이를 대체 할 수 있습니다 .
Kevin Cruijssen

@KevinCruijssen 나는 어떻게 든 내 머리에 그것을 가지고 있었다면 그렇지 않으면 실제 계산이 잘못 될 것입니다 ... 좋은 캐치!
Poke

1

MATL, 31 30 바이트

&=R"X@@f-t10<)l_)t?qV}xGX@)]&h

MATL Online 에서 사용해보십시오 !

설명

        % Implicitly grab input as a string
&=      % Perform element-wise comparison with automatic broadcasting.
R       % Take the upper-triangular part of the matrix and set everything else to zero
"       % For each column in this matrix
X@      % Push the index of the row to the stack
@f      % Find the indices of the 1's in the row. The indices are always sorted in
        % increasing order
-       % Subtract the index of the row. This result in an array that is [..., 0] where
        % there is always a 0 because each letter is equal to itself and then the ...
        % indicates the index distances to the same letters
t10<)   % Discard the index differences that are > 9
l_)     % Grab the next to last index which is going to be the smallest value. If the index
        % array only contains [0], then modular indexing will grab that zero
t?      % See if this is non-zero...
  qV    % Subtract 1 and convert to a string
}       % If there were no previous matching values
  x     % Delete the item from the stack
  GX@)  % Push the current character
]       % End of if statement
&h      % Horizontally concatenate the entire stack
        % Implicit end of for loop and implicit display

당신은 약간 떨어져있을 수 있지만 슈퍼 는 어디에 있는지 말할 수 없습니다. 대신 입력이 this is a test산출 this 222a1te52됩니다 this 222a19e52. 두 번째 t는로 변환되지 않습니다 9.
엔지니어 토스트

@EngineerToast Haha 감사합니다. 내가 볼게
Suever April

1

PHP, 104 바이트

앞으로 솔루션

for($i=0;$i<strlen($a=&$argn);$f[$l]=$i++)$a[$i]=is_int($f[$l=$a[$i]])&($c=$i-$f[$l]-1)<10?$c:$l;echo$a;

이전 솔루션

온라인 버전

PHP, 111 바이트

for(;++$i<$l=strlen($a=&$argn);)!is_int($t=strrpos($argn,$a[-$i],-$i-1))?:($p=$l-$i-$t-1)>9?:$a[-$i]=$p;echo$a;

PHP, 112 바이트

for(;++$i<$l=strlen($a=&$argn);)if(false!==$t=strrpos($argn,$a[-$i],-$i-1))($p=$l-$i-$t-1)>9?:$a[-$i]=$p;echo$a;

온라인 버전


1

REXX, 124125 바이트

a=arg(1)
b=a
do n=1 to length(a)
  m=n-1
  c=substr(a,n,1)
  s=lastpos(c,left(a,m))
  if s>0&m-s<=9 then b=overlay(m-s,b,n)
  end
say b

당신은 약간 떨어져있을 수 있습니다. REXX를 모르지만 오류가 또는 줄 s<9대신 7 줄에 있다고 가정합니다 . 대신 입력이 산출 됩니다 . 두 번째 는로 변환되지 않습니다 . 온라인 시도s<10s<=9this is a testthis 222a1te52this 222a19e52t9
엔지니어 토스트

고맙습니다. 1 바이트를 깎는 어리석은 시도였습니다. 코드가 수정되었습니다.
idrougge

1

C (gcc) , 117103 바이트

i,j;f(char*s){for(i=strlen(s)-1;s[i];i--)for(j=i-1;s[j]&&i-j<11;j--)if(s[i]==s[j]){s[i]=47+i-j;break;}}

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

string.h 가져 오기가없는 103 바이트는 경고없이 작동합니다. 이것이 규칙에 위배되는 경우 당겨 드리겠습니다

예쁜 코드 :

i,j;
f(char *s) {
    // Chomp backwards down the string
    for(i=strlen(s)-1; s[i]; i--)
        // for every char, try to match the previous 10
        for(j=i-1; s[j] && i-j < 11; j--)
            // If there's a match, encode it ('0' + (i-j))
            if (s[i] == s[j]) {
                s[i] = 47+i-j;
                break;
            }
}

편집 :

  • 묵시적 i, j 선언을 허용하도록 LLVM에서 gcc로 변경되었으며 lib 가져 오기가 제거되었습니다.
  • 규정 준수를위한 기능 래퍼 추가

(i=strlen(s);s[--i];)대신 제안(i=strlen(s)-1;s[i];i--)
ceilingcat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.