Pyth에서의 골프 팁


46

Pyth 는 PPCG 사용자 isaacg가 만든 Python에서 영감을 얻은 절차 적 프로그래밍 언어 입니다.

Pyth에서 골프를 치기위한 일반적인 팁은 무엇입니까? 나는 적어도 Pyth에 다소 특정한 코드 골프 문제에 적용될 수있는 아이디어를 찾고 있습니다.

답변 당 하나의 팁을 부탁드립니다.

답변:


25

파이썬으로 코드를 먼저 작성하십시오

Pyth는 Python과 매우 유사하므로 Python 프로그램을 Pyth로 쉽게 변환 할 수 있습니다. 그러나 Pyth는 명령 당 단일 문자 언어이므로 Pyth를 직접 작성하기가 어려운 경우가 있습니다. 파이썬으로 먼저 작성하면 한 번에 생각할 필요가 없습니다 (파이썬은 코딩하기 쉬운 언어이므로).


1
Pyth에서 Python 구문을 계속 사용할 수 있다고 말하면 프로그램의 일부를 개별적으로 변환하거나 필요한 경우 Python을 사용할 수 있습니다. ( 여기에서와 같이 )
FryAmTheEggman

@ mbomb007 Pyth 인터프리터를 다운로드하고 문서를 읽습니다. 이것이 제가 Pyth 프로그램을 작성하는 유일한 방법입니다.
저스틴

@ mbomb007 죄송합니다. 그것이 내가 Pyth를 쓰는 법을 배운 방법입니다 (소스 코드를 통해). Pyth에는 기본적으로 문서가 없습니다. 기본적으로 시행 착오를 통해 구문을 배워야합니다.
저스틴

22

변수를 아십시오

Pyth에는 3 가지 범주의 변수가 있습니다 : 일반 사전 초기화 된 변수, 사용자 입력을 기반으로 사전 초기화 된 변수 및 처음 사용할 때 암시 적으로 할당을 생성하는 변수.

일반 변수 :

b = "\n"
d = " "
k = ""
G = "abcdefghijklmnopqrstuvwxyz"
H = {}                            # (empty dict)
N = '"'
T = 10
Y = []
Z = 0

입력 초기화 변수 :

Q = eval(input())
z = input()

이러한 초기화는 관련 변수가 코드의 문자열 외부에서 사용되는 경우 지정된 프로그램에서만 실행됩니다. 또한, 상기 순서는 Q다음, z모두가 사용되는 경우.

최초 사용 변수에 할당 :

J그리고 K. 둘 다 동일한 값으로 초기화하려는 경우 KJ0더 긴 표현식과 같은 표현식을 사용하여 수행 할 수 있습니다 J0K0.


18

최신 온라인 통역사 를 사용하여 답변을 테스트하십시오.

이것은 새로운 소프트웨어이므로 버그가있을 수 있습니다. 나에게 문제를보고하십시오.


2
대박! 구글에서 이것을 찾을 수 없었습니다. 필요한 것!
theonlygusti

12

줄 끝의 문자열에는 큰 따옴표가 필요하지 않습니다. 예를 들면 다음과 같습니다.

"Hello, world!

완전히 유효한 Hello World 프로그램입니다.


확실히, 그것은 "Pyth programming language"에 대한 최초의 구글 결과입니다. esolangs에 자신의 페이지를 만들었습니까?
theonlygusti

3
@theonlygusti 그렇습니다. 또한 지난 10 월 첫 번째 결과는 아니었다.
isaacg

9

사용 C기본 압축

이것은 실제로 문서화되어 있지 않습니다 . 문자열의 C는 실제로 chr-> int가 아니라 base 256-> base 10 (하나의 문자 문자열과 동일)입니다. 이것은 int를 압축하는 데 큰 도움이됩니다.이 스크립트를 사용하여 압축 할 수 있습니다.

sCMjQ256

을 가져 오면 (일부 인쇄 할 수없는 12345678910결과가 ßÜ>생깁니다).

