Berechnen Sie die binäre Split-Summe eines Wortes


22

Nehmen Sie einen String, sder druckbare ASCII-Zeichen enthält, als Eingabe und geben Sie dessen "binäre Split-Summe" aus. Benötigen Sie eine Erklärung?

Wie erhält man die binäre Split-Summe?

A4In der folgenden Erläuterung wird der String als Beispiel verwendet.

  • Konvertieren Sie die Zeichen in Binärzeichen und behandeln Sie jeden Buchstaben als 7-Bit-ASCII-Zeichen

    A -> ASCII 65 -> 1000001
    4 -> ASCII 52 -> 0110100
    
  • Verketten Sie die Binärzahlen zu einer neuen Binärzahl

    A4 -> 1000001 & 0110100 -> 10000010110100
    
  • Teilen Sie die neue Binärzahl in Teile auf, wobei kein 1a 0links davon stehen kann. Sie sollten nicht aufeinanderfolgende 1s teilen .

    10000010110100 -> 100000, 10, 110, 100
    
  • Konvertieren Sie diese Binärzahlen in Dezimalzahlen

    100000, 10, 110, 100 -> 32, 2, 6, 4
    
  • Nimm die Summe dieser Zahlen:

    32 + 2 + 6 + 4 = 44
    

Die Ausgabe für die Zeichenfolge A4sollte also lauten 44.


Testfälle:

a
49

A4
44

codegolf
570

Hello, World!
795

2
Ich denke, dass dies eine schönere Herausforderung ohne den ASCII-Konvertierungsschritt gewesen wäre, nur die (Dezimal-) Zahl nach Schritt 2 als Eingabe zu nehmen.
14.

Naja 8372eigentlich.
14.

1
@xnor, Sie könnten Recht haben und es wäre sauberer. Es hat mir Spaß gemacht, das in Octave zu lösen, und ich hoffe, andere werden es auch genießen :)
Stewie Griffin

Antworten:


12

Python 2 , 86 81 76 Bytes

-5 Bytes danke Adnan
-5 Bytes danke xnor

s=0
for c in input():s=s*128+ord(c)
print eval(bin(s).replace('01','0+0b1'))

Probieren Sie es online!

for c in input():s=s*128+ord(c)Um die ASCII-Konvertierung numerisch durchzuführen, wobei *128die Linksverschiebung s7 Mal (Schritte 1 und 2)
eval(('0'+new_bin).replace('01','0+0b1'))zum Teilen und Summieren (Schritte 3, 4 und 5) verwendet wird


Netter Trick mit dem eval! Durch die numerische ASCII-Konvertierung werden einige Bytes gespart.
Xnor

7

Gelee , 13 Bytes

Oḅ128BŒg;2/ḄS

Probieren Sie es online!

Wie es funktioniert

Oḅ128BŒg;2/ḄS  Main link. Argument: s (string)

O              Ordinal; map characters to their code points.
 ḅ128          Unbase 128; convert the resulting list from base 128 to integer.
     B         Binary; Convert the resulting integer to base 2.
      Œg       Group consecutive, equal bits.
        ;2/    Concatenate all non-overlapping pairs.
           Ḅ   Unbinary; convert from base 2 to integer.
            S  Take the sum.

Ich habe diesen Trick der Basisumwandlung schon einmal verpasst.
Jonathan Allan

Ach ja, schöner Trick!
Adnan

6

MATL , 14 Bytes

YB!'1+0*'XXZBs

Probieren Sie es online!

Erläuterung

Betrachten Sie die Eingabe 'A4'als Beispiel.

YB        % Implicit input. Convert to binary using characters '0' and '1'. 
          % Gives a char matrix, where each row corresponds to a number
          % STACK: ['1000001'; '0110100']
!         % Transpose. This is necessary because MATL uses column-major 
          % order when linearizing a matrix into a vector
          % STACK: ['10'; '01'; '01'; '00'; '01'; '00'; '10']
'1+0*'    % Push this string: regexp pattern
          % STACK: ['10'; '01'; '01'; '00'; '01'; '00'; '10'], '1+0*'
