숫자의 BCD 차이를 구합니다


20

BCD 차이

정수 n이 주어지면 각 10 진수를 4 자리 2 진수 표현으로 바꾸어 BCD ( 2 진 코드 10 진수 ) 로 변환하십시오.

 234 -> 0 0 1 0 0 0 1 1 0 1 0 0

그런 다음 다른 재 배열없이이 목록으로 표시 할 수있는 가장 큰 숫자와 가장 작은 숫자를 찾기 위해 이진수 숫자 목록을 회전하십시오.

max: 1 1 0 1 0 0 0 0 1 0 0 0  (the entire list rotated left 6 times)
min: 0 0 0 0 1 0 0 0 1 1 0 1 (the entire list rotated right 2 times)

비트 목록을 일반 이진으로 취급하고 가장 큰 값에서 가장 작은 값을 빼면이 숫자를 다시 십진수로 변환합니다.

1 1 0 1 0 0 0 0 1 0 0 0 -> 3336
0 0 0 0 1 0 0 0 1 1 0 1 -> 141

3336 - 141 -> 3195

결과는 발견 된 가장 큰 숫자와 가장 작은 숫자의 차이입니다.

테스트 사례 :

234 -> 3195
1234 -> 52155
12 -> 135
975831 -> 14996295
4390742 -> 235954919
9752348061 -> 1002931578825

답변:


7

Wolfram Language (Mathematica) , 89 88 바이트

1 바이트를 저장해 준 Jenny_mathy에게 감사합니다.

i=IntegerDigits;Max@#-Min@#&[#~FromDigits~2&/@NestList[RotateRight,Join@@i[i@#,2,4],#]]&

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

이것은 n 의 BCD의 n 회전을 생성하기 때문에 매우 비효율적 입니다. Join@@in 의 결과를 저장 하고 끝에 at를 k바꾸면 좀 더 효율적으로 만들 수 있습니다 . 이를 통해 산점도를 매우 쉽게 생성 할 수 있습니다.#Length@k

여기에 이미지 설명을 입력하십시오

나는 지역 구조와 전반적인 혼란의 대조에 정말로 흥미가있다.


Max@#-Min@#&바이트를 저장합니다. 권리?
J42161217

@Jenny_mathy 그래, 고마워! :)
Martin Ender

1
나는 우리의 솔루션에서 Max@#-Min@#&[#~FromDigits~2&/@Partition[s=Join@@(i=IntegerDigits)[i@#,2,4],Tr[1^s],1,1]]&89 바이트 효율적으로 만들었습니다 . 그 바이트 망할!
J42161217

: 사실 줄거리는 반복 patern.Those는 "혼란 구름"매 10 ^ N (플롯은 "점프"를 새로 만들) 일이되어 1-9,10-99,100-999... 여기에 몇 가지 서로 다른 줌을 : imgur.com/RXLMkco
J42161217에게

@Jenny_mathy는 확실하지만 이러한 간격 내의 구조는 매우 혼란스러워 보입니다 (구조는 훨씬 작은 규모로만).
Martin Ender

6

젤리 , 13 바이트

Dd4d2FṙJ$ḄṢIS

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

작동 원리

Dd4d2FṙJ$ḄṢIS  Main link. Argument: n

D              Decimal; convert n to base 10 (digit array).
 d4            Divmod 4; map each digit d to [d/4, d%4].
   d2          Divmod 2; map each [d/4, d%4] to [[d/8, d/4%2], [d%4/2, d%2]].
     F         Flatten the resulting 3D binary array.
      ṙJ$      Take all possible rotations.
         Ḅ     Convert each rotation from binary to integer.
          Ṣ    Sort the resulting integer array.
           I   Take the forward differences.
            S  Take the sum.


4

PowerShell , 153 바이트

$b=[char[]]-join([char[]]"$args"|%{[convert]::toString(+"$_",2).PadLeft(4,'0')})
($c=$b|%{$x,$y=$b;[convert]::ToInt64(-join($b=$y+$x),2)}|sort)[-1]-$c[0]

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

바이너리로 변환하거나 이진수로 변환하는 어리석은 긴 .NET 호출은 실제로 길이를 부풀립니다. ;-)

입력을로 가져 와서 $args문자열로 감싸고 char-array 로 캐스트합니다 . 각 숫자를 통해 우리는 루프, convert숫자 보내고 toString자료를 2(즉, 이진수로 자리를 돌려), 다음 .padLeft그것을 네 자리 진수를 확인합니다. 결과 문자열 배열은 -join단일 문자열 char로 변환되고에 저장되기 전에 배열로 다시 캐스팅됩니다 $b.

다음으로 루프 오버 $b합니다. 모든 회전을 설명하기에 충분한 시간을 반복합니다. 반복 할 때마다 첫 번째 문자를 벗기고 $x나머지 문자를 $y여러 할당 을 사용하여 벗 깁니다. 그런 다음, 그것들을 다시 병합 $b=$y+$x하여 첫 번째 요소를 끝으로 이동합니다. 즉, 효과적으로 배열을 하나씩 회전시킵니다. 즉있어 -join받는 입력으로 사용되는 문자열에 에드 convert이진 스트링베이스에서 우회전 호 2Int64. 그런 다음 sort모든 결과 번호를에 저장합니다 $c. 마지막으로 가장 큰 [-1]값을 빼고 가장 작은 값을 뺍니다 [0]. 그것은 파이프 라인에 남아 있으며 출력은 암시 적입니다.