또한 int 배열을 사용하면 코드 포인트로 변환하고 기본 128 숫자로 처리하여 큰 문자열을 연결할 수 있습니다.

C이걸 보여준 @xnor 덕분에 다른 사용법은 임의의 숫자를 만드는 것입니다. 순진한 방법은 다음과 같습니다.

^TT

그러나 우리는 1 바이트를 더 잘 할 수 있습니다.

CG

이베이스 (256)는 전체 알파벳을 역변환한다. 결과 156490583352162063278528710879425690470022892627113539022649722= ~ 1.56e62.


문서에 추가되었습니다.
isaacg


8

짧은 기능 ... 오류 ... 기능 사용

람다에 인수 할 때 map또는 reduce단지 인수 한 작업을 적용 ,, 당신은 짧은 양식을 사용, 수 MF. fMx에 해당 mfdx하고, fFx같은 일이다 .UfbZx. 예를 들어 숫자 목록을 입력으로 가져 와서 각각 하나씩 증가시킵니다. 첫 번째 방법은 다음과 같습니다.

mhdQ

그러나 다음과 같이 다시 작성할 수 있습니다.

hMQ

비슷한 일이 적용 reduce과 함께 F. 예를 들어, 정수 목록의 곱을 계산하는 데 어려움이 있다고 가정하십시오. 다시 한 번 첫 시도는 다음과 같습니다.

.U*bZQ

그러나을 사용하면 다음과 F같이 단축 될 수 있습니다.

*FQ

3 바이트를 줄입니다 ... 나쁘지 않습니다!


그리고 Q함수가 입력을 잃어 *F
버렸을

7

Pyth 구현을 최신 상태로 유지하십시오.

필자는 Pyth를 정기적으로 개선하고 유용한 기능을 제거하고 유용한 기능을 추가하고 있으므로 새로운 기능을 주시하고 구현 사본을 정기적으로 업데이트하십시오.

최근에 추가 된 일부 기능 : (10/19/14 기준)

y: *2숫자와 문자열 및 목록의 모든 하위 집합 목록으로 작동합니다. 예를 들어 :

pyth -c 'y"abc'
['', 'a', 'b', 'c', 'ab', 'ac', 'bc', 'abc']

f: f은 일반적으로 필터 명령입니다. 이제 두 번째 인수로 숫자를 사용하여 호출하면 해당 숫자로 시작하여 1부터 시작하여 무한 시퀀스를 필터링 한 다음 결과 시퀀스의 첫 번째 요소를 반환합니다.

예를 들어, 10 억이 넘는 가장 작은 소수를 찾는 코드는 다음과 같습니다.

pyth -c 'f!tPT^T9'
1000000007

이것들은 유용한 추가 기능처럼 보이지만 이전 대신 무엇을 사용할 수 yz있습니까? mvdczd최단 길이 될 수 없습니다 ...
Dennis Dennis

1
y@Dennis 필자는 Pyth가 여러 개의 매우 쉽게 구문 분석 된 입력 형식 (예 : Python 형식)을 가질 필요가 없기 때문에 오래된 것을 버렸습니다. 그렇습니다 mvdczd. 불행히도 그렇게해야 한다고 생각 합니다.
isaacg

@ 데니스 문제가 해결되었습니다. 방금 이것을 r문자열 처리 제품군에 추가했습니다 .
isaacg

r꽤 유용 해 보입니다.
Dennis

@isaacg 주제가 맞지 않으면 죄송하지만 @Fdr1 + 1 @ Q2Iq % Qd0d에서 근음 연산 을 사용하여 인수 계산기를 만드는 방법이 궁금합니다 . 그것을 사용하려고하면 기본적으로 index의미로 사용됩니다. 이 동작을 해결할 방법이 있습니까?
StardustGogeta

5

함수의 명명 된 인수 (더 이상 지원되지 않음)

때로는 함수의 기본값이 골프에 유용 할 수 있습니다. Pyth는 실제로 이것을 지원합니다 (놀랍게도). 예를 들면 다음과 같습니다.

