답변:
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
마지막 것은 정말 못 생겼습니다.
들어 .A
LL, 내가 생각할 수있는 유일한 것은 이상 저장 한 문자 그것을 반대 조건을 사용하고 부정하는 것입니다 .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
\na
a
줄 바꿈에 인쇄 하고를 반환합니다 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
합니다.