중요한 공백 : 강도


18

이것은 경찰과 강도 도전의 일부입니다. 경찰 부분은 여기 로가

이 과제의 목적을 위해, 우리는 정의 할 것이다 공백 으로 줄 바꿈 (0x0A)과 공간 (가 0x20). 대부분의 언어와 정규 표현식은 ASCII 문자의 내부와 외부에서 많은 다른 문자를 공백으로 간주하므로 해당 내장 기능을 사용하지 못할 수 있습니다.

강도의 도전

경찰의 대답은 공백을 코드에 삽입하여 입력 문자열에서 공백을 제거하는 작업을 수행하는 유효한 프로그램이나 함수 (선택한 언어로)로 변환하여 해독 할 수 있습니다. 예를 들어 다음과 같은 입력을받은 경우 :

H e l l o,
 W o r l  d!

프로그램은 출력해야합니다

Hello,World!

공백을 삽입 한 후 솔루션의 바이트 수는 경찰의 답변에 명시된 바이트 수를 초과하지 않아야합니다. 위의 제약 조건에 의해 유효한 한 경찰이 의도 한 것과 정확히 동일한 솔루션을 찾을 필요는 없습니다.

이를 관리하는 경우 솔루션과 함께 답변을 게시하고 경찰의 답변에 연결하고 경찰의 답변에 대한 답변을 귀하의 답변과 다시 연결하십시오.

가장 많은 경찰 답변을 해독하는 강도가 승리합니다. 동점은 금이 간 경찰 답변의 크기의 합으로 나뉩니다 (더 긴 제출을 금하는 강도에 유리함).

각 경찰 답변은 한 번만 금이 갈 수 있으며 물론 자신의 답변을 해독 할 수는 없습니다. 경찰의 답변이 크래킹 전후에 유효하지 않은 것으로 밝혀지면 강도 점수에 포함되지 않습니다.

답변:


8

Laikoni의 Haskell, 100 바이트

main=interact$id doid lines id words 
doid oi d o id=do
 iddoid<-do oi id
 oid<-do o iddoid
 do d oid


7

JavaScript ES6, Arnauld의 199 바이트

s=>eval(atob`ISYgJiAtOkI8Qk97BRBeaxZFShoUZSsiOGkMenNy`.replace(/./g,(c,i)=>String.fromCharCode(c.charCodeAt()^(k+="     S    e c  r   e t     C    o   d  e   ".split(/\w/)[i%11].length)),k=0)).join``

나는 분할 "SecretCode"이 내가 33이라고 합한 11 개의 숫자를 찾고 있다는 것을 깨달았다 . 이것은 공간의 수가 별이고 글자가 막대 인 별과 막대 문제 "SecretCode"이다. 나는 수학을 시도하여 얼마나 많은 조합이 시도되었는지 (1,917,334,783 조합) 하루 종일 그것을 강제로하기로 결정했습니다.

거기에 대해 갈 수있는 현명한 방법은 인스턴스 알아 줘서, 아마 k이어야 33하고 66각각의 인덱스 10와 21,하지만 난 게으른 해요.


이봐, 잘 했어! ;-)
Arnauld

2
$/**/=/[ \n]/;s['sp'+'lit']($)... 아, 더럽다.
Patrick Roberts

누군가가 나의 무차별 대입 시도에 대해 궁금한 경우 pastebin.com/aN9Z1jVM
Patrick Roberts

6

C, 475 바이트 by rexroni

#include<unistd.h>
#define a char
#define b *
#define c write
#define d stdin
#define e stdout
#define f read
#define g (
#define h )
#define i while
#define j if
#define k 0
#define l &
#define m ,
#define n =
#define o ;
#define p 1
#define gpml ml h
#define abo
#define ml d m p
#define jg d o abo
#define lb abo d
#define gf h abo c
#define jgm b e n
#define pml f g
#define gpm lb
int main(){a jg a jgm l jg i g pml k m l gpml h j g d!=' '&&gpm!='\n'gf g p m l gpml o}

이 정의 중 일부를 사용하기 시작할 수 있습니다. :)

전 처리기 후 코드는 다음과 같습니다.

int main(){
    char stdin;
    char *stdout = &stdin;
    while(read(0, &stdin, 1))
        if(stdin !='' && stdin!='\n')
            write(1, &stdin, 1);
}   

와! 잘 했어. 나는 결국 그것을 읽는 데 어려움을 겪고 있었고 그것을 썼습니다.
rexroni