DC=Z1RZ;C;C5

인쇄합니다 :

1
5

이 작업을 수행 할 때 J와 K를 사용하여 문자를 저장할 수도 있습니다.

DgJ1K1R+JKg;g2;g2 3

인쇄물:

2
3
5

이것은 일반적으로 재귀 알고리즘에 유용합니다.

이것은 더 이상 작동하지 않지만 누군가 Pyth의 이전 버전을 사용하여 골프를 즐기고 싶다면 여기에 남겨 두었습니다.


16
와우-심지어 Pyth가 이것을 지원한다는 것을 몰랐고 언어를 썼습니다!
isaacg

불행히도 이것은 최신 버전의 Pyth에서 더 이상 작동하지 않습니다.
isaacg

이 팁을 다른 오래된 팁 중 하나처럼 삭제해야합니까? 그렇지 않은 경우이 팁이 어떤 버전에 적용되는지 표시해야합니다.
mbomb007

@ mbomb007 나는 버전을 찾는 것을 의미했지만 너무 게으르다. 내가 찾을 때까지 그 방법이 더 낫다고 생각되면 삭제하겠습니다.
FryAmTheEggman

@FryAmTheEggman 제목에 지원되지 않는다고 말했기 때문에 당신에게 달려 있다고 생각합니다.
mbomb007

5

2 개의 요소 튜플 포장 풀기 F

2 개의 arity 함수 r에 대해 2 요소 튜플이 있고 J = (a, b)원하는 r(a,b)경우를 가정 해 봅시다 .

이것을하는 순진한 방법은 rhJeJ입니다.

이 작업을 수행하는 멋진 방법 r.*J은 unpack 연산자를 사용하는 것입니다.

이 작업을 수행하는 가장 멋진 방법 rFJ은 fold 연산자를 사용하는 것입니다.


여전히 사용할 .u수 있습니까? .u지금 누적 감소하는 것 같습니다.
Ven

.u->. * 이것은 얼마 전에 변경되었지만 업데이트되지는 않았습니다.
isaacg

4

짧은 산술 함수를 사용하십시오

h: 목록의 첫 번째 요소를 반환하는 것 외에 숫자를 증가시킵니다 (예 :로 hT평가) 11. 보다 짧습니다 +1T.

t: 이것은 목록의 꼬리를 반환하는 것 이외의 숫자를 감소시킵니다 (예 :로 tT평가 ) 9. 보다 짧습니다 -T1.

y:이 숫자, 예를 들어 두 배로 yT평가됩니다에 20보다 짧은, *T2또는 +TT.


4

map목록을 생성하는 데 사용

기본적으로 파이썬의 멋진 목록 이해와 같습니다. 값이 중요하지 않더라도 기존 목록 또는 범위를 사용하여 각 값을 반복하고 매핑하십시오.

두 가지 예 :

  • 8 개의 0으로 구성된 목록을 생성하십시오.

    mZ8 대신에 *8]Z

  • 0과 9 사이의 5 개의 난수 목록을 생성하십시오.

    mOT5 대신에 V5~Y]OT)

    두 번째 목록은 목록을 자동으로 할당 Y하지만 실제로는 Y에 추가되지만 더 =YmOTU5짧습니다.


4

EOF에서 암시 적 Q

이것은 현재 새로운 변화입니다.

Q평가 된 입력에 자동 초기화되는 변수입니다. 그것은 Pyth 프로그램의 끝 부분에 암시 적으로 추가되어, arity를 ​​해결하는 데 필요한 횟수만큼 필요합니다. 골프에 이것을 사용하는 방법의 예를 보려면 입력 의 Collatz 함수 를 계산한다고 가정 해 봅시다 .

작성하는 가장 짧은 방법은 다음과 같습니다.

@,/Q2h*3QQ

그러나 Q파일 끝에 s가 내재되어 있으므로 간단히 다음과 같이 쓸 수 있습니다.

@,/Q2h*3

2 바이트 절약

