답변:
Pyth는 Python과 매우 유사하므로 Python 프로그램을 Pyth로 쉽게 변환 할 수 있습니다. 그러나 Pyth는 명령 당 단일 문자 언어이므로 Pyth를 직접 작성하기가 어려운 경우가 있습니다. 파이썬으로 먼저 작성하면 한 번에 생각할 필요가 없습니다 (파이썬은 코딩하기 쉬운 언어이므로).
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.
이것은 새로운 소프트웨어이므로 버그가있을 수 있습니다. 나에게 문제를보고하십시오.
줄 끝의 문자열에는 큰 따옴표가 필요하지 않습니다. 예를 들면 다음과 같습니다.
"Hello, world!
완전히 유효한 Hello World 프로그램입니다.
C기본 압축이것은 실제로 문서화되어 있지 않습니다 . 문자열의 C는 실제로 chr-> int가 아니라 base 256-> base 10 (하나의 문자 문자열과 동일)입니다. 이것은 int를 압축하는 데 큰 도움이됩니다.이 스크립트를 사용하여 압축 할 수 있습니다.
sCMjQ256
을 가져 오면 (일부 인쇄 할 수없는 12345678910결과가 ßÜ>생깁니다).
또한 int 배열을 사용하면 코드 포인트로 변환하고 기본 128 숫자로 처리하여 큰 문자열을 연결할 수 있습니다.
C이걸 보여준 @xnor 덕분에 다른 사용법은 임의의 숫자를 만드는 것입니다. 순진한 방법은 다음과 같습니다.
^TT
그러나 우리는 1 바이트를 더 잘 할 수 있습니다.
CG
이베이스 (256)는 전체 알파벳을 역변환한다. 결과 156490583352162063278528710879425690470022892627113539022649722= ~ 1.56e62.
람다에 인수 할 때 map또는 reduce단지 인수 한 작업을 적용 ,, 당신은 짧은 양식을 사용, 수 M및 F. fMx에 해당 mfdx하고, fFx같은 일이다 .UfbZx. 예를 들어 숫자 목록을 입력으로 가져 와서 각각 하나씩 증가시킵니다. 첫 번째 방법은 다음과 같습니다.
mhdQ
그러나 다음과 같이 다시 작성할 수 있습니다.
hMQ
비슷한 일이 적용 reduce과 함께 F. 예를 들어, 정수 목록의 곱을 계산하는 데 어려움이 있다고 가정하십시오. 다시 한 번 첫 시도는 다음과 같습니다.
.U*bZQ
그러나을 사용하면 다음과 F같이 단축 될 수 있습니다.
*FQ
3 바이트를 줄입니다 ... 나쁘지 않습니다!
Q함수가 입력을 잃어 *F
필자는 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최단 길이 될 수 없습니다 ...
y@Dennis 필자는 Pyth가 여러 개의 매우 쉽게 구문 분석 된 입력 형식 (예 : Python 형식)을 가질 필요가 없기 때문에 오래된 것을 버렸습니다. 그렇습니다 mvdczd. 불행히도 그렇게해야 한다고 생각 합니다.
r문자열 처리 제품군에 추가했습니다 .
r꽤 유용 해 보입니다.
@Fdr1 + 1 @ Q2Iq % Qd0d에서 근음 연산 을 사용하여 인수 계산기를 만드는 방법이 궁금합니다 . 그것을 사용하려고하면 기본적으로 index의미로 사용됩니다. 이 동작을 해결할 방법이 있습니까?
때로는 함수의 기본값이 골프에 유용 할 수 있습니다. Pyth는 실제로 이것을 지원합니다 (놀랍게도). 예를 들면 다음과 같습니다.
DC=Z1RZ;C;C5
인쇄합니다 :
1
5
이 작업을 수행 할 때 J와 K를 사용하여 문자를 저장할 수도 있습니다.
DgJ1K1R+JKg;g2;g2 3
인쇄물:
2
3
5
이것은 일반적으로 재귀 알고리즘에 유용합니다.
이것은 더 이상 작동하지 않지만 누군가 Pyth의 이전 버전을 사용하여 골프를 즐기고 싶다면 여기에 남겨 두었습니다.
이것은 현재 새로운 변화입니다.
Q평가 된 입력에 자동 초기화되는 변수입니다. 그것은 Pyth 프로그램의 끝 부분에 암시 적으로 추가되어, arity를 해결하는 데 필요한 횟수만큼 필요합니다. 골프에 이것을 사용하는 방법의 예를 보려면 입력 의 Collatz 함수 를 계산한다고 가정 해 봅시다 .
작성하는 가장 짧은 방법은 다음과 같습니다.
@,/Q2h*3QQ
그러나 Q파일 끝에 s가 내재되어 있으므로 간단히 다음과 같이 쓸 수 있습니다.
@,/Q2h*3
2 바이트 절약
참고 비 필수 인수와 기능을 채워 그 인수를하지 않습니다. 예를 들어, c"12 12"암시가되지 않습니다 Q때문에, c단지 1 개 인수가 필요합니다.
변수를 자체 기능으로 설정하고 특정 횟수만큼 반복해야한다고 가정하십시오. 예를 들어, 입력에서 Collatz Sequence에서 나중에 숫자 100을 찾는 문제를 생각해보십시오. 시퀀스에서 다음 숫자를 찾는 가장 짧은 방법은 초기 숫자가 Q인 경우
@,/Q2h*Q3Q
이것을 100 번 적용하고 결과를 인쇄하는 가장 확실한 방법은
V100=Q@,/Q2h*Q3Q;Q
루프를 100 번 반복하고 매번 Q 값을 업데이트 한 다음 루프를 종료하고 Q를 인쇄하십시오.
대신 시퀀스 변수 ( H) 를 무시하는 reduce 함수를 사용할 수 있습니다 .
u@,/G2h*G3GU100Q
이 문자는 2 자 더 짧습니다. 시퀀스에 요소가있는 횟수만큼 반복하려고하면 3 자 더 짧습니다.
시퀀스 중 하나라도 조건을 만족하는지 확인하려면 일반적으로을 사용 .Em합니다. 예를 들어, 목록에서 5보다 크거나 같은 것이 있는지 확인하려면 다음을 수행하십시오.
.Emgd5Q
그러나 sm합이 부울에 작용하기 때문에 진실 / 거짓이 아닌 진실 / 거짓 일 필요가 있다면 효과가 있습니다 .
smgd5Q
우리는 더 짧게 할 수도 있습니다 f.
fgT5Q
마지막 것은 정말 못 생겼습니다.
들어 .ALL, 내가 생각할 수있는 유일한 것은 이상 저장 한 문자 그것을 반대 조건을 사용하고 부정하는 것입니다 .Am:
!f<T5Q
F: For 루프. 파이썬처럼.
V: 범위 이상의 루프. 변수 나 범위를 지정하지 않아야하므로 2 자 더 짧습니다.
W: while 루프. 파이썬처럼.
#: 무한 while 루프. 오류나 명백한 휴식으로 탈출하십시오. Pyth 에서만 try ... except제공됩니다.
D: 일반 정의 파이썬처럼.
L: 1 인수, 파이썬의 람다와 같은 할당 함수는 없지만 이름이 지정됩니다. 함수 이름, 변수 이름 및 리턴 ( R)을 지정할 필요가 없으므로 3 자 더 짧습니다.
f: 필터-입력 람다에서 진실을 반환하는 입력 시퀀스 요소를 선택합니다.
f: 정확한 필터 결과를 제공하는 입력보다 크거나 같은 첫 번째 정수.
m: 맵-입력 람다를 사용하여 입력 시퀀스의 요소를 변환합니다.
u: 축소-입력 람다에서 입력 시퀀스를 접고 누산기를 세 번째 인수로 초기화합니다.
o: 순서-입력 람다를 키로 사용하는 오래된 입력 시퀀스 요소.
일반적으로 주어진 문제에 대해 여러 가지 가능성이 있으며 각 문제와 함께 테스트 솔루션을 작성하는 것만으로 가장 짧은 것을 알아낼 수 있습니다.
.x보다 최근에는 try-except 블록에 사용할 수 있습니다.
.x{some_statments}{except_block - can this be empty}.
# ... B는 식 안에 있지 않으면 이런 식으로 사용할 수 있습니다
두 가지 요소를 바꾸는 것은 비용이 많이 드는 작업입니다. 다음은 사용하려는 두 가지 방법입니다.
준비 과정에서 목록을 정의하고 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
전환하려는 요소가 목록에서 고유 한 경우이 방법을 사용하십시오. 정말 짧습니다. 이번에는 첫 번째와 세 번째 요소 (값 1과 5고유)를 전환합니다.
=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].
명령문이 코드의 마지막 명령문 인 경우 닫는 괄호는 선택 사항입니다.
<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. 따라서 프로그램 기능 변경에 대한 걱정없이 어디서나 삽입 할 수 있습니다.
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보다 클 가능성이 높습니다.)
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 코드를 확인 하는 플래그를 제공 할 수 있으며 코드가 포함 된 파일 다음에 두 번째 명령 줄 인수로 입력을 제공 할 수 있습니다.
위:
단점 :
ASCII 만.
대화식 입력이 없습니다.
전체 디버그 옵션을 사용할 수 없습니다.
더 나쁜 오류보고.
I및 GCD를 사용한 분 산성 테스트면책 조항 : 이것은 음이 아닌 정수 에만 적용됩니다.
음수가 아닌 두 정수를 나눌 수 있는지 확인하려면 다음을 수행하십시오.
iI<divisor><dividend>
경우 A는 로 나누어 B 및 ≥ B ≥ 0 , 다음 = B (a, b) GCD .
반드시 바이트를 절약 할 필요는 없지만 !%<dividend><divisor>다음과 같은 이유로 절약 할 수 있습니다.
Q배당금으로 일할 때 Pyth 프로그램이 끝날 때 암묵적인 내용을 조정할 수 있습니다 (떨어짐과 같은 ).<pfn>자체 기능 이므로으로 사용할 수 있습니다 .0.iI자체 기능이지만 !%그렇지 않은 경우 접두사 기능으로 사용할 수 있습니다.
arity 1의 함수가 있고이를 변수에 적용하고 자체에 적용하려는 경우 다음 구문을 사용할 수 있습니다.
=<function><variable>
대신에:
=<variable><function><variable>
예를 들어, 변수를 늘리려면 Z다음을 수행하십시오.
=hZ
어느 것이 1 바이트를 절약 =ZhZ합니다.