스스로 반복 해


64

출력하는 프로그램 작성

Do not repeat yourself!

프로그램 코드는 다음 제약 조건을 준수해야합니다.

  • 길이는 짝수 여야합니다
  • 위치에있는 각 문자 2n( n정수> 0)는 위치에있는 문자와 같아야합니다 2n-1. 프로그램의 두 번째 문자는 첫 번째 문자와 같고 네 번째 문자는 세 번째 문자와 같습니다.

줄 바꿈은 문자로 계산됩니다!

이것은 코드 골프이므로 가장 짧은 코드가 승리합니다!

HHeellllooWWoorrlldd 유효한 프로그램입니다

123AAABBB또는 HHeello잘못

확인

당신이 사용할 수있는 이 CJam 스크립트를 소스 코드가 유효한지 확인합니다. 간단히 "입력"상자에 코드를 붙여 넣고 스크립트를 실행하십시오.


51
재미있는 사실은 : 문제가 아니라 세 쌍둥이를했다 경우 DDDooo nnnooottt rrreeepppeeeaaattt yyyooouuurrrssseeelllfff!!!에 유효한 해답이 될 것입니다 트리거
SP3000

14
나는 이것이 너무 제한적이라고 생각했지만 대답의 혼란은 나에게 틀렸다. 좋은 질문!
trichoplax

Haskell에서 이러한 요구 사항을 충족하려면 꽤 진지한 노력이 필요합니다. 모든 바인딩 형식, 모든 형식의 조건식, 문자 및 문자열을 입력하는 모든 방법 및 출력을 생성하는 모든 방법이 제거됩니다.
dfeuer

1
누군가 점수 스 니펫을 추가 할 수 있습니까? 나는 그것들을 갖는 것을 좋아하며 모든 질문이 그들에게 있기를 바랍니다.
mbomb007

모든 현재 답변은 난해한 언어입니다. 이것이 정상적인 언어로 가능한지 궁금합니다.
DankMemes

답변:


51

Hexagony , 166 (126) 124 바이트

\\;;;;33rr''22DD..));;;;;;oo;;}}eeoo\\@@nn;;;;ee;;;;aass&&;;uuoo;;;;..\\\\;;ttee..pp;;tt;;;;..rr;;''ll..'';;;;..;;}}ff..}}yy

암시 적 no-ops 및 공백을 삽입하면 다음 소스 코드에 해당합니다.

       \ \ ; ; ; ; 3
      3 r r ' ' 2 2 D
     D . . ) ) ; ; ; ;
    ; ; o o ; ; } } e e
   o o \ \ @ @ n n ; ; ;
  ; e e ; ; ; ; a a s s &
 & ; ; u u o o ; ; ; ; . .
  \ \ \ \ ; ; t t e e . .
   p p ; ; t t ; ; ; ; .
    . r r ; ; ' ' l l .
     . ' ' ; ; ; ; . .
      ; ; } } f f . .
       } } y y . . .

나는 이것을 더 짧게 할 수 있고 아마도 길이 6으로 해결할 수도 있다고 확신하지만 까다로워지고 있습니다 ...

작동 원리

여기에 이미지 설명을 입력하십시오

Timwi의 Hexagony Colorer로 생성 된 다이어그램 .

코드는 완전히 선형입니다. \시작의 권리는 우리가 전혀 배가 문자에 대해 걱정할 필요가 없습니다 있도록, 대각선으로 IP를 리디렉션합니다. 색상이 지정된 경로는 주황색 / 빨간색, 파란색 / 회색, 녹색, 자주색 순서로 실행됩니다 (동일한 색상의 경로가 두 개있는 경우 왼쪽 경로가 먼저 실행되고 오른쪽 경로로 줄 바꿈).

다른 사람들이 무시한 no-ops, 미러 및 명령을 무시하면 선형 코드는 다음과 같습니다.

D;o;&32;}n;o;t;';}r;e;p;e;a;t;';}y;o;u;r;s;e;l;f;');@

Hexagony의 문자는 현재 메모리 가장자리의 값을 문자의 문자 코드로 설정합니다. ;현재 메모리 에지를 문자로 인쇄합니다. 로 &메모리 가장자리를 재설정하고 0로 공간을 인쇄하는 데 사용 32;합니다. 다른 공간으로 }이동하여 32추가 공간을 기억할 수 있습니다. 나머지 코드는 새 가장자리에 문자를 인쇄하고 때로는 ';}공백을 인쇄하기 위해 앞뒤로 이동 합니다. 마지막으로으로 다시 공간 가장자리로 이동 '하고을 사용하여 값을 33으로 )늘리고 느낌표를 인쇄하십시오. @프로그램을 종료합니다.


4
정말 인상적입니다 !!!
WizardOfMenlo

크기 6 또는 5 가 가능하다는 결론에 어떻게 도달 했 습니까? 크기 7은 거의 적합하지 않다고 생각합니다.
Timwi