참고 비 필수 인수와 기능을 채워 그 인수를하지 않습니다. 예를 들어, c"12 12"암시가되지 않습니다 Q때문에, c단지 1 개 인수가 필요합니다.


3

기능을 반복해서 적용하려면 reduce를 사용하십시오.

변수를 자체 기능으로 설정하고 특정 횟수만큼 반복해야한다고 가정하십시오. 예를 들어, 입력에서 Collatz Sequence에서 나중에 숫자 100을 찾는 문제를 생각해보십시오. 시퀀스에서 다음 숫자를 찾는 가장 짧은 방법은 초기 숫자가 Q인 경우

@,/Q2h*Q3Q

이것을 100 번 적용하고 결과를 인쇄하는 가장 확실한 방법은

V100=Q@,/Q2h*Q3Q;Q

루프를 100 번 반복하고 매번 Q 값을 업데이트 한 다음 루프를 종료하고 Q를 인쇄하십시오.

대신 시퀀스 변수 ( H) 를 무시하는 reduce 함수를 사용할 수 있습니다 .

u@,/G2h*G3GU100Q

이 문자는 2 자 더 짧습니다. 시퀀스에 요소가있는 횟수만큼 반복하려고하면 3 자 더 짧습니다.


3

일반적으로 Any에 대한 짧은 대안이 있습니다

시퀀스 중 하나라도 조건을 만족하는지 확인하려면 일반적으로을 사용 .Em합니다. 예를 들어, 목록에서 5보다 크거나 같은 것이 있는지 확인하려면 다음을 수행하십시오.

.Emgd5Q

그러나 sm합이 부울에 작용하기 때문에 진실 / 거짓이 아닌 진실 / 거짓 일 필요가 있다면 효과가 있습니다 .

smgd5Q

우리는 더 짧게 할 수도 있습니다 f.

fgT5Q

마지막 것은 정말 못 생겼습니다.

들어 .ALL, 내가 생각할 수있는 유일한 것은 이상 저장 한 문자 그것을 반대 조건을 사용하고 부정하는 것입니다 .Am:

!f<T5Q

3

모든 제어 흐름 옵션을보십시오

루프 :

F: For 루프. 파이썬처럼.

V: 범위 이상의 루프. 변수 나 범위를 지정하지 않아야하므로 2 자 더 짧습니다.

W: while 루프. 파이썬처럼.

#: 무한 while 루프. 오류나 명백한 휴식으로 탈출하십시오. Pyth 에서만 try ... except제공됩니다.

기능 :

D: 일반 정의 파이썬처럼.

L: 1 인수, 파이썬의 람다와 같은 할당 함수는 없지만 이름이 지정됩니다. 함수 이름, 변수 이름 및 리턴 ( R)을 지정할 필요가 없으므로 3 자 더 짧습니다.

기능적 프로그래밍 :

f: 필터-입력 람다에서 진실을 반환하는 입력 시퀀스 요소를 선택합니다.

f: 정확한 필터 결과를 제공하는 입력보다 크거나 같은 첫 번째 정수.

m: 맵-입력 람다를 사용하여 입력 시퀀스의 요소를 변환합니다.

u: 축소-입력 람다에서 입력 시퀀스를 접고 누산기를 세 번째 인수로 초기화합니다.

o: 순서-입력 람다를 키로 사용하는 오래된 입력 시퀀스 요소.

일반적으로 주어진 문제에 대해 여러 가지 가능성이 있으며 각 문제와 함께 테스트 솔루션을 작성하는 것만으로 가장 짧은 것을 알아낼 수 있습니다.


.x보다 최근에는 try-except 블록에 사용할 수 있습니다.
mbomb007

@ mbomb007 블록을 제외하고 무시하는 방법이 있습니다. 비워 둘 수 있습니까? 예를 들어 : .x{some_statments}{except_block - can this be empty}.
Gurupad Mamadapur

@GurupadMamadapur # ... B는 식 안에 있지 않으면 이런 식으로 사용할 수 있습니다
isaacg

3

목록에서 두 요소 전환

