05AB1E의 골프 팁


답변:


20

05AB1E의 GitHub 페이지 에서 Wiki에 포함 되지 않았기 때문에 (필자가 생각합니다), 나는 그것을 더 잘 이해할 수 있도록 여기에 추가 할 것입니다.

사전을 사용하는 방법?

05AB1E에는 알고있는 모든 단어가 포함 된 다음 words.ex 사전 파일 이 있습니다. 그러나이 사전의 단어에 어떻게 접근 할 수 있습니까? "testing"예를 들어 단어 를 보자.

"testing"사전 파일의 1453 행에서 찾을 수 있습니다. 처음 두 줄은 단어가 아니고 0 인덱스 단어가 필요하므로 3을 뺍니다
. 이제 인덱스 ( 1450)가 있지만 어떻게 사용합니까?

로 압축 된 문자열을 열고 시작합니다 . 그런 다음 info.txt 파일 의 두 번째 열을 살펴보십시오 . (그래서이 00; 01; 등)
의 경우 "testing",이 수단 î(14) 및 »(50).

압축 된 문자열 "testing"은 다음과 같습니다 “ . 온라인으로 사용해보십시오. 거의 모든 05AB1E 코드와 마찬가지로 문자열에 액세스하지 않으면 후행 은 선택 사항 이므로이 경우 에도 작동 하지 않습니다 .

참고할 사항 :

info.txt 파일에 색인이없는 모든 문자를 그대로 사용할 수 있습니다. 이는 s단수 단어 대신 복수를 출력하거나 ,.?!예를 들어 문장 부호를 사용하기 위해를 추가하는 데 유용 할 수 있습니다 .
ÿ문자열 내 스택에서 값을 삽입하려는 경우 (문자열 보간)을 사용할 수도 있습니다.
참고 : info.txt 파일에 색인이없는 모든 느슨한 문자는 아래 압축 유형에 대한 단어로 계산됩니다.

사용할 수있는 압축 문자열에는 여러 가지 유형이 있습니다.

  • ': 압축 단어 하나를 그대로 사용합니다 (후행 '필요 없음 )- 'î»: "테스트 중"
  • : 공백으로 구분 된 두 개의 압축 단어를 사용합니다 (후행 필요 없음 )- „î»î»: "테스트 테스트"
  • : 공백으로 구분 된 세 개의 압축 단어를 사용합니다 (후행 필요 없음 )- …î»î»î»: "테스트 테스트 테스트"
  • : 공백 구분 기호를 사용하여 압축 된 문자열을 가져옵니다.- “î»î»“: "테스트 테스트"
  • : 내재 된 공백없이 압축 된 문자열을 가져옵니다.- ’î»î»’: "testingtesting"
  • : 제목 구분 기호로 공백을 사용하여 압축 된 문자열을 가져옵니다.- ”î»î»”: "Testing Testing"
  • : 압축 구분 된 문자열을 공백으로 구분하여 대문자로 사용하십시오.- ‘î»î»‘: "TESTING TESTING"

공백으로 구분 된 단어 입력을 기반으로 압축 된 문자열을 가져 오는 유용한 프로그램은 다음과 같습니다.

'“? lAð«Ã#¸˜ vyU "€‚ƒ„…†‡ˆ‰Š‹ŒŽ•–—™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîï" Dâ vy"“ÿ“".V XlQi y?1#] '“,

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

이 프로그램은 :

  1. 입력을 소문자로 취하고 알파벳 이외의 문자를 제거하고 (공백 제외) 단어를 공백으로 분리 lAð«Ã#하거나 ( ) 한 단어 만 입력 한 경우 목록에서 단어를 줄 바꿈 (¸˜ )
  2. 각 단어를 반복합니다 (vyU )
  3. 그런 다음 사전 ( "€...ï"Dâvy) 에서 압축 된 각 단어에 대해 내부 루프 가 있으며 05AB1E 프로그램 ("“ÿ“".V )
  4. 그리고 현재 단어와 같으면 인쇄하고 내부 루프를 끊습니다. XlQiy?1#

good bye world따라서 입력을 사용 하면 출력이 “‚¿Þ¡‚ï“됩니다. 온라인으로 사용해보십시오.

참고 :이 생성기가 작동하려면 사전에 단어가 있는지 확인해야하며 특수 문자 또는 복수 단어를 무시합니다. 사전에서 정확히 같은 단어 만 찾을 수 있습니다.