XX        % Regexp. Linearizes the first input into a row (in column-major
          % order), and pushes a cell array of substrings that match the
          % pattern given by the second input
          % STACK: {'100000'; '10'; 110'; '100'}
ZB        % Convert each string into a decimal number. Gives numeric vector
          % STACK: [32; 2; 6; 4]
s         % Sum. Implicitly display
          % STACK: 44

5

05AB1E , 18 Bytes

Code:

Çžy+b€¦JTR021:2¡CO

Erläuterung:

Ç                   # Take the ASCII value of each character
 žy+                # Add 128 to each value (to pad each with enough zeros)
    b               # Convert to binary
     €¦             # Remove the first character
       J            # Join the array
        TR021:      # Replace 01 by 021
              2¡    # Split on the number 2
                C   # Convert from binary to decimal
                 O  # Sum them all up

Verwendet die 05AB1E- Codierung. Probieren Sie es online!


5

05AB1E , 14 Bytes

Çžy+b€¦Jγ2ôJCO

Ein Port meiner Gelee-Antwort unter Verwendung des 128-Offsets von Adnans 05ab1e-Antwort (anstelle der 256 in der Gelee-Antwort, die ich geschrieben habe).

Probieren Sie es online!

Wie?

Çžy+b€¦Jγ2ôJCO
Ç              - to ordinals
   +           - add
 žy            - literal 128
    b          - to binary
     €         - for each
      ¦        -   dequeue
       J       - join
        γ      - group into chunks of equal elements
          ô    - split into chunks of
         2     - literal 2
           J   - join
            C  - from binary
             O - sum

3

JavaScript (ES6), 97 bis 92 Byte

s=>eval(s.replace(/./g,c=>(128+c.charCodeAt()).toString(2).slice(1)).replace(/1+/g,'+0b$&'))

Bearbeiten: 5 Bytes mit Hilfe von @ ConorO'Brien gespeichert.


Meine eigene Lösung war ebenfalls 97 Bytes: s=>eval([...s].map(e=>(e.charCodeAt()+128).toString(2).slice(1)).join``.replace(/1+0*/g,'+0b$&'))Sie können meine Ersetzungsmethode verwenden, um ein Byte zu speichern, denke ich
Conor O'Brien

1
@ ConorO'Brien Mehr als ein Byte, denke ich!
Neil

Oo, n i c e: D
Conor O'Brien

3

Japt , 18 12 Bytes

c_¤ùT7Ãò< xÍ
c_           // Firstly, take the input and map over it as charcodes.
  ¤          // Take the binary representation of each item
   ùT7       // and left-pad it with zeroes to standardize the items.
      Ã      // After all of the above,
       ò<    // partition the result where ever a 0 precedes a 1.
          xÍ // Then sum the numbers from base 2.

Übernimmt die Eingabe als einzelne Zeichenfolge.
Ich habe auch die 128- oder 256-Addition ausprobiert, die von anderen Antworten verwendet wurde, aber das Auffüllen mit 0 war kürzer.

Dank ETHproductions und Oliver satte 6 Bytes gespart .

Probieren Sie es hier aus.


Sie können hier mehr Auto-Funktionen verwenden: òÈ<YÃkann ò<(mit Leerzeichen) und Ën2Ãxkann sein xn2. Sie können auch Tanstelle von verwenden 0, um das Komma zu speichern. ( Besuchen Sie auch den Japt-Chatroom, wenn Sie Fragen haben oder beim Golfen helfen möchten :-))
ETHproductions

@ETHproductions Nochmals vielen Dank, vor allem für den TTrick, ich wusste nicht, dass Sie (ab) Variablen dafür verwenden können, das ist sehr praktisch. Die Auto-Funktion xn2sieht etwas seltsam aus, wenn sie kompiliert wird x("n", 2). Ich denke, es wird noch ein bisschen dauern, bis ich die dahinter stehende Logik vollständig verstanden habe. Mit Ihrer Hilfe ist die Japt-Lösung jetzt an erster Stelle mit der Jelly-Antwort verknüpft .
Nit

ETHproductions vor kurzem eine Abkürzung für n2: Í. Es hat TIO noch nicht getroffen, aber Sie können es hier verwenden: ethproductions.github.io/japt/?v=1.4.5&code=Y1+k+VQ3w/…
Oliver

@Oliver Wow, das ist eine hochaktuelle Sache, die noch nicht einmal in der Kurzreferenz für Interpreter behandelt wird. Vielen Dank!
Nit

2

Jelly , 16 15 Bytes

-1 Byte dank Dennis (keine Notwendigkeit, um 1 zu reduzieren, wenn eine vollständige Reduzierung in Ordnung ist - ersetzen ;/durch F)

O+⁹Bṫ€3FŒg;2/ḄS

Probieren Sie es online!

Wie?

O+⁹Bṫ€3FŒg;2/ḄS - Main link: list of characters, s    e.g. "A4"
O               - cast to ordinal (vectorises)        [65,52]
  ⁹             - literal 256
 +              - add (vectorises)                    [321, 308]
   B            - convert to binary (vectorises)      [[1,0,1,0,0,0,0,0,1],[1,0,0,1,1,0,1,0,0]]
    ṫ€3         - tail €ach from index 3              [[1,0,0,0,0,0,1],[0,1,1,0,1,0,0]]
       F        - reduce with concatenation           [1,0,0,0,0,0,1,0,1,1,0,1,0,0]
        Œg      - group runs of equal elements        [[1],[0,0,0,0,0],[1],[0],[1,1],[0],[1],[0,0]]
          ;2/   - pairwise reduce with concatenation  [[1,0,0,0,0,0],[1,0],[1,1,0],[1,0,0]]
             Ḅ  - convert from binary (vectorises)    [32,2,6,4]
              S - sum                                 44