두 가지 요소를 바꾸는 것은 비용이 많이 드는 작업입니다. 다음은 사용하려는 두 가지 방법입니다.

Tmp 가변 접근

준비 과정에서 목록을 정의하고 Y숫자로 채 웁니다. 목표는 두 번째와 세 번째 요소를 전환하는 것입니다.

=Y[1 3 5 3 6 7)AGH,1 2

우리는 단순히 tmp 변수를 J = Q[G]할당 Y[G] = Y[H]하고 첫 번째 목록 할당 을 수행 한 다음 두 번째 마지막 할당을 수행합니다 Y[H] = J. 여기서의 트릭은 두 개의 목록 할당을 중첩하는 것이므로 인쇄를 억제 할 필요가 없으며 refer를 두 번 사용할 필요가 없습니다 Y.

J@YGXXYG@YHHJ

대신에

J@YG XYG@YHXYHJ

번역 접근

전환하려는 요소가 목록에서 고유 한 경우이 방법을 사용하십시오. 정말 짧습니다. 이번에는 첫 번째와 세 번째 요소 (값 15고유)를 전환합니다.

=Y[1 3 5 3 6 7)K,Z2

이것은리스트의 번역 기능을 사용합니다 :

XYm@YdK)

이 번역은 모든 요소 대체 Y[0]Y[1]모든 Y[1]과를 Y[0]. 따라서 값이 고유하지 않으면 나쁜 일이 발생했습니다. 예를 들어 K,1 2결과는 다음과 같습니다 [1, 5, 3, 5, 6, 7].

명령문이 코드의 마지막 명령문 인 경우 닫는 괄호는 선택 사항입니다.


3

로 디버깅 <newline>

코드가 명령형 프로그래밍 스타일로 작성된 경우 중간 결과를 쉽게 인쇄 할 수 있으므로 디버깅하기가 쉽습니다. ( 퍼머 링크 )

FN.:Q2                loop
      =Y+-Y-FNhN      some random command
                Y     print intermediate result
                 ;Y   end for loop and print result

그러나 많은 Pyth 프로그램은 맵, 필터 및 축소와 같은 기능적 프로그래밍 요소를 사용하므로 간단한 인쇄가 불가능합니다. 그러나 \n명령을 사용하여 여전히 가능합니다 .

u(reduce)를 사용하는 동일한 코드 는 다음과 같습니다. ( permalink )

u        .:Q2Y   reduce .:Q2, start with G = Y
 +-G-FHhH        random command

중간 값을 인쇄하려면 간단히 다음을 삽입하십시오 \n. ( permalink )

u         .:Q2Y   reduce
   \nG             print(G)
 +-\nG-FHhH        random command

\naa줄 바꿈에 인쇄 하고를 반환합니다 a. 따라서 프로그램 기능 변경에 대한 걱정없이 어디서나 삽입 할 수 있습니다.


요즘에는이 줄 바꿈을 사용할 수 있으며이 줄 바꿈도 인쇄합니다.
PurkkaKoodari

@ Pietu1998 네, 항상 사용합니다. 게시물을 업데이트 할 시간입니다.
Jakube

3

최대 2 개의 정수 찾기

g#

예를 들어, 당신이 생각 J=5하고 K=12. 그런 다음 g#JK= 12와 g#KJ= 12도 있습니다.

이것은 @ Pietu1998에 의해 발견되었습니다.

누군가 이미 그것을 찾았는지 확실하지 않지만 max (A, B)를 2 바이트로 수행하는 멋진 방법이 있으므로 3 for를 사용할 필요가 없습니다 eS,AB. g#AB같은 일을합니다. (하지만 max (1, A-B + 1) 회 반복되기 때문에 매우 비효율적입니다. 최적화는 숫자를 B보다 클 가능성이 높습니다.)


@Jakube 사실입니다. 채팅에 이것을 입력하는 동안 분명히 뭔가를 잘못 생각했습니다.
PurkkaKoodari 2016 년

2

피스의 join방법