@rexroni #defineabo가 잠시 동안 나를 버렸습니다. 처음에는 #define ab o추가 기능을 추가 해야한다고 생각 ;했지만 결국에는 효과가 없었습니다.
Riley

그렇습니다, 그것은 그것을 더 어렵게 만들기 위해 특별히 선택되었습니다 :)
rexroni

5

루비, 86 바이트 + 1 플래그 = 87 histocrat

eval"( T $ }{(! // ; : 67 8 ? 32. && )".gsub(/ |(.)/){$1&&$&.ord.^($'.count(' ')).chr}

이것은 정말로 재미있었습니다. 전달 된 문자열의 각 문자는 문자열 에 남아있는 공백의 수 eval와 비교하여 문자 코드 ( ord) 로 대체됩니다 ^(...). 결과 코드는 다음과 같습니다.

$_.tr!(''<<32<<10,'')

4

Ataco의 RprogN

이 트릭을 수행하는 것 같습니다

' ' ` R
"
" ` R

나는 실수로 그것을 헥타르하는 동안 실수로 골프를 쳤습니다. 14 바이트까지
Alfie Goodacre

네가 어떻게 골프를했는지 궁금하다.
ATaco

@ATaco 프로그램은 14 바이트입니다. 후행 줄 바꿈이나 그 밖의 것을 세었습니까?
Martin Ender


@ATaco 내가 잘못했다, 내가 할 수없는 차례로 내가 그것을 작동했지만, 난이 LF 문자를 제거했다 생각하는 원인이 온라인 컴파일러에 테스트 뉴 라인,
알피 Goodacre 씨

4

DJMcMayhem의 V, 37 바이트

O     VrS200@"kIi|D@"A üî|D@"

인쇄 할 수없는 항목 :

O     <esc>Vr<C-a>S200<esc>@"kIi<C-v><C-v><esc>|D@"<esc>A üî<esc>|D@"

TryItOnline

ü정말 모두에게 그것을 기대 보관하고, 루프를 위해 저를 던졌다 î명령 할 수 있습니다.

O                 # Insert 5 spaces above this line
Vr<C-a>           # Change them all to <C-a>
S200<esc>         # Replace the line with 200
@"                # Play back the 5 <C-a>'s, 200 -> 205
k                 # ????
Ii<C-v><C-v><esc> # insert "i<C-v>" so our line is now "i<C-v>205"
|D@"<esc>         # Delete the line and then run it, which inserts "Í" (ASCII 205)
A üî<esc>         # Append " üî" so our line is "Í üî"
|D@"              # Delete the line and run it

Í üîin V :%s/ \|\n//g는 vim으로 변환되어 모든 공백을 전체적으로 제거합니다. Í명령은 위키에, 그리고 ü하고 î있습니다 |n높은 비트 세트와 각각


잘 했어! 그것이 내가 가진 정확한 해결책입니다. :)
DJMcMayhem

3

C, betseg에 의한 140 바이트

#include<stdio.h>
int main(){int a=getchar();while(a!=EOF){//\a=getchar();
if(a!=10&&a!=32)//\\putchar(a^10^32);
putchar(a);a=getchar();}}

(나는 또한 이것을 올바르게하고 있기를 바랍니다.)


1 분만 닌자!
Kritixi Lithos

@KritixiLithos 같은,이 anwer가 나타 났을 때 제출하려고 했어요 ^^
Denker

3

Luis Mendo의 MATL, 22 바이트

왜 그런지 모르겠지만 작동하는 것 같습니다.

t' @ * 'dm1e5%M
dw%Y
(

내가하고있는 일을 해결할 수 있는지 확인해야합니다. 주석에 줄 바꿈이 있어야한다고 생각한 다음 올바른 위치에 공백을 가져 오는 것이 문제였습니다.


니스, +1 나는 내 대답에 부분 설명을 추가했다 :)
Stewie Griffin

1
@StewieGriffin, 설명 주셔서 감사합니다. 나는 왜 그것이 효과가 있었는지 일하려고 노력했지만 천천히 진행되었습니다. 매우 포괄적 인 문서 Luis :)
MickyT

1
@MickyT 당신은 자바와 같은 장황함을 의미합니다 :-P 멋진 크래킹 작업!
Luis Mendo

3

MATL, Luis Mendo의 22 21 바이트