@Timwi 5는 약간 애매 모호했지만, single을 제외하고는 ;아직 코드에서 문자 쌍 사이에 재사용이 전혀 없습니다. 현재 코드는 내 생각에 가장 먼저 도달 한 것이므로 충분히 열심히 시도하면 세미콜론과 일부 문자를 재사용하는 훨씬 더 복잡한 솔루션을 찾을 수 있어야한다고 생각합니다. 변의 길이 6에
마틴 청산

크기 6을 얻으려면 크기 7과 비교하여 36자를 저장해야합니다. 현재 사용하지 않는 6 개의 슬롯을 사용하더라도 여전히 30을 저장해야합니다. ;한 번만 재사용 할 수 있습니다. 가로로 가로 질러 이동할 수 없습니다. ;코드에는 23 초만 있고 6 문자 반복 (2xo, 1xt, 1xr, 2xe) 만 29를 제공합니다. 개인적으로 이것은 크기 6이 불가능하다는 것을 확신합니다. .
Timwi

44

GolfScript, 130 84 76 바이트

22..!!..00)){{DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff}}``%%>><<[[33]]++

Web GolfScript 에서 온라인으로 사용해보십시오 .

작동 원리

GolfScript 인터프리터는 빈 문자열을 스택에 배치하여 시작합니다.

22 # Push 22.
.. # Push two copies.
!! # Negate the last copy twice. Pushes 1.
.. # Push two copies.
00 # Push 0.
)) # Increment twice. Pushes 2.

   # STACK: "" 22 22 1 1 1 2

{{DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff}}

`` # Push a string representation of the string representation of the block.

   # This pushes "{{DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff}}" (with quotes).

%% # Take every second element of that string, then every element of the result.
>> # Discard the first element of the result. Repeat.
<< # Truncate the result to length 22. Repeat.
[[ # Begin a two-dimensional array.
33 # Push 33, the character code of '!'.
]] # End the two-dimensional array.
++ # Concatenate the empty string, the 22-character string and the array [[33]].

문자열이있는 배열을 병합하면 결과가 원하는 출력이됩니다.


38

단항 , ~ 1.86 × 10 222

간단한 brainfuck-> 단항 답변. 매우 차선책;).

이 프로그램은 짝수의 0으로 구성됩니다. 구체적으로 :

1859184544332157890058930014286871430407663071311497107104094967305277041316183368068453689248902193437218996388375178680482526116349347828767066983174362041491257725282304432256118059236484741485455046352611468332836658716

그들의.

오리지널 brainfuck 코드 :

++++[++++>---<]>+.[--->+<]>+++.[--->+<]>-----.+[----->+<]>+.+.+++++.[---->+<]>+++.---[----->++<]>.-------------.+++++++++++.-----------.----.--[--->+<]>-.[---->+<]>+++.--[->++++<]>+.----------.++++++.---.+.++++[->+++<]>.+++++++.------.[--->+<]>-.

3
제공 한 코드 블록 중 어느 것도 이중 규칙을 충족하지 않습니다. 내가 무엇을 놓치고 있습니까?
doppelgreener

26
@doppelgreener : "code"의 첫 번째 블록은 단순히 큰 숫자입니다. 특히, 1요청 된 문자열을 출력하는 단항 프로그램 의 의 수입니다 . 두 번째 코드 블록은이를 생성하는 데 사용 된 BF 프로그램입니다. 단항 프로그램은 완전하게 만들어 1졌으므로 반복 요구 사항을 거의 충족시킵니다.
El'endia Starman

8
또한 0의 수는 (행운?) 짝수입니다 :-)
Arnaud

1
나는 숫자가 코드 인 것처럼 보이지 않도록 답을 편집 할 자유를 얻었습니다.
Timwi

2
@Kametrixom Unary 프로그램에 대한 Golunar 설명입니다. 작성된 Golunar 프로그램이 조건을 충족하지 않습니다.
Paŭlo Ebermann

34

루비 - 2,100 1,428 1,032 820 670 바이트

이것은 출력이 함수의 반환 값이 될 수 있다고 가정합니다 (출력이 STDOUT이되어야한다고 지정되지 않았습니다)

암호:

((((((((((((((((((((((((((((((((((((((((((((((""<<66++11**00++11**00))<<99++11++11**00))<<((55>>11**00))++((11>>11**00))))<<99++11))<<99++11++11**00))<<99++((33>>11**00))++11**00))<<((55>>11**00))++((11>>11**00))))<<99++11++((11**00<<11**00<<11**00))))<<99++11**00++11**00))<<99++11++11**00++11**00))<<99++11**00++11**00))<<88++((11>>11**00))++((11**00<<11**00<<11**00))))<<99++((33>>11**00))++11**00))<<((55>>11**00))++((11>>11**00))))<<99++22))<<99++11++11**00))<<99++((33>>11**00))++11**00++11**00))<<99++11++((11**00<<11**00<<11**00))))<<99++((33>>11**00))))<<99++11**00++11**00))<<99++((11>>11**00))++((11**00<<11**00<<11**00))))<<99++11**00++11**00++11**00))<<33))

트릭은 ""추가 작업 <<과 문자의 ASCII 코드를 사용하여 빈 문자열에서 문자열을 작성하는 것 입니다.