join파이썬 의 메소드는 문자열 만 조인하기 때문에 약간 성가시다. Pyth join는 더 관대합니다. 기본적으로 문자열의 모든 객체를 변환합니다.

예를 들면 jkUT제공 0123456789또는 jb["abc"4,5\f]7제공

abc
4
(5, 'f')
[7]

최근에는 더 많은 문자열로 변환 기능이 추가되었습니다. 첫 번째 인수는 문자열에도 적용됩니다. 예 : j2\a\b->"a2b"
isaacg

1

숫자가 정수인지 말하기

깔끔한 트릭은 Invariant를 사용하여 숫자가 정수인지 여부를 알려줍니다.

sI

자르면 숫자가 변경되지 않는지 확인합니다. 정수이면 정수가 아닙니다.

예를 들어, 이것을 완벽한 정사각형 검사로 사용할 수 있습니다.

sI@Q2

1

포장 된 Pyth 사용

Packed Pyth는 문자 당 8 비트 대신 문자 당 7 비트를 사용한다는 점을 제외하고는 Pyth와 정확히 동일한 새로운 "프로그래밍 언어"입니다.

이를 사용하려면 pyth 저장소를 복제하십시오 . 파일 packed-pyth.py은 통역사입니다.

코드가이라고 가정하십시오 "Hello, world!.

먼저 파일에 넣으십시오. echo -n '"Hello, world!' > code.pyth

다음으로, Pyth 코드를 Packed Pyth 파일로 압축하십시오 : python3 packed-pyth.py -p code.pyth code.ppyth

마지막으로 Packed Pyth 코드를 실행하십시오 : python3 packed-pyth.py code.ppyth

코드를 실행할 때 -d실제로 실행중인 Pyth 코드를 확인 하는 플래그를 제공 할 수 있으며 코드가 포함 된 파일 다음에 두 번째 명령 줄 인수로 입력을 제공 할 수 있습니다.

위:

  • 코드는 1/8만큼 짧습니다.

단점 :

  • ASCII 만.

  • 대화식 입력이 없습니다.

  • 전체 디버그 옵션을 사용할 수 없습니다.

  • 더 나쁜 오류보고.


1
안전 모드에서 한 것처럼 플래그로 이동할 수 있습니까?
Maltysen

이것은 멋진 btw입니다 : D
Maltysen

@ Maltysen 바이트 점수가 1 씩 증가한다고 생각합니다.
isaacg

Pyth는 인쇄 가능한 ASCII 만 사용하므로 추가로 포장 할 수 없습니까?
lirtosiast

1

I및 GCD를 사용한 분 산성 테스트

면책 조항 : 이것은 음이 아닌 정수 에만 적용됩니다.

음수가 아닌 두 정수를 나눌 수 있는지 확인하려면 다음을 수행하십시오.

iI<divisor><dividend>

경우 A는 로 나누어 B≥ B ≥ 0 , 다음 = B (a, b) GCD .

반드시 바이트를 절약 할 필요는 없지만 !%<dividend><divisor>다음과 같은 이유로 절약 할 수 있습니다.

  • Q배당금으로 일할 때 Pyth 프로그램이 끝날 때 암묵적인 내용을 조정할 수 있습니다 (떨어짐과 같은 ).
  • <pfn>자체 기능 이므로으로 사용할 수 있습니다 .
  • 모듈로를 처리합니다 0.

시도 해봐!


한 가지 더 장점 : iI자체 기능이지만 !%그렇지 않은 경우 접두사 기능으로 사용할 수 있습니다.
에릭 Outgolfer

@EriktheOutgolfer 감사, 장점 목록에 추가 :)
Mr. Xcoder

0

자신에게 적용되는 함수에 변수 할당

arity 1의 함수가 있고이를 변수에 적용하고 자체에 적용하려는 경우 다음 구문을 사용할 수 있습니다.

=<function><variable>

대신에:

=<variable><function><variable>

예를 들어, 변수를 늘리려면 Z다음을 수행하십시오.

=hZ

어느 것이 1 바이트를 절약 =ZhZ합니다.

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