마지막으로 ... 설명을 작성하는 동안 MickyT가 해독했습니다. 그래서 그의 대답은 "유효한"것입니다. 이 메타 게시물 에 따라 어쨌든 이것을 게시했습니다 .


MY불필요한 및 주석 있습니다. 5 개가 아닌 4 개의 공백 문자를 추가하면 충분합니다.

t' @ *'dm1e5%M
dw%Y
(

이것은 더 컴팩트 한 것과 같습니다 .

t' @ *'dm7dw(

부분 설명 :

         % Implicit input
t        % Duplicate input
' @ *'   % String with ASCII-values [32   64   32   42]
d        % diff, giving [32  -32   10], 32 is space, 10 is newline
m        % ismember, checking if the character is 32 or 10
1e5      % 10000, but could just as well be 7
d        % Taking the diff of the scalar 1e5, returning an empty matrix []
w        % Swap stack in order to use ( below
(        % Equivalent to x(y)=[], where x is the input string, and y is the logical
         % vector found using ismember (m)
         % Implicit output

좋은 크래킹 작업!
Luis Mendo

2
감사합니다 :) 시작하기 전에 MATL에 대해 전혀 알지 못했습니다 ... 내 설명이 완전히 정확하지는 않습니다 (그러나 상당히 비슷해야합니까?). 그것은 이후, 나에게 오랜 시간이 걸렸 1e5중 하나를 인쇄 100000, 또는 1e를 호출했다 reshape, 그러나 무엇 이었습니까 5? (이제 %라인이 끝났으므로 5M5와 1이 아니라는 것을 알 수 있습니다 M. 또한 Y(한 라인 에 있어야한다고 생각했습니다 . 모두 아주 멋진 MATL 튜토리얼 :)
Stewie Griffin

설명은 완전히 정확합니다 :-) 예, 언어로 시작하는 좋은 (약간 어려운 경우) 방법
Luis Mendo

2

Befunge-98, ninjalj에 의해 65 바이트

~v       >#@
 >::':'0--\'[';--!8v1+!
*1+j  !j,v         >#@

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

이것은 많은 재미이었다. 방향 변경 명령이 거의 없기 때문에 추론했습니다.^<[]?x 유사 때문에 래핑을 사용해야 . 그런 다음에 적합한 간격을 얻는 데 도움이되는 Python 스크립트를 작성했습니다 j.

이 코드는 입력을 받고 ( ~) 두 번 복제하여 ( ::) 작동합니다. 그런 다음 10 ( ':'0또는 ord(':') - ord('0'))과 32 ('['; 또는 ord('[') - ord(';')) . 그런 다음 두 번째 결과는 논리적으로 부정되고 (공간이 있으면 1, 그렇지 않으면 0) 8이 푸시됩니다.

이제 건너 뛰어야 할 부분을 파악해야하는 부분이 생겼습니다. 은 1+!다음 행으로 계속하여 건너 뜁니다.#를 건너 뜁니다 @. 논리적으로 부정 된 결과 (0 또는 1)에 8을 곱한 후 1이 추가됩니다.

그런 다음 코드는 IP가 이동함에 따라 많은 (즉, 1 또는 9) 공백과 1 개의 공백을 더합니다. 문자가 공백이 아닌 경우는로 끝납니다 !. 문자 코드에서 10을 빼면 논리적으로 무효화됩니다 (줄 바꿈이면 1, 그렇지 않으면 0).j그런 다음 아무것도 건너 뛰지 않고 인쇄 ( ,)가 호출되고 세로로 줄 바꿈하여 루프가 다시 시작됩니다.

문자가 공백 인 경우 맨 아래 줄 32, 22이 스택 맨 아래로 다시 반복됩니다 . 첫 번째는 j705 칸 점프합니다. 그런 다음 선이 세 번 반복됩니다. 스택에 두 개 이상의 10이 남아 있으면 (코드 만 남음) 첫 번째는 j100 칸 점프하고 루프가 반복됩니다. 그렇지 않으면 첫 번째는로 j건너 !뛰고 0은 무시되고 두 번째 j는 인쇄 위로 건너 뛰고 프로그램은 계속 진행됩니다.

나는 59 바이트로 골프를 쳤다.


헤더에있는 경찰 수를 나열하는 것은 좋습니다 (타이 브레이커가 더 큰 크기를 보상하기 때문에).
Martin Ender

2

우유로 C # 6, 201 바이트

using System.Linq;
_=>string./**/
#if trueJoin
(/*"*//*/""/**//*/"*/",
#else
Concat(//*/,
#endif
from m in" "let p=$@"{@" 
"[1]}"from i in(_.Replace(p,@""))where!new[]{p[0]^32^10}.Contains(i)select@i);

repl.it 데모

trueJoin정의되지 않았으므로 string.Concat()남아 있습니다.
p입니다 "\n". p[0]^32^10공간입니다. 그것이 p[0]^42또는 다른 유사한 상수 라면 더 어려웠을 것 입니다.


우유에 대한 의견에 따르면 C # 6 이상이 필요합니다.
TheLethalCoder

2

Conor O'Brien의 망상, 43 바이트

ISBqv<>>$$4j
E :d/v$v?
c+91d/ v?E
;!?l$/o $

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

문서를 찾기에는 너무 어리 석고 일부 명령의 작동 방식을 추측해야하기 때문에 이전보다 더 어려웠습니다. 따라서이 설명 중 일부는 완전히 정확하지는 않지만 코드에 대한 기본적인 이해였습니다.

I               Push all the input on to the stack as a string
 S              Convert it into a character array.
  B             Turns that array into individual characters on the stack.
   q            Reverse the stack so the first letter is on top.
    v           Move down... 
    /           ...and turn left.
E :d            Duplicate the value and test if equal to space.

       v?       If it is a space we move down until we wrap to the top.
       >$$      Drop the test result and the space.
          4j    Jump over the next 4 commands (having wrapped to the start).
    v           Bringing us back to the first down arrow, ready to test the next char.

     v$         If it wasn't a space, drop the test result and move down.
c+91d/          Turn left and push a newline (char 10) on to the stack.
       v?E      If equal, we go down, following the same path as with the space.

     /          If not equal, turn down.
   l$/          Then turn left, drop the test result, and push the stack size.
;!?             If zero (the stack is empty) we terminate.
        o$      Otherwise wrap around, drop the stack size, and output the char. 
     /          Then turn down wrapping around to the top of the program.
    v<          Then turn left and down to start the process from the beginning again.

github 위키에 문서가 있습니다.
Conor O'Brien

좋은 생각! Wiki없이이 작업을 수행 한 것이 인상적입니다. D
Conor O'Brien

1

LethalCoder의 C #, 159 바이트

using System.Linq;s=>string.Join("",string.Join("",s.Split(@" 
".Replace(new string((char)0x0D,1),"").ToCharArray())).Select(c=>c+""!=""?c+"":"").ToArray());

반복

1 행의 끝에있는 문자열은 " \n"(space + newline)입니다.

/*Func<string, string> Lambda =*/ s =>
    string.Join("",                                                           // No-op
    string.Join("",                                                           // Join (without whitespace)
        s.Split(@" \n".Replace(new string((char)0x0D,1),"").ToCharArray())    // Split on whitespace
    ).Select(c=>c+""!=""?c+"":"").ToArray());                                 // No-op

1

Kritixi Lithos의 Minkolang v0.15, 88 바이트

$oI[dd" "=$r'10'=1J,? 1R]r$O3.14
$$$
Cdollars             >
$$$
Ceverywhere           >x

설명

                               # Layer 1
$o                             # input chars onto stack
  I                            # stack length pushed to stack
   [                    ]      # loop popped TOS times (length of string)
    dd                         # duplicate, duplicate
      " "                      # push space to stack
         =                     # equality check
          $r                   # swap
            '10'               # number 10 to stack (LF char)
                =              # equality
                 1J            # or
                   ,           # not
                    ?          # if true jump next
                               # drop to layer 2
                      1R       # rotates the stack 1 time
                         r     # reverse the stack
                          $O   # output the stack
                             . # stop
$$$                            # Layer 2
                     >         # shift right and then drop to layer 3
$$$                            # Layer 3
                      >x       # shift right, pop char off stack and drop to Layer 1 (end loop)

크래킹이 잘되었습니다! 나는 Comments가 혼란 스러울 것으로 기대 했지만 그럼에도 불구하고 좋은 일입니다!
Kritixi Lithos

@KritixiLithos 일단 레이어를 분할하고 대부분의 작업이 최상위 레이어에서 완료되었음을 알면 솔직 해졌습니다. 나는 :) 감사합니다, 그래서이 일을 언어에 대해 조금 배웠다
MickyT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.