ASCII 코드의 숫자를 얻으려면 숫자를 쉽게 생성 할 수있는 값으로 분해하려고합니다. 예를 들어 ASCII 90는 just 88+1+1입니다.

  • 88 괜찮습니다.
  • 11**00입니다 11^0. 간단히 말해서1

다행히 모두 ++--의미 add루비에, 그래서 내가 쓸 수 9088++11**00++11**00

1을 추가하는 것보다 쉽게 ​​숫자를 얻는 몇 가지 트릭이 있습니다. 위의 코드를 생성하는 데 사용하는 코드는 다음과 같습니다 (사용중인 모든 매핑 포함).

d = "Do not repeat yourself!"

d.each_char do |c|
  print "(("
end

print '""'

VALUES = [
  [0,'00'],
  [1,'11**00'],
  [4,'((11**00<<11**00<<11**00))'],
  [5,'((11>>11**00))'],
  [11,'11'],
  [16,'((33>>11**00))'],
  [22,'22'],
  [27,'((55>>11**00))'],
  [33,'33'],
  [38,'((77>>11**00))'],
  [44,'44'],
  [49,'((99>>11**00))'],
  [55,'55'],
  [66,'66'],
  [77,'77'],
  [88,'88'],
  [99,'99']
].reverse

d.each_char do |c|
  print "<<"
  num = c.ord
  while num != 0
    convert = VALUES.find{|val|val.first<=num}
    print convert.last
    num -= convert.first
    print "++" unless num == 0
  end
  print "))"
end

나는 여전히 숫자를 얻는 데 필요한 문자를 줄이는 다른 트릭에 대해 생각하고 있습니다.

-rpp플래그 를 사용 pp하고 코드의 시작 부분에 다음과 같이 추가하십시오 .

pp((((((((((((((((((((((((((((((((((((((((((((((""<<66++11**00++11**00))<<99++11++11**00))<<((55>>11**00))++((11>>11**00))))<<99++11))<<99++11++11**00))<<99++((33>>11**00))++11**00))<<((55>>11**00))++((11>>11**00))))<<99++11++((11**00<<11**00<<11**00))))<<99++11**00++11**00))<<99++11++11**00++11**00))<<99++11**00++11**00))<<88++((11>>11**00))++((11**00<<11**00<<11**00))))<<99++((33>>11**00))++11**00))<<((55>>11**00))++((11>>11**00))))<<99++22))<<99++11++11**00))<<99++((33>>11**00))++11**00++11**00))<<99++11++((11**00<<11**00<<11**00))))<<99++((33>>11**00))))<<99++11**00++11**00))<<99++((11>>11**00))++((11**00<<11**00<<11**00))))<<99++11**00++11**00++11**00))<<33))

그런 다음 여분의 2 + 4 바이트의 경우 완전히 완전한 프로그램으로 작동 할 수 있지만 "필요한 문자열 앞뒤에 여분의 것을 인쇄 합니다.

예:

$ ruby -rpp golf.rb
"Do not repeat yourself!"

이것이 왜 완전하게 호환되지 않는지 명확히 할 수 있습니까? 그것은 나에게 완벽하게 보이고 pp보석 조차도 이중 문자입니다.
trichoplax

3
@trichoplax :이 게시물에 있어요 : 1. 추가 "출력 문자와 2.의 필요 -rpp(처럼되지 않습니다 플래그 --rrpp)
SztupY

1
이 답변은 훌륭하지만 사양을 충족하지 않는 답변은 삭제 될 수 있습니다.
위트 마법사

1
@SztupY 명확하게하기 위해, 도전 규칙을 따르지 않는 응답을 삭제하는 것이 사이트 정책입니다.
Mike Bufardeci


23

> <> 174 바이트

vv

77

99

**

00

77

bb

**

pp

""

!!

ff

ll

ee

ss

rr

uu

oo

yy



tt

aa

ee

pp

ee

rr



tt

oo

nn



oo

DD

""

~~

oo

ll

11

==

;;

00

66

bb

**

..

고맙게도 어떤 의미에서는 제한이 수직으로 적용되지 않습니다. 그러나 가장 큰 문제는 모든 줄 바꿈을 두 배로 늘려야한다는 것입니다.

대략적으로 실행되는 코드는 다음과 같습니다.

v            Redirect instruction pointer to move downwards
79*07b*p     Place a ? on row 77 before the first ;
"..."        Push "Do not repeat yourself!" backwards, riffled between spaces

[main loop]
~o           Pop a space and output a char
l1=?;        If there is only the final space left, halt
06b*.        Jump back to the start of the loop

프로그램은 이중 공백이 없습니다. 문자열 모드 인 경우> <>는 빈 셀의 공백을 푸시합니다. 반대로, 이것은 g(소스 코드에서 단일 셀 읽기)를 사용하는 솔루션 이 더 까다로울 수 있음을 의미합니다. 프로그램에서 어떤 공간이 읽힐 때 NUL이되기 때문입니다.

(참고 : error로 끝나는 경우 50 바이트가 짧을 수 있지만 이런 식으로 좋아합니다.)


1
그 일을위한 올바른 도구 ...
Outgolfer Erik

20

Sclipting , 186 146 바이트

끄끄 닶닶 긂긂 좋다