1
;/kann durch ersetzt werden F.
Dennis

2

PHP, 116 Bytes

for(;$c=ord($argn[$i++]);)$r.=sprintf("%07b",$c);$t=mb_split("(?<=0)(?=1)",$r);echo array_sum(array_map(bindec,$t));

Online Version

PHP, 117 Bytes

for(;$c=ord($argn[$i++]);)$r.=sprintf("%07b",$c);$t=preg_split("#0\K(?=1)#",$r);echo array_sum(array_map(bindec,$t));

Probieren Sie es online!

PHP, 120 Bytes

for(;$c=ord($argn[$i++]);)$r.=sprintf("%07b",$c);preg_match_all("#1+0+#",$r,$t);foreach($t[0]as$b)$s+=bindec($b);echo$s;

Probieren Sie es online!

oder

for(;$c=ord($argn[$i++]);)$r.=sprintf("%07b",$c);preg_match_all("#1+0+#",$r,$t);echo array_sum(array_map(bindec,$t[0]));


1

[F #], 249 245 Bytes

open System
let rec c a=function|[]->[a]|'0'::'1'::y->(a+"0")::(c""('1'::y))|x::y->c(a+string x)y
let x i=c""(String.Join("",(Seq.map(fun c->Convert.ToString(int c,2).PadLeft(7,'0'))i))|>Seq.toList)|>Seq.map(fun c->Convert.ToInt32(c,2))|>Seq.sum

Probieren Sie es online!

Hinweis: Die Version auf tio.run hat "open System" im Header. Ich habe die Anzahl zum obigen Code hinzugefügt. Ich bin mir nicht sicher, welche Regeln für Importe gelten.

Ungolfed

let rec convert acc = function
    | [] -> [acc]
    | '0'::'1'::xs -> (acc + "0") :: (convert "" ('1'::xs))
    | x::xs -> convert (acc + string x) xs

let calculateSum input =
    let binary = Seq.map (fun x -> Convert.ToString(int x, 2).PadLeft(7, '0')) input

    String.Join("", binary)
    |> Seq.toList
    |> convert ""
    |>Seq.map (fun x -> Convert.ToInt32(x, 2))
    |>Seq.sum

Wenn open Systemes dasselbe wie C # using System;ist, müssen Sie es in die Zählung einbeziehen. Wenn du es in F # schaffst, könntest du dich voll qualifizieren, für was auch immer das Systemist. Zum Beispiel in C # System.Console...anstelle vonusing System;Console...
TheLethalCoder

@TheLethalCoder Es ist das gleiche, ja. Vielen Dank für die Klarstellung :) Ich habe mich für die Version "open .." entschieden, da nicht nur String, sondern auch Convert in diesem Namespace vorkommen.
Brunner


0

J , 34 Bytes

