와이즈 는 내가 디자인 한 간단한 비트 언어입니다. 그것은 파이썬의 비트 연산을 기반으로 합니다 . 여기에는 몇 가지 작업이 있으며 대부분의 작업은 Python의 해당 기호와 동일하거나 매우 유사합니다.
-
:
스택 상단 복제 -
?
스택 상단을 하단으로 회전 -
!
스택 하단을 상단으로 회전 -
[
]
스택의 상단이 0이 아닌 동안 루프 -
~
스택의 상단이 아님 (-(n+1)
) -
-
스택 상단을 무효화합니다 (-n
) -
>
스택 상단을 오른쪽으로 한 번 비트 시프트 (n//2
) -
<
스택 상단을 왼쪽으로 한 번 비트 시프트 (n*2
) -
^
x 또는 스택의 상위 두 항목 ( Python과 동일 ) -
|
또는 스택의 상위 2 개 항목 ( Python과 동일 ) -
&
스택의 상위 2 개 항목 ( Python과 동일 )
Wise에서 정수를 만드는 것은 매우 간단합니다 .0으로 ::^
만들고 증가 시킬 수 ~-
있으므로 0으로 만들고 여러 번 증가시킵니다. 그러나 우리가 -
물건 을 제거하면 조금 더 흥미로워집니다.
나머지 작업을 사용하여 모든 번호를 만들 수 있습니다. 예를 들어 여기 3입니다
~<<~
이것은 ~
무한 0
비트 열 인 0 을 음수 비트, 무한한 비트 열로 바꾸고 , 끝에 비트를 추가 하기 때문에 끝날 때 1
마다 비트를 s 의 문자열로 바꾸고 두 개의 s 로 바꿉니다. 또는 대부분의 사람들이 3이라고 부릅니다.<
0
~
0
1
직무
양의 정수가 주어지면 소스 (출력 소스, 자신의 소스에서 사용할 수 있음) n
없이 숫자 를 생성하는 Wise 프로그램을 출력하는 프로그램을 작성하십시오 . 스택 맨 위에 이미 0이 있다고 가정 할 수 있습니다.-
-
이것은 메타 골프가 아닌 코드 골프 이므로 반드시 출력이 아닌 생성 소스 코드를 최소화하는 것을 목표로 해야합니다.
출력 예
이 목록은 완전한 것이 아니며 단순히 가능한 출력입니다.
1 -> ~<~
2 -> ~<~<
3 -> ~<<~
4 -> ~<~<<
5 -> ~<~:<<|
6 -> ~<<~<
7 -> ~<<<~
8 -> ~<~<<<
9 -> ~<~:<<<|
10 -> ~<~:<<|<
11 -> ~<<~:><<<|
12 -> ~<<~<<
13 -> ~<<~:<<<|>
14 -> ~<<<~<
15 -> ~<<<<~
16 -> ~<~<<<<
답변
Japt , 10 바이트
¤d0'<1"~<~
기본 아이디어는 : 수의 이진 표현을하고,지도 0
에 <
와 1
에 ~<~
. 1-10의 출력 :
1: ~<~
2: ~<~<
3: ~<~~<~
4: ~<~<<
5: ~<~<~<~
6: ~<~~<~<
7: ~<~~<~~<~
8: ~<~<<<
9: ~<~<<~<~
10: ~<~<~<~<
답변
자바 스크립트 (ES6), 34 33 바이트
f=n=>n?f(n&1?~n:n/2)+'<~'[n&1]:''
<input type=number oninput=o.textContent=f(this.value)><pre id=o>
모든 32 비트 정수에서 작동합니다.
답변
하스켈 , 38 바이트
PPCG가 실제로 Haskell을 개선하고있는 것 같습니다. 흰 고양이를 치기.
f n=mapM(["<","~<~"]<$f)[1..n]!!n>>=id
f
를 가져와 a Int
를 반환합니다 String
.
(그런 식으로 말하고 <$f
있습니다. 이상 문자를 저장합니다 \_->
.)
(type의 함수)에 대한
Functor
인스턴스 는 다음과 같습니다 . 유일한 제한 사항은 최종 결과 는 동일한 소스 유형을 사용해야한다는 것 입니다. 인스턴스는 완전히 게 으르므로 평가조차하지 않습니다 .(->) a
a
x <$ f = fmap (const x) f = const x . f = const x
f
const x
a
f
또는 길이는 같지만 덜 악합니다 ( (l!!)
익명 함수 임).
(l!!)
l=(++)<$>"":tail l<*>["<","~<~"]
이 두 가지 모두 @ETHproductions의 Japt 답변과 동일한 표현을 사용하지만 특히 첫 번째는 처음에 중복을 줄 수 있습니다 <
.
첫 번째는 문자열 n
"<"
과 "~<~"
문자열 의 모든 조합을 계산 한 다음 결과 목록으로 색인합니다.
두 번째 는 목록에 이미있는 각 요소에 문자열을 ""
추가 "<"
하고 "~<~"
문자열을 추가하여 새로운 요소를 구성하고 생성하여 형성된 무한 목록을 재귀 적으로 계산 합니다 (실제로 ""
가져 오는 것이 약간 짧았 "<"
습니다).
답변
루비 , 118 116 109 107 105 91 바이트
cyoce 덕분에 2 바이트를 절약했습니다!
->n{o={0=>""}
o.dup.map{|c,k|["~~c","<c*2"].map{|t|o[eval t[1..9]]=k+t[0]}}until o[n]
o[n]}
이것은 정수를 입력으로 받아서 Wise에서 해당 정수를 나타내는 문자열을 반환하는 함수입니다. ungolfed version here 에서이 프로그램을 1부터 모든 정수까지 테스트합니다.
기본 아이디어는 상수의 “풀”을 기록하는 것입니다. 그런 다음, 각 “단계”와 함께 상수가 가능한 각 기능에 대해 풀에 추가됩니다. 나는 모든 숫자를 나타내기에 충분하다고 생각되는 함수 ~
, <
및 을 선택했습니다 >
. (적어도 10,000 이하의 모든 숫자)
답변
Python2, 54 52 51 바이트
lambda x:'<'.join('>~<~'*int(i)for i in bin(x)[2:])
2 바이트를 절약 한 Wheat Wizard와 1 바이트를위한 Ørjan Johansen에게 감사드립니다! 이것은 ETHproduction의 Japt 답변과 같은 아이디어를 사용하지만 대체 문자열이 다릅니다 (즉, 이진 표현 사용)
답변
답변
파이썬 2 , 123110 바이트
def w(x):a=map(int,bin(x)[2:]);return x%2*("~<~:<"+"<".join(":"*e for e in a[-2::-1])+"|"*sum(a))or w(x/2)+"<"
또한 lambda
w=lambda x:x%2*("~<~:<"+"<".join(":"*int(e)for e in bin(x)[-2:2:-1])+"|"*sum(map(int,bin(x)[2:])))or w(x/2)+"<"
더 짧을 수도 있지만 여기에 내 해결책이 있습니다. 이진 표현을 사용하여 코드로 변환합니다.