껢껢 鎵 鎵 ❶❶ 合 合 虛虛 替 替 標 標 現 現 併 併 一一 終 終

명확하게 말하면, 세 줄의 코드가 있으며 그 중간 줄은 비어 있습니다. 개행을 복제해야하기 때문입니다. 바이트 수는 UTF-16 인코딩을 기반으로합니다.

설명

시작시 한글 블록이 문자열을 푸시합니다 "DDDof� \"\u0002nf�of�twG \"\u0002rw'efVpw\aefVaf\u0016twG \"\u0002yw�of�uwWrw'sw7efVlf�fff!\"\u0012". 모든 세 번째 캐릭터는 우리가 원하는 캐릭터입니다. 나머지는 횡설수설입니다. 이유는 다음과 같습니다.

Sclipting에서 두 개의 한국어 문자는 3 바이트를 인코딩합니다. 따라서 각 한글은 12 비트를 효과적으로 인코딩합니다. 로 시작하는 문자열을 얻으려면 D처음 8 비트가되어야합니다 0x44. 나머지는 중요하지 않지만 모든 문자를 반복해야하기 때문에 12 ~ 20 번째 비트도됩니다 0x44. 따라서, 우리는 폼의 값을 가질 것이다 0x44n44n일부 N 세 바이트로 분해, 0x44 0xn4 0x4n.

를 들어 o0x6F, 우리는 바이트를 얻을 0x6F 0xn6 0xFn.

내가 게으른 때문에, 나는 인코딩 시작 "DDDooo nnnooottt (etc.)"하고 내가 할 이유는 이전과 다른 모든 문자, 대체 0x444444=을 "DDD"위해 D0x6F66F6= "of�"위해를 o. 그 자체로는 유효하지 않은 UTF-8 인코딩 이기 때문 0xF6입니다.

이제 프로그램으로 돌아갑니다. 나머지 프로그램은 다음과 같이 진행됩니다.

껢껢 — 줄을 밉니다 ".\"�"

鎵 鎵 — 마지막 문자를 두 번 제거하여 "."

❶❶ — 2 부. 지금 스택 :[".", ".", "."]

合 合 — 두 번 연결합니다. 지금 스택 :["..."]

이제 다음으로 하고 싶은"..." 것은 정규 표현식으로 사용하여 替 ... 終 루프 구문을 사용하여 한 번에 원래 문자열에서 세 문자를 일치시킬 수 있습니다. 그러나 모든 명령이 복제되므로 두 개의 정규 표현식 루프가 서로 중첩되어 있어야하며 스택이 실행되면 런타임 오류가 발생합니다. 따라서,

虛虛 — 빈 줄을 두 번 밉니다

그리고 다음 루프를 시작합니다. 이런 식으로 외부 루프 ""는 문자열에 대한 정규 표현식과 일치하기 때문에 한 번만 반복되므로 ""단일 일치 항목이 생성됩니다. 내부 루프는 "..."큰 문자열 과 일치 할 때마다 한 번씩 실행됩니다 . 루프의 본문은 다음과 같습니다.

標 標 — 두 개의 마크를 스택에 밀어 넣습니다. 지금 스택 :[mark mark]

現 現 — 현재 정규식 일치 사본 두 개를 누릅니다. 지금 스택 :[mark mark "DDD" "DDD"]

併 併 — 첫 번째 표시까지 연결합니다. 지금 스택 :["DDDDDD"]

一一 — 해당 문자열의 첫 번째 문자를 가져온 다음 해당 문자의 첫 번째 문자 (중복)를 가져옵니다. 스택에는 이제 원하는 캐릭터가 있습니다.

내부 루프는 여기에서 끝나므로 정규 표현식의 모든 일치 항목이 해당 일치 항목의 첫 문자로 바뀝니다. 이렇게하면 원하는 문자열이 스택에 남습니다.

그런 다음 외부 루프가 종료되고,이 시점에서 원하는 문자열이 스택 ""에서 제거되고 문자열에서 일치하는 항목만으로 ""대체되어 원하는 문자열을 다시 스택에 남겨 둡니다.


3
음 ... 여기서 코드 형식을 사용하지 않은 이유는 무엇입니까? 한자입니까?
Outgolfer Erik

@EriktheOutgolfer 나는 똑같은 것을 궁금해했다.
Kevin Cruijssen

@KevinCruijssen 저 안에 한자도 있다고 생각합니다. 실제로 spec은 한글을 데이터로, 중국어를 지침으로 사용한다고 말합니다.
Outgolfer Erik

@EriktheOutgolfer 아, 맞아요. rtfm .. :)
Kevin Cruijssen

12

미로 , 528 바이트

