Tìm hiệu số BCD của một số


20

Chênh lệch BCD

Cho một số nguyên n, chuyển đổi nó thành BCD ( số thập phân được mã hóa nhị phân ) bằng cách thay thế mỗi chữ số thập phân bằng biểu diễn nhị phân 4 chữ số của nó

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

Sau đó xoay danh sách các chữ số nhị phân để tìm các số lớn nhất và nhỏ nhất, có thể được đại diện bởi danh sách này mà không cần sắp xếp lại.

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)

Chuyển đổi các số này thành số thập phân, coi danh sách các bit là nhị phân thông thường và trừ số nhỏ nhất từ ​​số lớn nhất:

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

Đầu ra là sự khác biệt của các số lớn nhất và nhỏ nhất được tìm thấy.

Các trường hợp thử nghiệm:

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

Câu trả lời:


7

Ngôn ngữ Wolfram (Mathicala) , 89 88 byte

Cảm ơn Jenny_mathy đã lưu 1 byte.

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

Hãy thử trực tuyến!

Điều này là không hiệu quả khủng khiếp, bởi vì nó tạo ra n vòng quay BCD của n , đó là cách nhiều hơn chúng ta cần. Chúng ta có thể làm cho việc này hiệu quả hơn một chút bằng cách lưu kết quả của việc Join@@vào kvà thay thế #ở cuối bằng Length@k. Điều đó cho phép chúng tôi tạo ra một biểu đồ phân tán khá dễ dàng:

nhập mô tả hình ảnh ở đây

Tôi thực sự bị thu hút bởi sự tương phản của cấu trúc địa phương và sự hỗn loạn nói chung.


Max@#-Min@#&tiết kiệm một byte. đúng?
J42161217

@Jenny_mathy Vâng, cảm ơn! :)
Martin Ender

1
Tôi đã thực hiện điều này từ các giải pháp của chúng tôi Max@#-Min@#&[#~FromDigits~2&/@Partition[s=Join@@(i=IntegerDigits)[i@#,2,4],Tr[1^s],1,1]]&89 byte VÀ hiệu quả. chết tiệt đó
J42161217

Trên thực tế, cốt truyện là một người cha lặp đi lặp lại. "Những đám mây hỗn loạn" xảy ra cứ sau 10 ^ n (cốt truyện "nhảy" và tạo ra một cái mới): 1-9,10-99,100-999... đây là một số zoom khác nhau: imgur.com/RXLMkco
J42161217 16/11/17

@Jenny_mathy chắc chắn, nhưng cấu trúc trong các khoảng này xuất hiện rất hỗn loạn (với các cấu trúc chỉ ở quy mô nhỏ hơn nhiều).
Martin Ender

6

Thạch , 13 byte

Dd4d2FṙJ$ḄṢIS

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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 byte

$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]

Hãy thử trực tuyến!

Các cuộc gọi .NET dài ngu ngốc để chuyển đổi sang / từ nhị phân thực sự làm tăng độ dài ở đây. ;-)

Chúng tôi lấy đầu vào là $args, bọc nó trong một chuỗi, sau đó đúc nó thành một char-array. Chúng tôi lặp qua từng chữ số, convertlấy chữ số toStringtrong cơ sở 2(nghĩa là biến chữ số thành số nhị phân), sau đó .padLeftbiến nó thành số nhị phân bốn chữ số. Mảng kết quả của chuỗi đó sau đó được -joined thành một chuỗi duy nhất và được đúc lại dưới dạng char-array trước khi được lưu vào $b.

Tiếp theo, chúng tôi lặp lại $b, điều này chỉ đảm bảo rằng chúng tôi lặp đủ số lần để tính cho mỗi vòng quay. Mỗi lần lặp, chúng ta bóc ký tự đầu tiên thành $xvà các ký tự còn lại $ysử dụng nhiều phép gán. Sau đó, chúng ta hợp nhất chúng lại với nhau $b=$y+$xđể di chuyển phần tử đầu tiên đến cuối, nghĩa là, xoay mảng một cách hiệu quả. Đó là -joined thành một chuỗi, được sử dụng làm đầu vào cho convertcuộc gọi để biến chuỗi từ cơ sở nhị phân 2thành một chuỗi Int64. Chúng tôi sau đó sorttất cả các số kết quả và lưu trữ chúng vào $c. Cuối cùng, chúng tôi lấy lớn nhất [-1]và trừ nhỏ nhất [0]. Đó là còn lại trên đường ống và đầu ra là ẩn.


4

Ohm v2 , 15 byte

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

Hãy thử trực tuyến!

Giải trình:

€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

JavaScript (ES6), 118 100 99 byte

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>

Chỉnh sửa: Đã lưu 11 byte nhờ @RickHitchcock. Đã lưu 1 byte nhờ @ETHproductions. Giải thích: 0x1Tiền tố làm cho đầu vào được lặp lại dưới dạng số thập lục phân, có nhị phân giống như BCD của số gốc với tiền tố 1 (Tôi nghĩ rằng đây là golfer hơn bất kỳ cách đệm nào khác với bội số của 4 chữ số) . Không bao gồm tiền tố được thay đổi từ 1 thành 0, chuỗi kết quả sau đó được xoay ở mỗi vị trí có thể và được chuyển đổi từ nhị phân trở lại thập phân. Cuối cùng, tối đa và tối thiểu được trừ.


1
@RickHitchcock Gói chuỗi trong backticks đôi ... trừ khi bạn muốn viết một cái gì đó giống như .join`` trong trường hợp bạn cần gấp ba backticks, v.v.
Neil

