Ermitteln Sie die BCD-Differenz einer Zahl


20

BCD Unterschied

Konvertieren Sie eine Ganzzahl n in BCD ( binär codierte Dezimalzahl ), indem Sie jede Dezimalstelle durch ihre 4-stellige Binärdarstellung ersetzen

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

Drehen Sie dann die Liste der Binärziffern, um die größten und kleinsten Zahlen zu finden, die durch diese Liste ohne andere Umordnungen dargestellt werden können.

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)

Konvertieren Sie diese Zahlen zurück in eine Dezimalzahl. Behandeln Sie dabei die Liste der Bits als reguläre Binärzahl und subtrahieren Sie die kleinste von der größten:

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

Die Ausgabe ist die Differenz der größten und kleinsten gefundenen Zahlen.

Testfälle:

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

Antworten:


7

Wolfram Language (Mathematica) , 89 88 Bytes

Vielen Dank an Jenny_mathy für das Speichern von 1 Byte.

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

Probieren Sie es online!

Dies ist schrecklich ineffizient, weil es n Rotationen des BCD von n erzeugt , was weit mehr ist, als wir brauchen. Wir können machen dies ein wenig effizienter ist durch das Ergebnis der Einsparung Join@@in kund den Austausch #mit am Ende Length@k. So können wir ganz einfach ein Streudiagramm erstellen:

Bildbeschreibung hier eingeben

Der Kontrast zwischen lokaler Struktur und allgemeinem Chaos fasziniert mich sehr.


Max@#-Min@#&Speichert ein Byte. Recht?
J42161217

@Jenny_mathy Ja, danke! :)
Martin Ender

1
Ich habe dies aus unseren Lösungen Max@#-Min@#&[#~FromDigits~2&/@Partition[s=Join@@(i=IntegerDigits)[i@#,2,4],Tr[1^s],1,1]]&89 Bytes UND effizient gemacht. Verdammt noch mal!
J42161217

Tatsächlich ist die Handlung ein wiederholtes Muster. Diese "chaotischen Wolken" treten alle 10 ^ n auf (die Handlung "springt" und erzeugt eine neue): 1-9,10-99,100-999... Hier sind einige verschiedene Zooms: imgur.com/RXLMkco
J42161217

@ Jenny_mathy sicher, aber die Struktur innerhalb dieser Intervalle erscheint sehr chaotisch (mit Strukturen nur in viel kleineren Maßstäben).
Martin Ender

6

Jelly , 13 Bytes

Dd4d2FṙJ$ḄṢIS

Probieren Sie es online!

Wie es funktioniert

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]

Probieren Sie es online!

Blöde lange .NET-Aufrufe zum Konvertieren in / aus Binärdateien haben hier wirklich die Länge aufgebläht. ;-)

Wir nehmen Eingaben als $args, wickeln sie in eine Zeichenfolge ein und charwandeln sie dann in ein -array um. Wir durchlaufen jede Ziffer, indem wir convertdie Ziffer toStringin der Basis 2(dh die Ziffer in eine Binärzahl umwandeln) und dann .padLefteine vierstellige Binärzahl daraus machen. Das resultierende Array von Zeichenfolgen wird dann -joinin eine einzelne Zeichenfolge umgewandelt und als char-array neu umgewandelt, bevor es in gespeichert wird $b.

Als nächstes durchlaufen wir eine Schleife $b, was nur sicherstellt, dass wir genug Zeit haben, um jede Umdrehung zu berücksichtigen. Bei jeder Iteration schälen wir das erste Zeichen in $xund die verbleibenden Zeichen in $yMehrfachzuweisung ab. Dann fügen wir sie wieder zusammen $b=$y+$x, um das erste Element ans Ende zu verschieben, dh das Array effektiv um eins zu drehen. Das ist -joineine Zeichenfolge, die als Eingabe für den convertAufruf verwendet wird, um die Zeichenfolge von einer binären Basis 2in eine umzuwandeln Int64. Wir dann sortalle diese resultierenden Zahlen und speichern sie in $c. Schließlich nehmen wir das Größte [-1]und subtrahieren das Kleinste [0]. Das bleibt in der Pipeline und die Ausgabe ist implizit.


4

Ohm v2 , 15 Bytes

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

Probieren Sie es online!

Erläuterung:

€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>

Bearbeiten: 11 Bytes dank @RickHitchcock gespeichert. 1 Byte dank @ETHproductions eingespart. Erläuterung: Das 0x1Präfix bewirkt, dass die Eingabe als Hexadezimalzahl interpretiert wird, deren Binärzahl der BCD der ursprünglichen Nummer mit dem Präfix 1 entspricht (ich denke, dies ist besser als jede andere Art des Auffüllens auf ein Vielfaches von 4 Stellen). . Ohne das Präfix, das von 1 auf 0 geändert wird, wird die resultierende Zeichenfolge an jeder möglichen Position gedreht und von binär zurück in dezimal konvertiert. Schließlich werden das Maximum und das Minimum abgezogen.


1
@ RickHitchcock Wickeln Sie die Zeichenfolge in doppelte Backticks ... es sei denn, Sie möchten etwas schreiben, .join`` in welchem ​​Fall Sie dreifache Backticks usw. benötigen
Neil