66))__vv          ..33::00&&__vv          ..44__99||__vv          ..33::00&&__vv            ..99))__vv            ..99))__vv      ..44__88$$__vv          ..22__99++__vv          ..22__99$$__vv            ..22__99))$$__vv      ..33__77$$__vv            ..33__vv

      ..44__99||__^^          ..11__99++__^^          ..44__88$$__^^          ..44((__88$$__^^      ..11))__99++__^^      ..99((__^^          ..33::00&&__^^          ..44__99||__^^          ..44((__88$$__^^            ..99))__^^          ..11__99$$((__^^    ..@@

xx

이중 줄 바꿈이 상처를 입었지만 적어도 이것이 가능하다는 것을 증명합니다!

각 문자는 먼저 코드 포인트를 형성 한 다음 단일 문자를 인쇄하여 하나씩 인쇄됩니다. 코드 포인트는 다음과 같이 구성됩니다.

D 68  66))
o 111 44__99||
  32  33::00&&
n 110 11__99++
t 116 44__88$$
r 114 44((__88$$
e 101 99))
p 112 11))__99++
a 97  99((
y 121 22__99++
u 117 22__99$$
s 115 22__99))$$
l 108 33__77$$
f 102 11__99$$((
! 33  33

어디

)(        Increment/decrement by 1 respectively
&|$       Bitwise AND/OR/XOR respectively
+         Add
:         Duplicate
_         Push zero
0-9       Pop n and push n*10+<digit>

Labyrinth의 숫자의 비정상적인 동작은에서 악용됩니다 33::00&&.

[33] -> [33 33] -> [33 33 33] -> [33 33 330] -> [33 33 3300] -> [33 32] -> [32]
     :          :             0              0               &          &

각 단일 문자는 메커니즘과 함께 인쇄됩니다

__vv

  ..

xx

xx(는) 5 높다고 있도록 패드 만 그리드 존재한다. 먼저 __두 개의 0을 누른 다음 그리드 회전 연산자를 누르십시오 v. 우리는 0을 팝하고 회전합니다 :

__ v
  v
   .
  .
xx

다시 한번:

__ v

  v.

xx.

그런 다음 .세 번째 행에서 오른쪽으로 이동 하여 인쇄 명령을 한 번만 실행합니다.


인쇄 명령을 한 번만 실행하는 데 사용한 트릭을 좋아합니다. 그것은 매우 영리합니다.
Timwi

11

CJam - 176 136 바이트

66))HH77++GG00++BB88++HH77++EE88++GG00++DD88++99))CC88++99))AA77++EE88++GG00++BB99++HH77++KK77++DD88++JJ77++99))AA88++II66++33]]{{cc}}//

내 프로그램 크기를 2 :-)로 나눈 Sp3000 덕분에

