현명한 번호 만들기 회전 ! 스택 하단을 상단으로

와이즈 는 내가 디자인 한 간단한 비트 언어입니다. 그것은 파이썬의 비트 연산을 기반으로 합니다 . 여기에는 몇 가지 작업이 있으며 대부분의 작업은 Python의 해당 기호와 동일하거나 매우 유사합니다.

  • : 스택 상단 복제

  • ? 스택 상단을 하단으로 회전

  • ! 스택 하단을 상단으로 회전

  • [ ] 스택의 상단이 0이 아닌 동안 루프

  • ~스택의 상단이 아님 ( -(n+1))

  • -스택 상단을 무효화합니다 ( -n)

  • >스택 상단을 오른쪽으로 한 번 비트 시프트 ( n//2)

  • <스택 상단을 왼쪽으로 한 번 비트 시프트 ( n*2)

  • ^x 또는 스택의 상위 두 항목 ( Python과 동일 )

  • |또는 스택의 상위 2 개 항목 ( Python과 동일 )

  • &스택의 상위 2 개 항목 ( Python과 동일 )


Wise에서 정수를 만드는 것은 매우 간단합니다 .0으로 ::^만들고 증가 시킬 수 ~-있으므로 0으로 만들고 여러 번 증가시킵니다. 그러나 우리가 -물건 을 제거하면 조금 더 흥미로워집니다.

나머지 작업을 사용하여 모든 번호를 만들 수 있습니다. 예를 들어 여기 3입니다

~<<~

TIO

이것은 ~무한 0비트 열 인 0 을 음수 비트, 무한한 비트 열로 바꾸고 , 끝에 비트를 추가 하기 때문에 끝날 때 1마다 비트를 s 의 문자열로 바꾸고 두 개의 s 로 바꿉니다. 또는 대부분의 사람들이 3이라고 부릅니다.<0~01


직무

양의 정수가 주어지면 소스 (출력 소스, 자신의 소스에서 사용할 수 있음) 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인스턴스 는 다음과 같습니다 . 유일한 제한 사항은 최종 결과 는 동일한 소스 유형을 사용해야한다는 것 입니다. 인스턴스는 완전히 게 으르므로 평가조차하지 않습니다 .(->) aax <$ f = fmap (const x) f = const x . f = const xfconst xaf

또는 길이는 같지만 덜 악합니다 ( (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 답변과 같은 아이디어를 사용하지만 대체 문자열이 다릅니다 (즉, 이진 표현 사용)


답변

05AB1E , 11 바이트

bS'<…~<~‚èJ

온라인으로 사용해보십시오!

ETHproductions의 Japt 답변과 유사합니다.

@Adnan 덕분에 4 바이트가 절약되었습니다!


답변

파이썬 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)+"<"

온라인으로 사용해보십시오!

더 짧을 수도 있지만 여기에 내 해결책이 있습니다. 이진 표현을 사용하여 코드로 변환합니다.