4

옴 v2 , 15 바이트

€b4Ü. 0\;Jγó↕]a

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

설명:

€b4Ü. 0\;Jγó↕]a  Main wire, arguments: a (integer)

€       ;        Map the following over each digit of a...
 b                 Convert to binary
  4Ü               Right-justify w/ spaces to length 4
    . 0\           Replace all spaces with zeroes
         J       Join together binary digits
          γó     Get all possible rotations and convert back to decimal
            ↕    Find the minimum *and* maximum rotation
             ]a  Flatten onto stack and get the absolute difference

4

자바 스크립트 (ES6), 118 (100) 99 바이트

f=
n=>(g=m=>Math[m](...[...s=(`0x1`+n-0).toString(2)].map(_=>`0b${s=0+s.slice(2)+s[1]}`)))`max`-g`min`
<input type=number min=0 oninput=o.textContent=f(this.value)><pre id=o>

편집 : @RickHitchcock 덕분에 11 바이트가 절약되었습니다. @ETHproductions 덕분에 1 바이트를 절약했습니다. 설명 : 0x1접 두부가 입력을 16 진수로 다시 구문 분석합니다. 이진은 1의 접 두부가있는 원래 숫자의 BCD와 동일합니다 (4 자리의 배수로 채우는 다른 방법보다 골퍼라고 생각합니다) . 1에서 0으로 변경되는 접두사를 제외하고 결과 문자열은 가능한 각 위치에서 회전하고 2 진에서 10 진수로 다시 변환됩니다. 마지막으로 최대 값과 최소값을 뺍니다.


1
@RickHitchcock 문자열을 이중 백틱으로 감싸십시오 .join`` . 어떤 경우 에든 삼중 백틱 등이 필요한 경우 를 작성하지 않으려면
Neil

16 진수를 사용하는 것이 좋습니다. 이 같은 11 바이트 저장 :n=>(g=m=>Math[m](...[...s=(+`0x1${n}`).toString(2).slice(1)]‌​.map(_=>`0b${s=s.sli‌​ce(1)+s[0]}`)))`max`‌​-g`min`
릭 히치콕

1
@RickHitchcock 고마워요. 저도 도와주었습니다 ... 다른 7 바이트를 제거해서 또 다른 7 바이트를 제거했습니다 slice!

1
m=>Math[m]트릭은 중대하다. 아마도 변경 (+`0x1${n}`)('0x1'+n-0)또는 유사한?
ETHproductions



3

껍질 , 18 바이트

§-▼▲mḋUMṙNṁȯtḋ+16d

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

숫자를 4 비트 이진 표현으로 변환하는 더 짧은 방법이 있어야합니다.

설명

§-▼▲mḋUMṙNṁȯtḋ+16d
                 d    Get the list of digits of the input
          ṁȯ          For each digit...
              +16      add 16
             ḋ         convert to binary
            t          drop the first digit
       MṙN            Rotate the list by all possible (infinite) numbers
      U               Get all rotations before the first duplicated one
    mḋ                Convert each rotation from binary to int
§-▼▲                  Subtract the minimum from the maximum value

3

APL (Dyalog) , 31 바이트

전체 프로그램 본문. STDIN에서 번호를 묻습니다. 결과를 STDOUT에 인쇄합니다.

(⌈/-⌊/)2⊥¨(⍳≢b)⌽¨⊂b←,⍉(4/2)⊤⍎¨⍞

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

 STDIN에서 텍스트 줄을 묻습니다.

⍎¨ 각각의 (캐릭터)를 실행 (평가)

()⊤ 다음 숫자 시스템에서 인코딩 (반 염기) :

4/2 이진 비트

 바꾸어 놓다

, 라벨 (평평하게)

b← 저장 b( b inary)

 동봉 (각 회전마다이 전체 목록을 사용하도록 함)

()⌽¨ 다음과 같은 양만큼 회전합니다 (왼쪽).

≢b 의 길이 b

나는 그것의 ndices

2⊥¨ base-2에서 각각 디코딩하십시오.

() 그것에 다음의 암묵적 기능을 적용하십시오

⌈/ 최대 (-감소)

- 마이너스

⌊/ 최소 (-감소)


이 비트를 쉽게 훈련시킬 수 있습니다 : (⍳≢b) ⌽¨⊂b ←
ngn

또는 더 나은-명백한 (⍳∘≢⌽¨⊂) 대신 (≢, /, ⍨) 사용
ngn






2

망막 , 96 89 바이트