설명

  • 코드 HH77++,, GG00++...는 숫자를 추가하여 문자의 정수 아스키 코드를 계산합니다 (예 :`HH77 ++ '는 스택에서 17, 17 및 77을 푸시 한 다음이 3 개의 숫자를 추가합니다)
  • 끝 부분의 코드 부분은 ]]{{cc}}//ASCII 코드를 반복하여 문자로 변환합니다.

여기 사용해보십시오


1
프로그램으로 이것을 생성 했습니까? 최소한 끝이 될 수 33cc있지만 다른 방법으로는 더 좋은 방법이있을 것입니다.
Sp3000

@ Sp3000 예, ++와 다양한 조합을 시도한 프로그램을 실행했습니다. 나는 다른 운영자를 시도하지 않았습니다 ...
Arnaud

3
또 다른 메모 : cc어디에서나 대신에 ]]{{cc}}//
Sp3000

11

자체 수정 Brainf *** , 72 바이트

\x00리터럴 NUL16 진 바이트 (빈 셀) 를 나타냅니다 . 소스 코드는 테이프의 시작 셀 왼쪽에 배치됩니다.

!!fflleessrruuooyy  ttaaeeppeerr  ttoonn  ooDD\0\0<<<<<<++[[<<]]<<[[..<<]]

설명

!!fflleessrruuooyy  ttaaeeppeerr  ttoonn  ooDD  The string on the tape for easy printing
\x00\x00                                        A separator to make printing shorter
<<<<<<++                                        Change first '.' to '0' (comment)
[[<<]]<<                                        Move to separator, then left to string
[[0.<<]]                                        Print string

또한이 프로그램을 만들기 전에 소스에서 BF 문자 만 사용하여 만들었습니다. 있을 수있다! 홀수 ASCII 값의 경우 두 배의 값을 만든 다음 2로 나누기 때문에 훨씬 더 깁니다. 다소 짧은 것은 전체 소스를 수정하여 홀수 값을 생성하는 것입니다.


이 출력 DDoo nnoott rreeppeeaatt yyoouurrsseellff!!(이중 공백)이 아닙니까? 나는 두 가지를 봅니다 ..
Outgolfer Erik

@EriktheGolfer 내 답변을 읽을 시간입니다. Change first '.' to '0'. 첫 번째 .가 0으로 변경 되었음을 다시 설명하기 위해 설명을 변경했습니다.
mbomb007

7

젤리 , 66 바이트 (비경쟁)

““DDoo  nn““oott  rreepp““eeaatt  yyoouurrss““eellff!!””ṛṛḷḷWWQQ€€

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

팩 토이 드

두 번째 문자를 모두 제거해도 프로그램은 여전히 ​​작동합니다.

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

작동 원리

““DDoo  nn““oott  rreepp““eeaatt  yyoouurrss““eellff!!”

문자열 배열을 반환합니다. 리터럴은로 시작하고로 끝나며 문자열은 내부적으로로 구분됩니다 . 결과는

["", "DDoo  nn", "", "oott  rreepp", "", "eeaatt  yyoouurrss", "", "eellff!!"]

링크의 인수와 반환 값은이 문자열 배열로 설정되고 나머지 소스 코드가 실행됩니다.

<literal>”ṛṛḷḷWWQQ€€  Argument/return value: A (string array)

         ”ṛ           Yield the character 'ṛ'.
           ṛ          Select the right argument of 'ṛ' and A: A.
            ḷ         Select the left argument of A and A: A.
              W       Wrap; yield [A].
             ḷ        Select the left argument of A and [A]: A.
               W      Wrap; yield [A].
                Q     Unique; deduplicate [A]. Yields [A].
                 Q€€  Unique each each; for each string s in A, deduplicate s.

왜 경쟁이 아닌가?
justhalf

1
Jelly는 2015 년 12 월에 만들어 졌으므로이 도전 과제는 3 개월이 지났습니다.
Dennis

아차, 몰랐어요이 오래된 문제입니다
justhalf

5

감마 플렉스 , 66 바이트

\\

XX""!!fflleessrruuooyy  ttaaeeppeerr  ttoonn  ooDD""XXXXrrRREE

Gammaplex는 첫 번째 줄 바꿈의 위치를 ​​줄 길이로 사용하고 다른 모든 줄 바꿈을 무시하는 2D 언어입니다.


5

MSM , 270160 바이트

!!'',,ff'',,ll'',,ee'',,ss'',,rr'',,uu'',,oo'',,yy'',,  '',,tt'',,aa'',,ee'',,pp'',,ee'',,rr'',,  '',,tt'',,oo'',,nn'',,  '',,oo'',,DD'',,......................

내 첫 MSM 프로그램!

MSM의 문자열 출력 스택에 개별 문자를 밀고 통해 하나의 문자열로 결합하여 이루어집니다 .예를 들면,

!olleH.....

의 수는 .문자의 수보다 하나 적다. 들어 Do not repeat yourself!우리는 22 개해야합니다 .들. 운 좋게도 이것은 짝수이므로, 우리는 11의 복식을 가지고 있습니다

......................

글자를 앞에 넣으려면 더 많은 노력이 필요합니다. 패턴

cc'',,

각 캐릭터에 대한 트릭을 수행합니다 c. 다음과 같이 평가

cc'',,            push c (remember: commands are taken from the left and operate on the right)
c'',,c            push c
'',,cc            quote ' and push
,,cc'             pop
,cc               pop
c                 voilà!

22 개의 join 명령으로 시작하여 !!'',,끝나는 23 개의 패턴이 필요 DD'',,합니다 ..


5

Befunge 98, 70 66 바이트

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

내 대답이 잘못된 후에 실제로 도전에 맞는 더 나은 답변이 있습니다!

2200**xx""!!fflleessrruuooyy  ttaaeeppeerr  ttoonn  ooDD��""kk,,@@

( ��대신에 문자 0x17 사용을 제안 해 주신 Martin Ender에게 감사합니다 88ff++)

설명:

2200          Push 2, 2, 0, and 0 onto the stack
*             Multiply 0 and 0, yielding 0
*             Multiply 2 and 0, yielding 0
              The stack is now [2, 0]
x             Pop a vector off the stack and set the instruction pointer delta to that
              The instruction pointer is now skipping over every other character, since the delta is (2, 0)
"!f ... oD�" Push the string onto the stack, with the number 23 (number of characters in the string) at the top
k,            Pop characters off the stack and print them, 23 times
@             End the program


4

DC , 348 346 342 306 290 278 바이트

dnr6.short.dc줄 바꿈없이 파일 :

AAzz--22222222vvPPAAAAAAAAvvPP88vvFFFFFFFFvv00++AAzz--PP11vvFFFFFFFFvv00++AAAAAAvvPP11vvEEEEEEEEvv00++OOOO//44999999vv++PP77II++OOOO//44999999vv++PPAAAAAAvv88vvFFFFFFFFvv00++PPAAzz--BBPP11vvFFFFFFFFvv00++77OOOO++++PPOOOO//44999999vv++66vvFFFFFFFFvv00++PP99zz++OO88++PPAAAAvv33PP

운영:

$ dc < dnr6.short.dc 
Do not repeat yourself!



2

망상, 비경쟁, 62 바이트

2200**UU""DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff!!""oo;;

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

부분 설명 :

2200**
2200    the stack looks like [2 2 0 0]
    *   [2 2 0*0]
     *  [2 2*0*0]
        [2 0]

U포인터 방향을로 (2, 0), 즉 2x- 단위 및 0y- 단위 이동 으로 설정하여 다음 문자 U를 건너 뛰면서 시작하여 다른 모든 문자 를 건너 뜁니다. 그런 다음 다른 모든 문자가 기록되며 다음과 같습니다.

"Do not repeat yourself!"o;

이것은 간단한 출력 프로그램입니다.

다른

이것은 WallyWest의 JavaScript 현상금과 경쟁합니다.

이 제한에 따라 숫자를 구성 할 수는 있지만 문자열은 불가능하다는 것을 증명할 수 있습니다. 리터럴을 사용할 수 없으므로 리터럴 작성 문자를 배치하면 빈 문자열이 생성됩니다.

""
''
``

그런 다음 일부 연산자 만 사용할 수 있습니다. 사용되는 유일한 "쌍"연산자는 다음과 같습니다.

++ -- << >> ** ~~ || && !! ==

그리고 이들 중 어느 것도 숫자 / 기타를 문자열로 캐스팅 할 수 없습니다. 따라서 문자열을 출력 할 수 없습니다.


현상금은 5 일 후에 종료됩니다. @ConorOBrien, 기다리지 않아도되기를 바랍니다! 그러나 현상금은 당신입니다.
WallyWest

2

Alice , 74 바이트

aa00tt,,JJ""DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff!!//@@""ooYY;;tt


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

설명

첫 번째는 문자열을 입력 할 수 있어야하므로 첫 번째 만 건너 뛰고 싶다는 것 "입니다. 첫 번째로 점프 "하면 IP가 현재 셀을 다시보기 전에 한 셀을 이동하므로 두 번째 "가 문자열 모드로 들어가기 때문에이 작업을 수행 합니다. 그러나 거기로 뛰어 오르 10, 0려면 스택의 맨 위에 순서대로 (두 번째, 위)가 필요합니다. 이것은 다음과 aa00tt,,같이 수행됩니다 .

                          Stack:
aa   Push two 10s.        [... 10 10]
00   Push two 0s.         [... 10 10 0 0]
tt   Decrement twice.     [... 10 10 0 -2]
,    Rotate(-2).          [... 0 10 10]
,    Rotate(10).          [... 0 10 0]

이 회전 함수는 인수를 나타냅니다. 해당 인수가 음수이면 스택 맨 위에있는 값을 해당 위치만큼 아래로 내립니다. 인수가 긍정적이면 상단 아래 많은 위치에있는 요소를 찾아 상단으로 당깁니다. 의 경우 Rotate(10)스택에 충분한 요소가 없지만 맨 아래에 0의 암시 적 무한량이 있으므로 0이 맨 위에 오게됩니다.

이제 우리는 이 두 가지 주장을 사용 J하여 첫 번째 질문 "을 할 수 있습니다 . 두 번째 "는 문자열 모드로 들어가고 그 모든 것을 기록합니다 DDoo nnoott.... 이에 도달하면 /IP가 남동쪽으로 리디렉션되고 서수 모드로 들어갑니다. 지금은 IP가 세 줄에서 위아래로 튀어 오릅니다 (두 개는 비어 있음). 먼저 두 번째와 세 번째 줄에 세 개의 공백을 더 기록한 다음을 누르면 문자열 모드를 종료합니다 ". 현재 서수 모드에 있기 때문에 기록 된 모든 문자는 스택에 단일 문자열로 푸시됩니다 (대부분 카디널 모드에서 기록 했음에도 불구하고).이 문자열로 끝납니다 (뒤 공백) :

DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff!!   

이제 IP가 계속 위아래로 튀어 오릅니다 . 즉 Y, 다른 모든 쌍 (예 : 및) 중 하나의 명령을 실행 t합니다. 그런 다음 IP는 두 번째 줄에서 그리드의 끝에 도달하고 그리드를 통해 뒤로 튀어 오릅니다. 이것은 또한 IP가 첫 번째 줄 안타 문자의 어떤 쌍의 전환, 그래서 다시 갈 때 지금 실행 ;, o@. 따라서 모든 공간과 암시 적 IP 리디렉션을 무시하면 실행 된 코드는 Yt;o@서수 모드입니다.

Y번갈아 위치에있는 문자로 문자열을 구분하는 "압축 해제"명령입니다. 각 문자가 반복되기 때문에 첫 번째 사본에는 후행 공백이 있고 두 번째에는 후행 공백이 있지만 실제로는 우리가 원하는 문자열의 사본을 두 개만 제공합니다. t그 후행 공간을 분리하여 ;버립니다. 마지막으로 o문자열을 인쇄 @하고 프로그램을 종료합니다.


2

05AB1E , 100 58 52 바이트

Kevin Cruijssen 덕분에 -6 바이트

„„€€··™™……€€––  ……¹¹‚‚  ……––‚‚))εε##θθáá}}»»……!!θθJJ

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

„„€€·              # dictionary string "g do"
     ·             # double (no effect on strings)
      ™            # title case: "G Do"
       ™           # title case again (no effect)
……€€––             # dictionary string "tools not–"
                   # spaces necessary so "–…" isn't parsed as a dictionary word
……¹¹‚‚             # dictionary string "team repeat‚"
                   # spaces necessary again
……––‚‚             # dictionary string "j yourself‚"
)                  # wrap the entire stack in an array
 )                 # and again: [["G Do", "tools not–", "team repeat‚", "j yourself‚"]]
  ε        }       # for each:
   ε      }        #  for each:
    #              #   split on spaces: ["tools", "not–"]
     #             #   and again: [["tools", "not–"]]
      θ            #   get the last element: ["tools", "not–"]
       θ           #   and again: "not–"
        á          #   keep only letters: "not"
         á         #   and again (no effect)
            »      # join the list by newlines, joining sublists by spaces:
                   # "Do not repeat yourself"
             »     # join the stack by newlines, joining lists by spaces (no effect)
……!!               # literal string "…!!"
    θ              # get the last character: "!"
     θ             # and again (no effect)
      J            # join the stack without separators: "Do not repeat yourself!"
       J           # and again (no effect)
                   # implicit output

dem 등식 규칙.


1
좋은 대답, 나는 당신이 그런 사전 문자열을 쥐어 짜낼 수 있다는 것에 깊은 인상을 받았습니다! 안타깝게도 á내부 문자열을 벡터화하지 않습니다. 그렇지 않으면. 다음에 사용할 수 있습니다 )). 대안으로 모든 작업을 제거한 후 á사용 하지만 불행히도 바이트를 절약하지 못합니다 (그러나 어쩌면 영감을 얻을 수 있습니까? ) .. 그리고 대신의 작품으로 잘, 이후 내장 분명히 같은 문자열을 떠난다. 아 잘, 나는 시도했다. xDεεáá}}))„„!!……!!!
Kevin Cruijssen

1
@KevinCruijssen 나는 반복되는 것들을 ##θθáá잠시 동안 리팩토링하려고 노력했지만 어떤 이유로 나는 고려하지 않았다 εε}}... 나는 시도 €€하지 않았다.
그리미

1

Stax , 70 바이트

GG11hh::zzaapp..}}..""DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff!!""

staxlang.xyz에서 실행하고 디버그하십시오!

Stax는 다행히도 ::매 n 번째마다 내장 기능 이 있습니다. 문자열을 두 배로 밀고 2를 밀고 실행하면 ::됩니다. 쉬워요?

잘못된.

그 줄을 밀어내는 것은 까다 롭습니다. 첫 번째 따옴표는으로 두 배가 될 수 있으며 .."", 이는 ."의미있는 따옴표가 오는 길이 2 리터럴입니다 . 문제는 새 문자열을 시작하지 않고 문자열을 종료 할 수있는 방법이 없다는 것입니다 (필요한 경우 또는 두 배 버전이 인쇄됩니다).

프로그램의 끝은 문자열 리터럴을 종료합니다. 이 배가 된 리터럴을 거기에 넣을 수 있다면 아마도 좋은 해결 방법이있을 것입니다. 그러나 프로그램의 끝에서 어딘가로 뛰어 오려면을 필요 G}로하므로 최소한 이것을보고 있습니다.

GG [deduplicate] }}""DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff!!""

이것은 ... 아무것도하지 않습니다. G블록을 시작하지 않으므로 두 번째로 점프하지 않습니다 }. 다시 한 문자를 무시해야합니다 ..}}.. 실행은 첫 번째 G에서 두 번째 로 }점프하고 끝으로 계속 진행하고 두 번째로 G그리고 다시 두 번째로 점프 하고 스택 }의 맨 [deduplicate]위에 두 배 문자열 이있는 섹션 의 시작 부분 에서 다시 시작하기 전에 한 번 더 계속 됩니다.

중복 제거는 간단합니다. 11hh11을 밀고 반으로 두 번 반올림하여 두 번 내림하고 두 번 내린 ::다음 필요한 출력을 얻습니다.

GG11hh::..}}..""DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff!!""

어 오. 아무것도 인쇄하지 않습니다. 여기에는 두 가지 문제가 있습니다. 첫째, ..}문자열 .}은 프로그램이 끝날 때 스택 위에 있고, 둘째는 Stax의 일반 암시 적 출력이 비활성화 되었음을 의미합니다 !

더 나쁜 문제는 출력입니다. Stax 프로그램이 아무 것도 인쇄하지 않고 정상적으로 종료되면 스택 상단이 암시 적으로 인쇄됩니다. 그러나 우리는 아무것도 인쇄하지 않았습니다 ...? 아, 그러나 우리는 있습니다. 종료되지 않은 문자열 리터럴은 푸시되지 않고 인쇄 "되며, 비어 있지만 그럼에도 불구하고이 두 개의 빈 문자열 ( 끝에서 일치하지 않는 문자열 )도이 검사를 통과하기에 충분합니다. 모든 인쇄는 손으로해야합니다.

우리는 pp또는 중 하나가 필요하며 PP,이 경우 첫 번째 통과를 무시하는 ..pp것은 문자열을 인쇄하므로 허용되지 않습니다 .p. 즉, 스택 또는 홀로 빈 문자열과 함께 원하는 출력 만 필요합니다. 후자는 빈 문자열 두 개를 밀고 zz( aa) 인쇄하기 전에 상단 세 항목을 두 번 회전 ( )하여 수행합니다 .

완료되면 키가 4 줄로 늘어납니다. .}그런 다음 프로그램이 정상적으로 종료되기 전에 다섯 번째 가 푸시됩니다. 이 시점에서, 암묵적 산출의 부재는 이제 더 이상 아무것도 인쇄되지 않기 때문에 저주뿐만 아니라 축복이됩니다!

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