Gute Idee, hexadezimal zu verwenden. Speichern Sie 11 Bytes wie folgt: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 Danke, das hat mir geholfen ... weitere 7 Bytes abzuspalten, indem ich auch noch eines entfernt slicehabe!
Neil

1
Der m=>Math[m]Trick ist großartig. Vielleicht wechseln (+`0x1${n}`)zu ('0x1'+n-0)oder ähnlich?
ETHproductions



3

Schale , 18 Bytes

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

Probieren Sie es online!

Es sollte einen kürzeren Weg geben, eine Ziffer in ihre 4-Bit-Binärdarstellung umzuwandeln ...

Erläuterung

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

Voller Programmteil. Fordert zur Eingabe einer Nummer von STDIN auf. Gibt das Ergebnis an STDOUT aus.

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

Probieren Sie es online!

 Eingabeaufforderung für Textzeile von STDIN

⍎¨ jedes (Zeichen) ausführen (auswerten)

()⊤ Verschlüsseln (Anti-Base) nach folgendem Zahlensystem:

4/2 vier binäre Bits

 transponieren

, Ravel (Abflachen)

b← speichern in b(für b inary)

 beifügen (damit wir diese gesamte Liste für jede Umdrehung verwenden)

()⌽¨ Rotieren (links) um jeweils folgende Beträge:

≢b Länge von b

Ich verstehe das

2⊥¨ Dekodiere jedes von Base-2.

() Wenden darauf die folgende implizite Funktion an

⌈/ die max (-reduktion)

- Minus

⌊/ die min (-reduktion)


Sie könnten dieses Bit leicht trainieren: (⍳≢b) ⌽¨⌽b ←
ngn

oder noch besser - benutze (≢, /, ⍨) anstelle des offensichtlichen (⍳∘≢⌽¨⍳∘≢⌽)
ngn 18.11.17






2

Retina , 96 89 Bytes

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

_

Probieren Sie es online! Da der Link etwas langsam ist, enthält er nur einen kleinen Testfall. Bearbeiten: 7 Bytes dank @MartinEnder gespeichert. Erläuterung:

.
@@@$&

@Stellen Sie jeder Ziffer drei s voran. (Diese stellen die 0s des BCD dar, sind aber Golfspieler.)

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

Ändern Sie gegebenenfalls das @s in _s (das 1s des BCD).

T`E`@
\d
_

Korrigieren Sie die letzte Ziffer des BCD.

.
$&$'$`¶

Generieren Sie alle Rotationen.

O`

Sortieren Sie sie in aufsteigender Reihenfolge.

_
@_
+`_@
@__

Konvertieren Sie sie zu unary.

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

_

Subtrahieren Sie die erste von der letzten Zahl, ignorieren Sie Zwischenzahlen und konvertieren Sie sie in Dezimalzahlen.


Es ist nicht erforderlich, %die Binär-zu-Unär-Konvertierung zu verwenden, und Sie können einige Bytes mehr sparen, indem Sie andere Zeichen als verwenden01 Binär zu Unär
Martin Ender

@MartinEnder Oh, ich denke, das Datum stammt aus der Zeit, als ich versucht habe, eine Ihrer binären Konvertierungsroutinen zu verwenden und es nicht geschafft habe ...
Neil,

2

Haskell , 130 Bytes

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]

Probieren Sie es online!

Erklärung / Ungolfed

Da wir foldl1((+).(2*))zur Konvertierung von Binär in Dezimal verwenden werden, können wir auch nicht maximumund minimum, sondern foldl1 max(oder dasselbe mit min) und eine Kurzform verwendenr = foldr1 .

Definieren wir nun einen Operator f#x, der xin BCD konvertiert , alle Rotationen generiert, diese mit reduziert fund in Dezimalzahlen konvertiert:

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

Jetzt geht es nur noch darum, diesen Operator einmal mit maxund einmal mit minihren Ergebnissen zu verwenden und sie zu subtrahieren:

f x = max#x - min#x

2

PHP, 156 153 Bytes

<?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);

Probieren Sie es online!


2

Japt -x , 20 Bytes

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

Probieren Sie es online!

Eingabe als Array von Ziffern.

Erläuterung:

®¤                      #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
Sie können das -xFlag verwenden, um 2 Bytes zu speichern.
Oliver



1

J, 43 Bytes

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

Probieren Sie es online!

Manchmal macht stillschweigender Stil die Sache schwierig. Aber es gibt wahrscheinlich eine Möglichkeit, es stillschweigend zu machen, die viel prägnanter ist als diese. Ich denke, ich erinnere mich an eine bessere Möglichkeit, eine Zahl in andere Ziffern als aufzuteilen"."0@": aber ich kann mich anscheinend nicht daran erinnern ...

Erläuterung

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

Das Voranstellen und Entfernen von 8 soll sicherstellen, dass die richtige Anzahl von Nullen vorhanden ist (J wird seine Arrays so umformen, dass sie die Größe ihres Elements mit maximaler Länge haben, und 8 ist 4-stellig in binärer Form, sodass es verwendet wird).


1

APL (NARS), 34 Zeichen, 68 Byte

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

ein kleiner Test:

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.