[:+/@(,#.;.1~1,1=2#.\,)(7#2)#:3&u:

Probieren Sie es online!

Erläuterung

[:+/@(,#.;.1~1,1=2#.\,)(7#2)#:3&u:  Input: array of characters S
                              3&u:  Get ASCII values of each character
                       (7#2)        Array with 7 copies of the value 2
                            #:      Convert each value to a base 2 array with length 7
[:  (                 )             Operate on those binary values
                     ,                Flatten it
                 2  \                 For each infix of size 2
                  #.                    Convert it to decimal from binary
               1=                     Test each value for equality to 1
             1,                       Prepend a 1
      ,                               The flattened binary values
         ;.1~                         Chop that at each occurrence of a 1
       #.                               Convert each chop from binary to decimal
 +/@                                Reduce by addition

0

Mathematica 193 Bytes

f=FromDigits;l=Flatten;(S=Split@l@Table[PadLeft[IntegerDigits[ToCharacterCode@#,2][[k]],7],{k,StringLength@#}];Plus@@Table[f[RealDigits@f@Join[S[[i]],S[[i+1]]],2],{i,1,Length@S-1,2}]+Last@l@S)&

Sie können 7 Bytes einsparen, indem Sie f=FromDigits;l=Flatten;zu Beginn alle Instanzen dieser beiden Funktionen durch fund ersetzen l.
numbermaniac

0

J , 40 Bytes

+/>#.&.>(1,}.|.1 0 E.|.b)<;.1 b=.,#:a.i.

Verwendung:

+/>#.&.>(1,}.|.1 0 E.|.b)<;.1 b=.,#:a.i.'A4'

gibt 44 zurück


0

Clojure, 150 Bytes

#(loop[[c & C](for[i % j[64 32 16 8 4 2 1]](mod(quot(int i)j)2))p 0 r 0 R 0](if c(if(=(dec c)p 0)(recur C c 1(+ R r))(recur C c(+(* 2 r)c)R))(+ R r)))

Ich hatte gehofft, dass die Konvertierung von ASCII in Bytes kürzer ist. Der eigentliche Schleifenkörper ist ziemlich kurz, rum das aktuelle Ergebnis und Rdas Gesamtergebnis zu akkumulieren. Wenn das vorherige Bit pist 0und das aktuelle Bit cist 1dann teilen wir uns einen neuen Brocken und reichern sich an R, sonst aktualisieren wir die rund halten , Rwie es war.


0

Python 123 Bytes

lambda w:sum(map(lambda x:int(x,2),"".join(map(lambda x:bin(ord(x))[2:].zfill(7),list(w))).replace("01","0:1").split(":")))

Aktualisiert, danke an Martin Ender.


1
Willkommen bei PPCG! Alle Antworten müssen entweder vollständige Programme oder aufrufbare Funktionen sein (im Gegensatz zu Snippets, bei denen die Eingabe in einer fest codierten Variablen gespeichert ist). Die Funktion kann jedoch unbenannt sein. Die Angabe eines lambda w:würde ausreichen, um Ihre Antwort gültig zu machen.
Martin Ender

Entschuldigung, ich habe das wahrscheinlich nicht gut formuliert. Ihre Bearbeitung ist weiterhin ungültig, da a) die Eingabe fest codiert ist, b) wenn es sich um ein vollständiges Programm handelt, wird das Ergebnis nicht gedruckt. Für ein vollständiges Programm müssen Sie die Eingabe von der Standardeingabe oder einem Befehlszeilenargument lesen und das Ergebnis in der Standardausgabe ausgeben. Deshalb habe ich gesagt, dass es wahrscheinlich am einfachsten ist, wenn Sie es als Funktion durch Hinzufügen übermitteln lambda w:.
Martin Ender

Ohhh, Ok, ich verstehe, es wäre genug wie folgt: f = lambda w: summe (map (lambda x: int (x, 2), "". Join (map (lambda x: bin (ord (x) ) [2:]. Zfill (7), liste (w))). Replace ("01", "0: 1"). Split (":")))
ShadowCat

Ja, das ist gültig. Sie brauchen das nicht einmal f=, weil wir unbenannte Funktionen zulassen (es sei denn, Sie geben den Funktionsnamen für rekursive Aufrufe an).
Martin Ender

0

K (oK) , 31 Bytes

Lösung:

+/2/'_[;x]&x&~~':x:,/(7#2)\'`i$

Probieren Sie es online!

Beispiele:

+/2/'_[;x]&x&~~':x:,/(7#2)\'`i$,"a"
49
+/2/'_[;x]&x&~~':x:,/(7#2)\'`i$"A4"
44
+/2/'_[;x]&x&~~':x:,/(7#2)\'`i$"codegolf"
570
+/2/'_[;x]&x&~~':x:,/(7#2)\'`i$"Hello, World!"
795

Erläuterung:

Konvertieren Sie in ASCII-Werte, konvertieren Sie in 7-Bit-Binärdateien, reduzieren Sie die Werte, suchen Sie nach Unterschieden und vergleichen Sie die ursprüngliche Liste mit 1Unterschieden. Schneiden Sie bei diesen Indizes, konvertieren Sie zurück in Dezimalzahl und summieren Sie:

+/2/'_[;x]&x&~~':x:,/(7#2)\'`i$ / the solution
                            `i$ / convert to integer
                     (7#2)      / draw from 2, 7 times => 2 2 2 2 2 2 2
                          \'    / decode each (convert to binary)
                   ,/           / flatten
                 x:             / save as x
             ~~':               / not-not-each previous (differ)
            &                   / and with
           x                    / x
          &                     / indices where true
     _[;x]                      / projection, cut x at ...
  2/'                           / encode each (convert from binary)
+/                              / sum up

Bonus

Verwaltete auch eine 31-Byte- Version in K4 , aber da es keinen TIO dafür gibt, veröffentliche ich meine OK-Lösung.

+/2/:'_[;x]@&x&~~':x:,/1_'0b\:'

0

APL (Dyalog) , 30 Bytes

{+/2⊥¨(1∘+⊆⊢)∊¯7↑¨2⊥⍣¯1¨⎕UCS⍵}

Probieren Sie es online!

Wie?

⎕UCS⍵ - Unicodify

2⊥⍣¯1¨ - jeweils binär codieren

¯7↑¨ - und links mit Nullen auf 7 Stellen auffüllen

- ebnen

1∘+⊆⊢ - Selbstaufteilung um eins erhöht

2⊥¨ - Dekodiere jedes aus dem Binären

+/ - Summe

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.