다음 …Ÿ™‚ï!은 문자열 "hello world!"에 사용하는 예 입니다. 그리고 ’‚¿Þ¡ ÿ ‚ï!’문자열 "안녕히 계세요!". 공백과 느낌표는 info.txt 파일에 색인이 없기 때문에 그대로 사용되는 방법에 유의하십시오. 또한ÿ 불행히도 사전에 포함되지 않은 스택의 맨 위에 있던 "cruel"을 삽입하는 됩니다 (그러나 여전히 아래 섹션의 방법을 사용하여 압축되었습니다).

사전의 일부가 아닌 문자열을 압축하는 방법은 무엇입니까?

words.ex 사전 파일은 꽤 크지 만 (정확히는 10,000 단어), 그 일부가 아닌 단어 나 단순한 횡설수설 인 문자열이 필요할 수 있습니다. 압축하는 방법도 있습니까?
확실히 사용하여.•압축 된 기본 255 알파벳 기반 문자열 . 참고 :이 방법은 소문자 알파벳과 공백으로 만 사용할 수 있습니다.

다음은 단어 / 문자열을 압축 된 base-255 알파벳 기반 문자열로 변환하는 유용한 프로그램입니다.

vAyk})> 27β 255B ".•ÿ•"

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

이 프로그램이하는 일은 :

  • vAyk})>: 공백 문자가 색인 0이되도록 입력 문자의 1 색인 알파벳 색인을 가져옵니다.
  • 27β:이 지수를 기본 27에서 단일 숫자로 변환
  • 255B: 05AB1E 자체 코드 페이지를 사용하여이 번호를 Base-255로 변환
  • ".•ÿ•": 이 압축 문자열 앞에 선행 .•및 후행 을 배치합니다

다음은 @Kaldo.•zíΘ•단어 "goose"를 압축하는 데 사용 하는 대답 예 입니다.

큰 정수를 압축하는 방법?

우리는 무언가에 매우 큰 숫자를 사용하고 싶지만 실제로는 pow-calculations로 검색 할 수는 없다고 가정 해 봅시다. 예를 들어 큰 정수에 액세스하고 싶다고 가정 해 봅시다.18238098189071058293 어떤 이유로 든 에 .

이 경우 선행 및 후행 을 모두 사용 하여 형식으로 숫자를 압축 할 수 [1-9][0-9]+있습니다.
위의 예제 번호는 •15Y₁Ò'Θpc•입니다. 온라인으로 사용해보십시오. 다시 압축 사전 문자열과 마찬가지로 후행 을 선택적으로 제거 할 수 있습니다. .

선택적으로 정수가 충분히 작아서 2 개의 압축 문자 만 사용해야 Ž하는 경우 대신 사용할 수 있습니다 .이 경우에는 닫는 바이트가 필요하지 않고 정수는 4가 아닌 3 바이트로 압축됩니다. 예를 들어, 정수 13562는 결과가 •rl•되지만 두 문자 만 사용하므로 Žrl대신 가능 합니다.

또한 범위의 숫자는 05AB1E의 코드 페이지에서 추가 문자를 [101, 355]사용하여 2 바이트로 압축 할 수 있습니다 Ƶ. 예를 들어 Ƶ–integer에 사용될 수 있습니다 250. 사용 가능한 모든 숫자에 대한 개요입니다. 이 문자는 Base-255에서 Base-10으로 변환 된 다음 101이 추가됩니다 (범위의 숫자 [0,100]가 이미 1 또는 2 바이트 이므로 ).

이러한 방법을하는 15Y₁Ò'Θpc하고 rl만들어? 매우 간단하게, 숫자는 05AB1E의 자체 코드 페이지를 사용하여 Base-255로 변환됩니다. 다음과 같은 프로그램을 사용할 수 있도록 다음 사용하는 압축 번호, 얻을 Ƶ., Ž..또는 •...•압축 된 정수의 크기에 따라 :

101 355Ÿså i 101-255B"Ƶÿ" ë 255B Dg2Qi "Žÿ" ë "•ÿ•"

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

다음은 @Emigna•3Èñ•정수에 사용 하는 예 246060입니다.

정수 목록을 압축하는 방법?

때로는 단일 숫자 대신 전체 정수 목록을 압축하려고합니다. 예를 들어, [5,93,17,83,4,44,32,19,4,45,83,90,0,14,3,17,17,81]어떤 이유로 든 목록 을 원한다고 가정 해 봅시다 . 이 경우 대신 다음을 사용할 수 있습니다 •4βŸ{©£MG]q‡dZΘp•94в . 온라인으로 사용해보십시오.