Ý tưởng tốt để sử dụng thập lục phân. Lưu 11 byte như thế này:n=>(g=m=>Math[m](...[...s=(+`0x1${n}`).toString(2).slice(1)]‌​.map(_=>`0b${s=s.sli‌​ce(1)+s[0]}`)))`max`‌​-g`min`
Rick Hitchcock

1
@RickHitchcock Cảm ơn, điều đó đã giúp tôi ... cắt ... 7 byte khác bằng cách loại bỏ một byte khác slice!
Neil

1
Các m=>Math[m]Bí quyết là tuyệt vời. Có lẽ thay đổi (+`0x1${n}`)để ('0x1'+n-0)hoặc tương tự?
Sản xuất ETH



3

Husk , 18 byte

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

Hãy thử trực tuyến!

Cần có một cách ngắn hơn để chuyển đổi một chữ số thành biểu diễn nhị phân 4 bit của nó ...

Giải trình

§-▼▲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 byte

Toàn thân chương trình. Lời nhắc cho số từ STDIN. In kết quả sang STDOUT.

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

Hãy thử trực tuyến!

 lời nhắc cho dòng văn bản từ STDIN

⍎¨ thực hiện (đánh giá) từng (ký tự)

(... )⊤ mã hóa (anti-base) trong hệ thống số sau:

4/2 bốn bit nhị phân

 hoán vị

, ravel (làm phẳng)

b← lưu trữ trong b(cho b inary)

 kèm theo (để chúng tôi sẽ sử dụng toàn bộ danh sách này cho mỗi vòng quay)

(... )⌽¨ xoay (trái) bởi mỗi người trong số các khoản sau:

≢b độ dài của b

tôi nghĩ về điều đó

2⊥¨ giải mã từng từ cơ sở-2.

(... ) áp dụng các chức năng ngầm sau đó

⌈/ tối đa (giảm giá)

- dấu trừ

⌊/ min (giảm giá)


bạn có thể dễ dàng đào tạo bit này: (⍳≢b) ⌽¨⊂b ←
ngn

hoặc thậm chí tốt hơn - sử dụng (≢, /,) thay vì rõ ràng (⍳∘≢⌽¨⊂)
ngn






2

Võng mạc , 96 89 byte

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

_

Hãy thử trực tuyến! Hơi chậm, vì vậy liên kết chỉ bao gồm một trường hợp thử nghiệm nhỏ. Chỉnh sửa: Đã lưu 7 byte nhờ @MartinEnder. Giải trình:

.
@@@$&

Tiền tố ba @s cho mỗi chữ số. (Chúng đại diện cho 0s của BCD, nhưng là golfer.)

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

Thay đổi @s thành _s (đại diện cho 1s của BCD) khi thích hợp.

T`E`@
\d
_

Sửa chữ số cuối của BCD.

.
$&$'$`¶

Tạo tất cả các phép quay.

O`

Sắp xếp chúng theo thứ tự tăng dần.

_
@_
+`_@
@__

Chuyển đổi chúng thành unary.

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

_

Trừ số đầu tiên từ số cuối cùng, bỏ qua các số trung gian và chuyển đổi thành số thập phân.


Không cần sử dụng %cho chuyển đổi nhị phân sang đơn nhất và bạn có thể tiết kiệm thêm một vài byte bằng cách sử dụng các ký tự khác ngoài 01cho nhị phân: tio.run/##K0otycxL/ Lỗi
Martin Ender

@MartinEnder Ồ, tôi nghĩ rằng đã có từ khi tôi đang cố gắng và không sử dụng một trong những thói quen chuyển đổi nhị phân của bạn ...
Neil

2

Haskell , 130 byte

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]

Hãy thử trực tuyến!

Giải thích / Ungolfed

Vì chúng ta sẽ sử dụng foldl1((+).(2*)) để chuyển đổi từ nhị phân sang thập phân, chúng tôi cũng có thể không sử dụng maximumminimumthay vào đó foldl1 max(hoặc tương tự với mintương ứng) và sử dụng một đoạn ngắn r = foldr1.

Bây giờ, hãy để chúng tôi xác định một toán tử f#x chuyển đổi xthành BCD, tạo ra tất cả các phép quay, giảm chúng bằng cách sử dụng fvà chuyển đổi nó thành số thập phân:

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

Bây giờ chỉ còn là vấn đề sử dụng toán tử này một lần với maxvà một lần với minvà trừ đi kết quả của họ:

f x = max#x - min#x

2

PHP, 156 153 byte

<?foreach(str_split($argv[1])as$n)$s.=str_pad(decbin($n),4,0,0);for(;$i<$a=strlen($s);)$r[]=bindec(substr($s,$i).substr($s,0,$i++));echo max($r)-min($r);

Hãy thử trực tuyến!


2

Japt -x , 20 byte

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

Hãy thử trực tuyến!

Nhập vào như một mảng các chữ số.

Giải trình:

®¤                      #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
Bạn có thể sử dụng -xcờ để lưu 2 byte.
Oliver



1

J, 43 byte

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

Hãy thử trực tuyến!

Đôi khi phong cách ngầm làm cho mọi thứ khó khăn. Nhưng có lẽ có một cách để làm điều đó theo kiểu ngầm mà ngắn gọn hơn nhiều so với cách này. Tôi nghĩ rằng tôi nhớ một cách tốt hơn để chia một số thành các chữ số khác "."0@":nhưng tôi dường như không thể nhớ lại ...

Giải trình

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

Việc chuẩn bị và loại bỏ 8 là để đảm bảo rằng có đúng số 0 (J sẽ định hình lại các mảng của nó thành kích thước của phần tử độ dài tối đa của chúng và 8 là 4 chữ số trong nhị phân để nó được sử dụng).


1

APL (NARS), 34 ký tự, 68 byte

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

một số thử nghiệm nhỏ:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.