.
@@@$&
@(?=@@[89]|@[4-7]|[2367])
_
T`E`@
\d
_
.
$&$'$`¶
O`
_
@_
+`_@
@__
s`(_+).*\W\1

_

온라인으로 사용해보십시오! 다소 느리므로 링크에는 작은 테스트 사례 만 포함됩니다. 편집 : @MartinEnder 덕분에 7 바이트가 절약되었습니다. 설명:

.
@@@$&

@각 숫자 앞에 3 s를 붙입니다. (이것은 0BCD 의 s를 나타내지 만 골퍼입니다.)

@(?=@@[89]|@[4-7]|[2367])
_

적절한 경우 @s를 _s로 변경하십시오 ( 1BCD 의 s를 나타냄 ).

T`E`@
\d
_

BCD의 마지막 숫자를 수정하십시오.

.
$&$'$`¶

모든 회전을 생성하십시오.

O`

오름차순으로 정렬하십시오.

_
@_
+`_@
@__

단항으로 변환하십시오.

s`(_+).*\W\1

_

중간 숫자를 무시하고 마지막 숫자에서 첫 번째를 빼고 10 진수로 변환합니다.


이 사용할 필요 없습니다 %단항 변환 바이너리에 대한이 당신은 몇 가지 더가 아닌 다른 문자를 사용하여 바이트를 저장할 수 있습니다 01바이너리을 위해 : tio.run/##K0otycxL/...
마틴 청산

@MartinEnder 아, 나는 이진 변환 루틴 중 하나를 사용하려고 시도하지 않고 실패했을 때부터 일어났다 고 생각합니다.
Neil

2

하스켈 , 130 바이트

r=foldl1
f x=max#x-min#x
f#x|s<-show x=r((+).(2*)).r f.take(sum$4<$s).iterate(drop<>take$1)$do d<-s;mapM(pure[0,1])[1..4]!!read[d]

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

설명 / 언 골프

우리가 사용하는거야 때문에 foldl1((+).(2*))진수 바이너리 변환에서, 우리는뿐만 아니라 사용하지 않을 수도 maximumminimum오히려 foldl1 max(또는 같은과 min각각)와 짧은을 사용합니다 r = foldr1.

이제 BCD f#x로 변환 x하고 모든 회전을 생성하며이를 사용하여 줄이고 f10 진수로 변환 하는 연산자 를 정의하겠습니다 .

f # xs
  | s <- show xs
  = foldr1 ((+).(2*))                             -- convert from binary to decimal
  . foldr1 f                                      -- reduce by either max or min
  . take (4 * length s)                           -- only keep 4*length s (ie. all "distinct" rotations)
  . iterate (drop<>take $ 1)                      -- generate infinite list of rotations
  $ do d<-s; mapM (pure[0,1]) [1..4] !! read [d]  -- convert to BCD

이제이 연산자를 한 번만 사용 max하고 min결과를 뺀 후 한 번만 빼면됩니다.

f x = max#x - min#x


2

Japt -x , 20 바이트

®¤ùT4쬣ZéY ì2Ãn äa

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

숫자 배열로 입력하십시오.

설명:

®¤                      #Map each digit to base 2
  ùT4Ã                  #Pad each one to 4 places
      ¬                 #Join them to a single binary string
       ¬                #Split them to an array of single characters
        £      Ã        #For each index Y in that array:
         ZéY            # Get the array rotated Y times
             ì2         # Convert the array from binary to decimal
                n       #Sort the results
                  äa    #Get the absolute difference between each element
                        #Implicitly output the sum

1
-x플래그를 사용하여 2 바이트를 저장할 수 있습니다 .
Oliver



1

J, 43 바이트

3 :'(>./-<./)#.(i.@#|."0 1]),}.#:8,"."0":y'

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

때때로 암묵적인 스타일은 일을 어렵게 만듭니다. 그러나 이것보다 훨씬 간결한 스타일을 암묵적으로 처리하는 방법이있을 것입니다. 나는 숫자를 다른 숫자로 나누는 더 좋은 방법을 기억한다고 생각하지만 기억할 "."0@":수없는 것 같습니다 ...

설명

3 :'(>./-<./)#.(i.@#|."0 1]),}.#:8,"."0":y'
                                         y  the input (integer)
                                       ":   convert to string
                                   "."0     evaluate each char (split to digits)
                                 8,         prepend 8
                               #:           debase 2
                             }.             behead (remove the 8)
                            ,               ravel (flatten)
               (i.@#|."0 1])                create a list of rotations
                    |.    ]                   rotate the list
                      "0 1                    for each number on the left
                i.@#                          range 0 ... length - 1
             #.                             convert rotations back to base 10
    (>./-<./)                               max minus min

8을 앞에 추가하고 제거하는 것은 올바른 수의 0이 존재하도록하는 것입니다 (J는 배열을 최대 길이 요소의 크기로 재구성하고 8은 2 진수로 4 자리이므로 사용됩니다).


1

APL (NARS), 34 자, 68 바이트

{(⌈/-⌊/)2⊥¨{⍵⌽a}¨⍳≢a←∊⍉(4⍴2)⊤⍎¨⍕⍵}

약간의 테스트 :

  h←{(⌈/-⌊/)2⊥¨{⍵⌽a}¨⍳≢a←∊⍉(4⍴2)⊤⍎¨⍕⍵}
  h 9752348061
1002931578825
  h 0
0

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.