이 압축 된 숫자와 변환하고자하는 Base를 모두 생성하는 유용한 프로그램은 다음과 같습니다.

Z>© β 255B ®s"•ÿ•ÿв"

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

이 프로그램이하는 일은 :

  • Z>: 입력 목록의 최대 개수 + 1을 가져옵니다 ( ©: 및 레지스터에 저장).
  • β: 입력 목록을 기본 max+1에서 단일 숫자로 변환
  • 255B:이 단일 번호를 압축합니다 (위 섹션에서했던 것처럼)
  • ®s"•ÿ•ÿв": 결과를 선두 , 압축 숫자 , 최대 +1, 후행 형식으로 반환합니다.в

여기에 •4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в목록을 압축하는 데 사용하는 예제가 [85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]있습니다.
추신 :이 대답에서 •6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø`JδŠ₂+Öηôî®À8†6/ðÎ6ùøΓ°ÓĆ;ˆ©Ā•2ô모든 바이트의 숫자가 정확히 두 자리이므로 동일한 바이트 (57) 대안입니다. 경우에 따라 (특히 작은 목록)이 방법이 더 짧은 대안 일 수 있습니다.

정수 압축 대 정수 목록 압축 :

이 두 가지로 어느 쪽이든 갈 수 있습니다. 때로는 압축 된 목록이 더 짧고 때로는 압축 된 정수가, 때로는 완전히 다른 대안이 더 짧은 경우도 있습니다. 따라서 위의 발전기에 완전히 의존하는 대신 항상 자신의 판단력과 골프 기술을 사용하여 골프를 더 발전시킬 수 있습니다. 다음은 몇 가지 예입니다.

[44, 59]( @Emigna 이 답변에 사용 ) :

  • •A–•60в 7 바이트 (압축 된 정수 목록 생성기에서 생성됨)
  • •H|•2ô또는 •H|•2ä하드 코딩 된 코드 44 59‚는 모두 6 바이트입니다.
  • ŽH|2ô또는 ŽH|2ä모두 5 바이트
  • 그러나이 경우 „,;Ç4 바이트를 사용하는 것이 가장 좋습니다 (문자 ','및 ';'의 코드 포인트)

[2,4,6,0]( @Emigna 이 답변에 사용 ) :

  • •3ā•7в 6 바이트 (압축 된 정수 목록 생성기에서 생성됨)
  • Ž3ā7в 5 바이트
  • 그러나이 경우 Ž9¦S4 바이트를 사용하는 것이 가장 좋습니다 (정수 2460을 자릿수 목록으로 압축)

10101001100101001( 이 답변에 사용됨 ) :

  • •a½₄Ƶ6®í• 9 바이트 (압축 된 큰 정수 생성기에서 생성됨)
  • •1∊}•2вJ 8 바이트 (조인이 추가 된 압축 정수 목록 생성기에서 생성됨)
  • 그러나이 경우 •1∊}•b6 바이트를 사용하는 것이 가장 좋습니다 (암호화되는 정수 목록, 대신에 to 이진수를 사용하여 암시 적으로 조인)

[85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]( 이 답변에 사용됨 ) :


12

암시 적 입력

05AB1E가 출시되던 시절에 암시 적 입력은 상당히 새롭고 화려했습니다. 오늘날에는 다른 경쟁 언어 (예 : Jelly, MATL, Pyth 등)를 추적하기 위해 필요한 것 같습니다.

예를 들어 두 개의 숫자를 추가하려면 다음을 수행하십시오 II+.

I    # Input_1.
 I   # Input_2.
  +  # Add them up.

여기에서 테스트


그러나 암시 적 입력을 사용 하면 1 바이트로 단축 할 수 있습니다 +.

+    # Take two numbers implicitly and add them up.

여기에서 테스트


이것은 스택의 길이가 작업자의 arity보다 작은 경우에만 발생합니다. 마지막 예는 3+입니다. 의 인수에 대응 +오퍼레이터는 2 만 존재하면서 1 스택의 요소 :

3    # Push the number 3 on top of the stack.
 +   # Request implicit input and add to the 3.

여기에서 테스트


8

부분 문자열

£b문자열 의 첫 문자 를 취하는 명령입니다a .
전의: "hello_world"5£ -> "hello"

그러나 b인덱스 목록 인 경우 대신 문자열을 해당 크기의 일부로 분할합니다.
전의: "hello_world"5L£ -> ['h', 'el', 'lo_', 'worl', 'd']


8

사전 정의 된 변수

그들은 05AB1E에 약간 숨겨져 있습니다. 사전 정의 된 모든 변수의 목록은 다음과 같습니다.

  • ¾, 푸시 0이 명령 전에 counter_variable이 변경되지 않은 경우 합니다.
  • X1를 사용하여이 명령 전에 변수 X가 변경되지 않은 경우 푸시 합니다.U .
  • Y2를 사용하여이 명령 전에 변수 Y가 변경되지 않은 경우 푸시 합니다.V .
  • ®-1를 사용하여이 명령 전에 레지스터가 변경되지 않은 경우 푸시 합니다.© .
  • ¯[]이 명령 전에 global_array에 아무것도 추가되지 않으면 (빈 배열)을 푸시 합니다.
  • ¸[""]입력이 없으면 빈 스택을 푸시 합니다. (이것을 찾아 주셔서 감사합니다. @Emigna)

24
¾push = 0 => 그것은 니모닉이 아닌 것과
같습니다.

6
@Fatalize : 0도 0을 푸시합니다. ¾만 0을 밀어하려면 0으로 초기화되는 카운터 변수가 0 물론 자연이다 밀어하지만 밀어하려는 경우 5,0,7, 5¾7(2)는보다 짧은 바이트입니다 5 0 7.
Emigna

7
나의 하루, ¾의미 .75, 나는 한 번 그 사실을 Pyth를 이길 . 이러한 새로운 골프 언어는 니모닉에 대한 실마리가 없습니다.
ETHproductions

31
당신 모두가 무슨 말을하는지 모르겠다. : p. print(3 / 4)파이썬 2에서는 나를 제공합니다 0.
Adnan

2
시작 M시을 누릅니다 -Inf.
mbomb007

7

캔버스 사용 ( Λ또는 )

문서의 일부가 아니기 때문에 @Adnan 은 현재 작성에 너무 바쁘기 때문에 여기에 팁으로 추가하도록 권한을 요청했습니다.

캔버스 기능 ( Λ또는 )을 사용하여 화면에 ASCII 선을 그릴 수 있습니다. 세 가지 필수 매개 변수가 있습니다.

  • a 길이 : 선의 크기입니다. 단일 정수이거나 정수 목록 일 수 있습니다.
  • b 문자열 : 표시 할 문자입니다. 단일 문자, 문자열, 문자 목록 또는 문자열 목록 일 수 있습니다 (마지막 세 경우에는 랩 어라운드를 포함하여 하나씩 사용합니다)
  • c 방향 : 문자 선이 그려지는 방향입니다. 일반적으로[0,7]방향에 대한숫자가 있으며, 하나 이상의 복수를 사용할 수 있습니다. 특정 문자가 필요한 특수 옵션도 있습니다 (나중에 자세히 설명).

방향 숫자 [0,7]는 다음 방향으로 매핑됩니다.

7   0   1
  ↖ ↑ ↗
6 ← X → 2
  ↙ ↓ ↘
5   4   3

일부 예제 05AB1E는 Canvas가 사용 된 위치에 응답합니다.

마지막 것과 비슷한 것을 해보자. Canvas Λ함수를 다음 세 가지 매개 변수와 함께 사용한다고 가정하자 .

  • a :[3,3,5,5,7,7,9,9]
  • b :!@#
  • c :[0,2,4,6]

결과는 다음과 같습니다.

  !@#!@#!
  #     @
  @ #!@ #
  ! @ # !
  # ! ! @
  @   @ #
  !#@!# !
        @
@!#@!#@!#

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

어떻게 작동합니까? 글쎄, 위의 입력에 대한 단계는 다음과 같습니다.

  1. 3문자 ( !@#)를 위쪽으로 그리십시오 (방향0 )
  2. 그리기 3-1문자 ( !@오른쪽으로)을 (방향2 )
  3. 그리기 5-1문자 ( #!@#) 아래 (방향4 )
  4. 그리기 5-1문자 ( !@#!왼쪽 (방향으로)를6)
  5. 7-1문자 ( @#!@#!)를 위쪽으로 그리십시오 (방향0 )
  6. 그리기 7-1문자 ( @#!@#!오른쪽으로)을 (방향2 )
  7. 그리기 9-1문자 ( @#!@#!@#) 아래 (방향4 )
  8. 그리기 9-1문자 ( !@#!@#!@왼쪽 (방향으로)를 6)

-1선이 겹쳐 있기 때문에이있다. 처음 두 단계는 다음과 같습니다.

#
@
!

 !@

어느 것이 결합되어 있습니까?

#!@
@
!

몇 가지 사소한 참고 사항 :


1
나는 05AB1E에 캔버스가 있다는 것을 알지 못했습니다!
MilkyWay90

어떻게 ... 어떻게 알아 냈어? 소스 코드?
매직 문어 항아리

1
@MagicOctopusUrn @Adnan 의이 답변 에서 대부분 (PS : 그의 최근 답변도 꽤 잘 설명되어 있습니다 ). 들어 +×8난 정말 소스 코드에보고했습니다.
Kevin Cruijssen

5

팝 또는

다른 스택 기반 언어와 마찬가지로 05AB1E의 기능은 일반적으로 스택에서 입력을 (소비)하고 출력을 스택으로 푸시합니다.

그러나 일부 함수 는 입력을 소비하지 않고 스택에서 입력을 가져옵니다 . 입력 목록에서 첫 번째 요소를 생성 하는 head함수 가 예입니다 ¬. 여기에 예제 프로그램이 있습니다 :¬+ . 입력 목록의 첫 번째 숫자가 해당 목록의 각 숫자에 추가됩니다.

어떤 함수가 팝업되고 어떤 함수를 얻는 지 알려면 함수 정보 파일 에서 해당 열을 참조하십시오 .


@NeilA. 감사! 링크 업데이트
Luis Mendo

3

조건부 및 루프

루프와 조건문은 프로그램 끝에서 자동으로 닫는 대괄호를 수신하므로 루프 / 조건부 외부에 필요한 경우 코드에 추가하면됩니다.

예를 들어, 첫 번째 n소수 목록을 작성하는이 (무용지물) 프로그램 은 닫는 괄호가 필요하지 않습니다. [¹¾Q#NpiNˆ¼

그러나 결과 목록에서 일부 작업을 수행하려면 (예 : 델타를 가져가는 경우) 먼저 루프를 닫아야합니다. [¹¾Q#NpiNˆ¼]¯¥


3

작은 05AB1E 골프 팁

길을 따라 배운 작은 골프 팁으로 이것을 확장 할 것입니다. (개인적으로 05AB1E 만 시작했습니다.)

  • D( swap) 및 (triple-swap to ) 와 Ð결합 된 (duplicate) 및 (triplicate) 는 일반적으로 루프 내부 에서 ( global_variable에 저장 ) 및 (push global_variable을 사용 ) 보다 짧습니다 . 이것은 이 답변에 1 바이트를 절약 할 뿐만 아니라이 답변에 2 바이트를 절약했습니다 .sŠa,b,cc,a,b©®
  • ½(1 있다면, 증가 counter_variable 1 일까지)는 말에 필요하지 않다 µ(동안 counter_variable ! = A, 이렇게 ...),이 (암묵적이기 때문에 나의이 대답 바이트를 저장 ).
  • .B암시 적으로 줄 바꾸기로 나뉩니다. 이것은 빈 항목을 계속 유지하면서 (분할) 에 대한 대안을 찾을 때이 대답에 유용했습니다 ¡(참고 : 요소가 분할 후 후행 공백을 포함하면 링크 된 답변의 솔루션이 작동하지 않습니다)-희망적으로 내장 된 의지 분할하지만 나중에 빈 줄을 유지하려면 추가하십시오.
  • (입력 정수의 숫자 중 균등하게 입력 정수를 나눌 수 있음)에는 00으로 나누기 오류 대신 숫자의 숫자 자체가 포함됩니다 . 예를 들어, 1053초래한다[1,1053,0,1] (도 5로 나누어 아니다 0에 대해 0으로 나누기 오류를 범 1053 (1)과 (3)로 나누어). 이것은 05AB1E 에서만 진실되고 다른 모든 것은 거짓 이기 때문에 목록의 힘을 취함으로써 내 대답에 매우 유용했습니다 1. SÖP진실한 결과 (1 ) 입력 정수를 각 숫자로 균등하게 나눌 수 있음을 의미합니다.
  • û(주어진 문자열을 palindromize) 보고 난 후에 는 is_palindrome이 내장되어 있지 않다는 것에 놀랐습니다 . 그러나 나중에 나는 그것을 달성하기 위해 2 바이트 만 필요하다는 것을 깨달았습니다 ÂQ. Â이 분기는 짧습니다 DR: 복제 및 역 복사;Q 스택의 최상위 두 값이 같은지 여부를 확인한다).
  • 목록을 여러 항목으로 필터링하려면 일반적으로 하나의 필터를 모두 결합하지 않고 여러 개의 느슨한 필터를 사용하는 것이 더 저렴합니다. 두 개의 필터가 있으면 두 개의 필터를 사용할 때 Ds*(중복 AND 스왑, 곱하여 논리 AND로 작동) vs (첫 번째 필터 닫기, 다시 필터 ) 행을 따라 무언가가 필요 하기 때문 입니다. 예를 들면 다음과 같습니다. 이 문제 우리는 적어도 하나를 포함하는, 긴 네 자리의 모든 번호를 나열해야 0하고, 숫자의 합과 같음 9. 범위를 사용하면 [1000,10000]길이는 4 자리 숫자이지만 두 개의 필터가 더 남아 있습니다. 처음에는 ₄4°ŸʒD0åsSO9Q*(14 바이트)를 사용했지만 두 필터를 사용하면 바이트를 저장할 수 있습니다 ₄4°Ÿʒ0å}ʒSO9Q(13 바이트). (나중에 @Grimy가 ₄4°ŸεW°ö9Q(10 바이트)까지 골프를 쳤습니다..)
  • 0필러 로 정수 로 압축 하려면을 사용할 수 있습니다 . 그러나 이것의 한 가지 문제는 필러 0가 문자열이된다는 것입니다 "0". 따라서 나중에 혼합 문자열과 정수로 정렬하려고하면 원하는 결과를 얻지 못할 것입니다. 압축 된 내부 목록을 정렬하는 방법의 예는 다음과 같습니다 0ζ€{.. 이것은 ïzip 다음 에 int ( )에 명시 적 캐스트를 추가 한 다음 정렬 만하여 해결할 수 있습니다 0ζï€{. 그러나 zip-filler와 함께 ¾상수를 0사용하면 zip 동안 문자열 대신 정수로 유지됩니다. 따라서 ¾ζ€{여기에 바이트를 저장합니다. 이 팁은 @ Mr.Xcoder 에 의해 제공 되어이 답변에 바이트를 저장합니다 .
  • 목록에서 여러 숫자의 자릿수를 합산하려면을 사용할 수 있습니다 €SO. 그러나 더 짧은 것은 자동으로 벡터화되는을 사용 합니다. 이 팁은 @Grimy여기에 바이트저장 하기 위해 제공했습니다 ( 여기에 2 바이트 ).
  • 음이 아닌 정수만 처리하고 필터 내부에서 0 또는 1인지 여부를 확인하려는 경우 당연히 명백한을 사용할 수 있습니다 2‹. 그러나 !(계승)을 사용하면 0and 1에 대해 1 (거실) 만 발생하고 다른 모든 값은 더 높은 결과를 낳습니다 (따라서 05AB1E에서만 진실이기 때문에 1거짓). 이 팁은 @Grimy바이트저장 하기 위해 제공했습니다 .

2

자동 벡터화

05AB1E의 일부 연산자는 배열에서 자동으로 벡터화됩니다. 예를 들어 code 5L3+는 다음 의사 코드로 디스 어셈블됩니다.

[1, 2, 3, 4, 5] + 3

될 것입니다 :

[4, 5, 6, 7, 8]

자동으로 벡터화되지 않으면 연산자 를 사용할 수도 있습니다 . 단일 문자 명령이 필요하며 각 요소에 대해 (모 노드) 연산자를 수행합니다. 각 요소를 분리하는 예는 다음 코드입니다 ( 여기에서 시도하십시오 ).

€S

일반 S연산자는 배열의 각 요소를 분할하여 단일 배열로 병합합니다 ( 여기서 시도 ).


배열의 n 번째 요소에 어떻게 할당합니까?
앤드류 Savinykh

@AndrewSavinykh 지금 당장은 내장되어 있지 않지만 구현하고 싶은 것입니다.
Adnan

@Adnan 나는 그것을 할 수있는 방법을 찾았습니다. n 번째 인덱스에도 할당 할 값이있는 다른 목록을 만듭니다. 그런 다음 ñ앞에 값 n(색인)을 사용하여 목록을 병합하십시오 . tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
mbomb007

@ mbomb007 가능한 유일한 문제는 merge 명령은 문자열을 인수로만 사용하고 목록을 문자열로 변환하기 때문에 나중에 배열을 수정할 수 없다는 것입니다.
Adnan

2

입력 순서

입력을받는 순서는 코드에 큰 영향을 줄 수 있으며, 종종 s스택 맨 위를 스택에서 다음으로 높은 것으로 바꾸는 데 사용 하는 경우 문제에 대해 올바르게 생각하지 않습니다. 입력을 다시 정렬하고 입력을 미리 교체하거나 스택에 추가하거나 어딘가에 복제하여 교체해야 할 필요가 없는지 확인하십시오. 가장 명백한 I & O는 가장 성공적인 05AB1E 답변 일 수 있습니다.


2

05AB1E ASCII 아트 골프

아래 코드는 사용자 정의 기본 변환을 사용하여 ASCII 아트를 05AB1E로 변환하는 데 도움이됩니다.

|»©ÐÙSDŠ¢øΣθ}R€н¬®sÅ?iD2£RDŠKsì}J©žLR‡®gö₅B®s"•ÿ•“ÿ“ÅвJ"

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

이것은 다음에 의해 달성됩니다.

  1. ASCII 도면에서 고유 한 문자를 나열합니다.
  2. 문자열에서 내림차순으로 발생하는 횟수 (가장 많이 발생하지 않는 문자까지)로 정렬합니다.
  3. ASCII 도면이 가장 많이 발생하는 문자로 시작하는 경우 처음 두 항목을 반대로하십시오 (압축 정수에서 선행 0을 방지하기 위해).
  4. 입력 문자를 0-9A-Za-z 를 순서대로 맵핑하십시오. 각 고유 문자는 모두 대체 될 때까지 고유 한 맵핑 문자를 갖습니다.
  5. 교체해야 할 가장 높은 기준을 사용하여 압축합니다 (고유 문자 수 기준).
  6. 베이스를 다시베이스 -255로 다시 변환하십시오 (05AB1E 압축의 경우).
  7. 다음 형식으로 모든 것을 형식화하십시오 •<compressed_integer>•“<sorted_distinct_characters>“ÅвJ.

또한 압축 문자열 따옴표로 할 수 있습니다 "; (가) Åв이 문자열을 사용하는 사용자 정의 거점으로 문자열을 사용하여 생성 된 정수를베이스 - 변환; 그리고 J암시 적으로 출력되는 단일 문자열로 이러한 모든 문자에 참여합니다.

ASCII 예술에 적합한 최대 62 개의 고유 문자를 포함하고 패턴을 수용합니다.
고유 한 문자의 양이 적을수록 압축 성능이 향상됩니다.


XNOR 디지털 타이밍 다이어그램 그리기 예제 출력 (214 바이트, 고유 문자 9 개) :

    ┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐  
A ──┘ └─┘ └─┘     └─┘ └─┘ └─┘   └──
  ┌───┐ ┌───┐ ┌─┐ ┌─────┐   ┌─┐ ┌─┐
B ┘   └─┘   └─┘ └─┘     └───┘ └─┘ └
    ┌─────┐   ┌─┐   ┌─┐   ┌───┐   
X ──┘     └───┘ └───┘ └───┘   └────

될 것입니다 :

05AB1E , 106 바이트

•I£.µ*:]ó±øqaµb₄ΘYQmœ¹µû₄p´ζÂĆ_5ŠKÑ×ðòË|₄#¹¶úôÂ-Í|¯ε¼É₂ïδ&é–9»ÞFò1î×HÃBjý2ĆÉ≠FYÂÂèC j‘£Å₅Œ•“─ └┘┐┌
XBA“ÅвJ

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

(106/214) * 100 = 원본 ASCII 아트 문자열의 크기 49.53 %

05AB1E (레거시)의 해당 챌린지대한 실제 제출 과 동일한 바이트 수 입니다.


코드 설명 :

참고 : 코드는 절대 골프가 아닙니다. ASCII 아트를 가장 효율적인 압축으로 변환하기 위해 신속하게 작성되므로 상당히 추하고 길다.

               # Take multi-line input
  ©              # Store it in the register to reuse later                         
ÐÙS              # Only leave unique characters (as list)
   DŠ¢ø          # Map it with the count for each of those characters
       Σθ}R      # Sort it based on that count (highest to lowest)
           €н    # Remove the count again, so the sorted characters remain
¬®sÅ?i           # If the input starts with the most occurring character:
      D2£RDŠKsì} #  Swap the first two characters in the list
J©               # Join everything together, and store it in the register to reuse later
  žLR           # Map each character to [0-9A-Za-z]
      ®gö        # Get the amount of unique characters, and convert it to that Base
         B      # And then convert that to Base-255
®s               # Push the string and swap so the compressed integer is at the top again
  "•ÿ•“ÿ“ÅвJ"    # Insert it in the correct output format
                 #  `•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ`
"•ÿ•"            # (after which the result is output implicitly with trailing newline)

1
그런데 05AB1E가 코드 페이지를 변경했기 때문에 최대 기준이 214 에서 255로 변경되었습니다 .
Adnan

1
아마도 대답에 추가하거나 생성기를 수정하여 ASCII 아트에서 10 개 미만의 문자를 사용하는 경우 2 바이트 씩 골프를 칠 수 있습니다. 즉 , 발전기는 22 바이트 를 제공하지만 대신 20 바이트 가 될 수 있습니다 .
Kevin Cruijssen

@ KevinCruijssen 아이디어는 내가 생성하려고하는 것이 었습니다. 제너레이터가 좋은 것이라고 주장하지는 않았습니다 .P. 나는 그것이 여전히 osabie에서 실행되는 것을 의심합니다. 나는 오래 전에 그것을 썼다!
Magic Octopus Urn

@MagicOctopusUrn Elixir 재 작성에서 실행되는지 확실하지 않지만 레거시 버전에서는 여전히 작동합니다. 위의 Adnan 의 의견에서 언급했듯이 이미 1 년 반 전에 Base-214를 Base-255로 편집했습니다 . 그 외에는 훌륭하게 작동하며 몇 번 사용했습니다 (매번 더 골프를 치더라도). 문자열과 숫자의 생성은 훌륭합니다!
Kevin Cruijssen

다음은 개선 된 버전입니다. (매우 추악하고 빠르게 작성되었지만 작동합니다). 113 대신 108 바이트로 예제를 만들 것입니다. 개선 사항은 다음과 같습니다. 가장 높은 발생에서 가장 먼저 고유 한 문자 정렬 정수는 가능한 작습니다. <str><compr_int><int>вèJ대신에 사용 <compr_int><int>BžLR<str>‡; 문자열 인용 대신 사용 하여 입력의 일부가 될 수 있습니다. ""
Kevin Cruijssen

1

문자열과 정수는 같은 유형입니다

모두가 동의하는 것은 아니지만 작동합니다.

다음 두 프로그램을 고려하십시오.

4 5+
"4""5"+

그들은 모두 9 로 귀착됩니다 . 모든 값이 먼저 (로 ast.literal_eval) 평가되기 때문 입니다. 이 때문에 int에서는 모든 문자열 조작 연산자를, 문자열에서는 모든 int 조작 연산자를 수행 할 수 있습니다.

예를 들어 12345û숫자를 옅게 표시하면 12345결과가됩니다 123454321. 그 후, 우리는이 숫자로 정규 수학을 할 수 있습니다.

12345û50000-

결과는 다음과 같습니다 . 123404321 .


0

숨겨진 루프와 반복자

05AB1E에는 다음과 같은 일반 루프 및 반복자가 있습니다.

  • F0 ~ n-1 을 반복합니다 .
  • G1 .. n-1 을 반복합니다 .
  • ƒ0 을 반복합니다 . n .
  • v각 요소 s [0], s [1], .., s [n] 을 반복 합니다.
  • ʒ정확히 루프는 아니지만 필터 기준 명령입니다. 의도하지 않은 각 요소를 반복하는 동작으로 인해이 명령을 남용합니다.

이 루프를 사용하여 다음과 같은 숨겨진 루프를 파생시킬 수 있습니다 .

  • 대신 gF, 당신은 사용할 수 있습니다v 있는 N-index가있는를 사용할 수 있습니다.
  • 그만큼 vy -> ʒ교체은 약간 더 까다 롭습니다 :
    • 결과를 즉시 인쇄해야합니다. 이렇게하면 자동 인쇄가 스택 상단에 인쇄되지 않습니다.
    • 코드 스 니펫은 새로운 임시 스택 에서 실행됩니다. . 이는 스택 종속 스 니펫을 사용할 수 없음을 의미합니다.
    • y이런 종류의 루프에서는 호출 할 수 없습니다.

나는이 년 전에 게시되어 있습니다 알고 있지만,하지 [, µε루프 / 반복 일반의도 부분?
Kevin Cruijssen

또한 y지금은 이들 중 일부를 사용하여 호출 할 수 있습니다.
매직 문어 Urn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.