이모 지 코드 0.5, 204 201 바이트
🐋🚂🍇🐖🅰️➡🚂🍇🍊⬅🐕1🍇🍎1🍉🍮s 0🔂k⏩0🐕🍇🍦t➖🐕k🍮r t🔂i⏩1 t🍇🍊😛🚮t i 0🍇🍮➕r i🍉🍉🍮➕s✖r🅰️k🍉🍎➗s🐕🍉🍉
온라인으로 사용해보십시오!
"보다 작음"이모티콘은 상당히 긴 UTF-8 인코딩을 갖기 때문에 "2보다 작음"대신 "1보다 작거나 같음"을 사용하여 -3 바이트. 또한 t
바이트 수에 영향을 미치지 않고 경고를 침묵시키기 위해 동결되었습니다.
🅰️이라는 메소드로 🚂 (정수) 클래스를 확장합니다. 입력에서 숫자를 가져와 숫자에 대해 🅰️을 호출하고 다음과 같이 결과를 인쇄하는 간단한 프로그램을 작성할 수 있습니다.
🏁🍇
🍦str🔷🔡😯🔤Please enter a number🔤
🍊🍦num🚂str 10🍇
😀🔡🅰️num 10
🍉🍓🍇
😀🔤Learn what a number is, you moron!🔤
🍉
🍉
이 부분은 메시지와 오류 처리를 생략하여 많이 골라 낼 수 있지만 점수에는 포함되지 않으므로 대신 Emojicode의 더 많은 기능을 표시하면서 가독성을 향상시키는 것을 선호합니다.
언 골프
🐋🚂🍇
🐖🅰️➡🚂🍇
🍊◀️🐕2🍇
🍎1
🍉
🍮sum 0
🔂k⏩0🐕🍇
🍦nmk➖🐕k
🍮sig nmk
🔂i⏩1 nmk🍇
🍊😛🚮nmk i 0🍇
🍮➕sig i
🍉
🍉
🍮➕sum✖sig🅰️k
🍉
🍎➗sum🐕
🍉
🍉
설명
참고 : 이모 지 코드 0.5에서는 많은 이모 지 선택이 의미가 없습니다. 결국 0.x입니다. 0.6이이 문제를 해결합니다.
Emojicode는 제네릭, 프로토콜, 옵션 및 클로저를 특징으로하는 객체 지향 프로그래밍 언어이지만이 프로그램은 클로저를 사용하지 않으며 모든 제네릭과 프로토콜은 암시적인 것으로 간주 될 수 있지만 I / O 스텁에는 옵션 만 나타납니다.
프로그램은 몇 가지 유형에서만 작동합니다. 🚂는 정수 유형, 🔡는 문자열 유형 및 ⏩는 범위 유형입니다. 부울 (👌)도 몇 개 나타나지만 조건에서만 사용됩니다. 부울 값은 각각 👍 또는 👎이며, 각각 true 및 false에 해당합니다.
Emojicode에는 현재 연산자가 없으므로 일반적으로 연산자 인 비교, 비교 및 기타 작업은 함수로 구현되어 표현식에 접두사 표기법을 효과적으로 사용 합니다 . 운영자는 0.6에 계획되어 있습니다.
먼저 테스트 프로그램을 다루겠습니다.
🏁
이것은 다른 언어의 main과 비교할 수있는 🏁 블록입니다.
🍇 ... 🍉
포도와 수박은 그림 코드로 코드 블록을 선언합니다.
🍦str🔷🔡😯🔤Please enter a number🔤
이것은 "frozen"이라는 이름을 선언 str
하고이 값을 초기화 자 (생성자) 😯를 사용하여 생성 된 새 문자열로 설정합니다.이 문자열은 프롬프트를 문자열로 사용하여 사용자로부터 행을 입력합니다. 변수 대신 고정을 사용하는 이유는 무엇입니까? 변경되지 않으므로 변수가 경고를냅니다.
🍊🍦num🚂str 10
그것을 분해하자. 🚂str 10
에 🚂 메소드를 호출 str
규칙, 형식 변환의 이름을 해당 유형의 객체라는 방법으로 인수 (10) 냉동합니다. 10은 정수 변환에 사용되는 기본입니다. 이 메소드는 선택적을 리턴합니다 🍬🚂
. 선택 사항은 기본 유형의 값을 포함하거나 무의미도 포함 할 수 있습니다 (⚡). 문자열에 숫자가 없으면 ⚡이 반환됩니다. 값을 사용하려면 🍺을 사용하여 선택 사항을 래핑 해제해야합니다. 값이 ⚡이면 런타임 오류가 발생합니다. 따라서 옵션을 풀기 전에 아무것도 확인하지 않는 것이 좋습니다. 실제로 Emojicode는 그 약어를 사용하는 것이 일반적입니다. 일반적으로 🍊
"if"입니다.🍊🍦 variable expression
의미 : 표현을 평가합니다. 옵션에 아무것도 포함되어 있지 않으면 조건이 👎 (거짓)으로 평가됩니다. 그렇지 않으면 variable
옵션의 래핑되지 않은 값으로 고정 이름 이 만들어지고 조건은 👍, (true)로 평가됩니다. 따라서 정상적인 사용에서는 🍇 ... 🍉
조건에 따른 블록이 입력됩니다.
😀🔡🅰️num 10
🅰️은 파티션 수를 계산하는 🐋을 사용하여 주 코드가 🚂에 추가하는 방법입니다. num
조건부에서 선언 한 고정 된 상태에서 🅰️을 호출 하고 🔡 메서드로 밑 10을 사용하여 결과를 문자열로 변환합니다. 그런 다음 😀가 결과를 인쇄합니다.
🍓🍇 ... 🍉
🍓는 "else"를 의미하므로 사용자가 숫자를 올바르게 입력하지 않으면이 블록이 입력됩니다.
😀🔤Learn what a number is, you moron!🔤
문자열 리터럴을 인쇄합니다.
이제 메인 프로그램을 보자. 나는 ungolfed 버전을 설명 할 것이다; 골프 버전은 공백을 제거하고 변수 이름을 단일 문자 이름으로 바꿨습니다.
🐋🚂🍇 ... 🍉
🚂 클래스를 확장하십시오. 이것은 프로그래밍 언어에서 일반적으로 발견되지 않는 기능입니다. 🐋를 수퍼 클래스로 사용하여 새 클래스를 만드는 대신 🐋은 🚂를 직접 수정합니다.
🐖🅰️➡🚂🍇 ... 🍉
🚂를 반환하는 🅰️이라는 새 메서드를 만듭니다. 수식을 사용하여 계산 된 파티션 수를 반환합니다.a(n) = (1/n) * Sum_{k=0..n-1} sigma(n-k)*a(k)
🍊⬅🐕1🍇
🍎1
🍉
🐕는 다른 언어와 비슷 this
하거나 self
다른 언어로 메소드가 호출 된 객체를 나타냅니다. 이 구현은 재귀 적이므로 종료 조건입니다. 메소드가 호출 된 수가 1보다 작거나 같으면 1을 리턴하십시오.
🍮sum 0
새 변수를 작성하고 sum
0으로 설정하십시오. 내재적으로 🚂 유형을 가정합니다.
🔂k⏩0🐕
🔂는 🔂🐚⚪️ 프로토콜을 구현하는 모든 것을 반복하지만 ⏩는 🔂🐚🚂을 구현하는 범위 리터럴입니다. 범위에는 시작 값, 중지 값 및 단계 값이 있으며이 값은 1이면 1 start < stop
, 그렇지 않으면 -1로 가정합니다 . literal를 사용하여 범위 리터럴을 작성하여 단계 값을 지정할 수도 있습니다. 시작 값은 포함되지만 중지 값은 배타적이므로 수식에서 for k in range(n)
또는에 해당 Sum_{k=0..n-1}
합니다.
🍦nmk➖🐕k
n - k
즉, sigma (n-k) 또는 제수의 합을 계산해야 하며 인수가 몇 번 필요하므로 일부 바이트를 저장하기 위해 n - k
변수 nmk
에 저장합니다.
🍮sig nmk
🔂i⏩1 nmk
sig
변수를 sigma의 인수로 설정하고 1에서 1까지의 모든 숫자를 반복합니다 nmk - 1
. 변수를 0으로 초기화하고 1..nmk 이상 반복 할 수는 있지만이 방법은 짧습니다.
🍊😛🚮nmk i 0
🚮는 나머지를 계산하거나, 계수와 😛이 같은지 점검하므로, i
나눗셈의 경우 조건은 👍 입니다 nmk
.
🍮➕sig i
이것은 += -= >>=
이모티콘이없는 열등한 언어 로 된 오퍼레이터 패밀리 와 유사하게 전화로 할당 됩니다. 이 줄은로 쓸 수도 있습니다 🍮 sig ➕ sig i
. 따라서 내부 루프가 완료된 후의 sig
제수의 합 n - k
또는sigma(n - k)
🍮➕sum✖sig🅰️k
호출에 의한 또 다른 할당이므로 sigma(n - k) * A(k)
수식에서와 같이 총계에 추가 됩니다.
🍎➗sum🐕
마지막으로 합은 n으로 나눠지고 몫이 반환됩니다. 이 설명은 아마도 코드 자체를 작성하는 데 3 시간이 걸렸을 것입니다.