Schreiben Sie eine Funktion, die bei Angabe eines Puffers b
(1 - 104857600 Byte lang) und einer Anzahl von Bits n
(1 <= n <= 64) den Puffer in Bitblöcke aufteilt n
. Füllen Sie den letzten Block mit 0
s bis zu n
Bits mit der rechten Maustaste aus.
z.B
Geben Sie den Puffer b = "f0oBaR"
oder äquivalent [102,48,111,66,97,82]
und n = 5
zurück
[12, 24, 24, 6, 30, 16, 19, 1, 10, 8]
Dies liegt daran, dass der obige Puffer, wenn er als Binärdatei dargestellt wird, folgendermaßen aussieht:
01100110 00110000 01101111 01000010 01100001 01010010
Und wenn in 5s neu gruppiert sieht das so aus:
01100 11000 11000 00110 11110 10000 10011 00001 01010 010[00]
Welches, wenn es zurück in Dezimalzahl umgewandelt wird, die Antwort gibt.
Anmerkungen
- Sie können jeden Datentyp verwenden, der in Ihrer Sprache am sinnvollsten ist, um den Puffer darzustellen. In PHP würden Sie wahrscheinlich eine Zeichenfolge verwenden, in Node möchten Sie möglicherweise einen Puffer verwenden
- Wenn Sie eine Zeichenfolge zur Darstellung des Puffers verwenden, nehmen Sie an, dass es sich bei der Konvertierung char -> int um ASCII handelt
- Sie können ein Array von Ints (0-255) für die Eingabe verwenden, wenn Sie dies vorziehen
- Der Rückgabewert muss ein Array oder eine Liste von Ints sein
Testfälle
> b = "Hello World", n = 50
318401791769729, 412278856237056
> b = [1,2,3,4,5], n = 1
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1
> b = "codegolf", n = 32
1668244581, 1735355494
> b = "codegolf" n = 64
7165055918859578470
> b = "codegolf" n = 7
49, 91, 108, 70, 43, 29, 94, 108, 51, 0
> b = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque vel est eu velit lacinia iaculis. Nulla facilisi. Mauris vitae elit sapien. Nullam odio nulla, laoreet at lorem eu, elementum ultricies libero. Praesent orci elit, sodales consectetur magna eget, pulvinar eleifend mi. Ut euismod leo ut tortor ultrices blandit. Praesent dapibus tincidunt velit vitae viverra. Nam posuere dui quis ipsum iaculis, quis tristique nisl tincidunt. Aliquam ac ligula a diam congue tempus sit amet quis nisl. Nam lacinia ante vitae leo efficitur, eu tincidunt metus condimentum. Cras euismod quis quam vitae imperdiet. Ut at est turpis.", n = 16
19567, 29285, 27936, 26992, 29557, 27936, 25711, 27759, 29216, 29545, 29728, 24941, 25972, 11296, 25455, 28275, 25955, 29797, 29813, 29216, 24932, 26992, 26995, 25449, 28263, 8293, 27753, 29742, 8272, 25964, 27749, 28276, 25971, 29045, 25888, 30309, 27680, 25971, 29728, 25973, 8310, 25964, 26996, 8300, 24931, 26990, 26977, 8297, 24931, 30060, 26995, 11808, 20085, 27756, 24864, 26209, 25449, 27753, 29545, 11808, 19809, 30066, 26995, 8310, 26996, 24933, 8293, 27753, 29728, 29537, 28777, 25966, 11808, 20085, 27756, 24941, 8303, 25705, 28448, 28277, 27756, 24876, 8300, 24943, 29285, 25972, 8289, 29728, 27759, 29285, 27936, 25973, 11296, 25964, 25965, 25966, 29813, 27936, 30060, 29810, 26979, 26981, 29472, 27753, 25189, 29295, 11808, 20594, 24933, 29541, 28276, 8303, 29283, 26912, 25964, 26996, 11296, 29551, 25697, 27749, 29472, 25455, 28275, 25955, 29797, 29813, 29216, 28001, 26478, 24864, 25959, 25972, 11296, 28789, 27766, 26990, 24946, 8293, 27749, 26982, 25966, 25632, 28009, 11808, 21876, 8293, 30057, 29549, 28516, 8300, 25967, 8309, 29728, 29807, 29300, 28530, 8309, 27764, 29289, 25445, 29472, 25196, 24942, 25705, 29742, 8272, 29281, 25971, 25966, 29728, 25697, 28777, 25205, 29472, 29801, 28259, 26980, 30062, 29728, 30309, 27753, 29728, 30313, 29793, 25888, 30313, 30309, 29298, 24878, 8270, 24941, 8304, 28531, 30053, 29285, 8292, 30057, 8305, 30057, 29472, 26992, 29557, 27936, 26977, 25461, 27753, 29484, 8305, 30057, 29472, 29810, 26995, 29801, 29045, 25888, 28265, 29548, 8308, 26990, 25449, 25717, 28276, 11808, 16748, 26993, 30049, 27936, 24931, 8300, 26983, 30060, 24864, 24864, 25705, 24941, 8291, 28526, 26485, 25888, 29797, 28016, 30067, 8307, 26996, 8289, 28005, 29728, 29045, 26995, 8302, 26995, 27694, 8270, 24941, 8300, 24931, 26990, 26977, 8289, 28276, 25888, 30313, 29793, 25888, 27749, 28448, 25958, 26217, 25449, 29813, 29228, 8293, 29984, 29801, 28259, 26980, 30062, 29728, 28005, 29813, 29472, 25455, 28260, 26989, 25966, 29813, 27950, 8259, 29281, 29472, 25973, 26995, 28015, 25632, 29045, 26995, 8305, 30049, 27936, 30313, 29793, 25888, 26989, 28773, 29284, 26981, 29742, 8277, 29728, 24948, 8293, 29556, 8308, 30066, 28777, 29486
> b = [2,31,73,127,179,233], n = 8
2, 31, 73, 127, 179, 233
n
größer als 8 funktionieren ? Wenn ja, was ist mit Wertenn
größer als 64, was größer ist als die Ganzzahlgenauigkeit der meisten Sprachen?char
ist eine ganze Zahl , die zufällig ein Byte lang ist.Antworten:
Pyth,
1817 BytesDanke an @lirtosiast für ein Byte!
quelle
Jelly, 13 Bytes
Dies nimmt die Eingabe als eine Liste von ganzen Zahlen. Probieren Sie es online!
Wie es funktioniert
quelle
Julia, 117 Bytes
Dies ist eine Funktion, die ein Ganzzahl-Array und eine Ganzzahl akzeptiert und ein Ganzzahl-Array zurückgibt. Es ist eine Übung zum Missbrauch von Funktionsargumenten.
Ungolfed:
quelle
JavaScript (ES6), 120 Byte
Rekursives Bit-Twiddling auf Integer-Arrays. Ungolfed:
quelle
"(s,n)=>(s.replace(/./g,x=>(256+x.charCodeAt()).toString(2).slice(1))+'0'.repeat(n-1)).match(eval(`/.{${n}}/g`)).map(x=>+`0b${x}`)".length
Ruby, 114 Bytes
Etwas sauberer:
quelle
Python 3, 102 Bytes
Verwenden Sie den Iter-Trick , um die Zeichenfolge zu gruppieren
Ergebnisse
quelle
Perl 6,
9368 Bytesquelle
PHP,
262217189 Bytes(aktualisiert mit Tipps von Ismael Miguel )
Zur besseren Lesbarkeit formatiert:
Beispiel:
quelle
str_pad($s,8,'0',STR_PAD_LEFT)
können Sie verwendenstr_pad($s,8,0,0)
. Sie können die Anführungszeichen aufbindec
und entfernendecbin
, um 4 Bytes zu sparen. Um mehr zu sparen, können Siearray_map
in einer Variablen speichern und stattdessen übergeben. Hier gehts:function f($b,$n){$M=array_map;return$M(bindec,$M(function($x)use($n){return str_pad($x,$n,0);},str_split($M('',array_map(function($s){return str_pad($s,8,0,0);},$M(decbin,$b))),5)));}
(184 Bytes).implode
mit$M
zu though.CJam, 30 Bytes
Probieren Sie es online!
Dies ist ein unbenannter Block, der den int-Puffer und die Anzahl der Chunks auf dem Stapel erwartet und das Ergebnis auf dem Stapel belässt.
Beschlossen, CJam zu versuchen. Ich habe nur 2 Stunden dafür gebraucht ^^ Das ist wahrscheinlich zu lang, Vorschläge sind sehr willkommen!
Erläuterung
quelle
2b8T
anstatt2b8 0
ein Byte zu speichern (die VariableT
ist vorinitialisiert für0
). 2. Sie können den letzten Block mitW<
(die VariableW
ist initialisiert für-1
) oder);
(das letzte Element herausnehmen und verwerfen) verwerfen.JavaScript (ES6) 104
Iterativ Stück für Stück herumspielen,
Bearbeiten Sie 5 Bytes und speichern Sie das @Neil
Weniger golfen
Prüfung
quelle
x
Warum nicht jedes Mal diex
richtigeni
Bits verschieben, anstatt sie zu verdoppeln ?c-g?[...s,t<<c]:s
möglicherweise ein paar Bytes mehr sparen.J, 24 Bytes
Dies ist eine anonyme Funktion, die
n
als linkes Argument undb
als rechtes Argument Zahlen verwendet.Prüfung:
Erläuterung:
quelle
Haskell,
112109 BytesAnwendungsbeispiel:
5 # [102,48,111,66,97,82]
->[12,24,24,6,30,16,19,1,10,8]
.Wie es funktioniert
quelle
Java,
313306322 BytesIch hoffe, das schlägt PHP ... Und nein. Dumme lange Funktionsnamen.
-7 danke an @quartata für das Entfernen von public +16, um einen Fehler zu beheben, wenn der Split genau war, danke an @TheCoder für das Abfangen
quelle
o[]=new int[b.length()*8/s+1]
- Dies wird falsche Größe zuweisen, wenn(b.length()*8)%s==0
Ruby , 66 Bytes
Probieren Sie es online!
Nimmt den Eingabepuffer als Zeichenfolge, sodass einige Testzeichenfolgen direkt in der Fußzeile erstellt wurden, um nicht druckbare Zeichenfolgen zu vermeiden.
quelle
MATL , 9 Bytes
Probieren Sie es online!
Nimmt Eingaben
b
als Zeichenfolge, die durch''
oder als ein Array von durch Kommas getrennten Werten begrenzt[102, 48, 111]
istn
.quelle
Perl 5
-nl -MData::Dump=pp
, 96 BytesProbieren Sie es online!
Benötigt das
Data::Dump
Modul.Übernimmt
n
die erste Eingabezeile und die Zahlen in jeder Zeile danach.Ausgaben an STDERR (das Debug-Feld auf TIO).
Deparsed und aufgeräumt:
quelle
Powershell 146 Bytes
Nehmen Sie den Puffer auf und konvertieren Sie ihn in ein char-Array und dann in ein Integer-Array. Füllen Sie bei jeder Konvertierung in eine Binärdatei die Einträge bei Bedarf mit Nullen auf und fügen Sie sie zu einer großen Zeichenfolge zusammen. Teilen Sie diese Zeichenfolge in n Zeichen auf und löschen Sie die erstellten Leerzeichen. Jedes Element aus dem Split wird aufgefüllt (nur das letzte Element würde es wirklich brauchen) und wieder in eine Ganzzahl umgewandelt. Die Ausgabe ist ein Array
quelle
Python 3.5 -
312292 Bytes:Obwohl dies lang sein mag, ist dies meines Wissens der kürzeste Weg, um sowohl Funktionen als auch Arrays fehlerfrei zu akzeptieren und dennoch eine gewisse Genauigkeit in Python 3.5 beizubehalten .
quelle
Java,
253247 BytesGolf gespielt
Ungolfed
quelle
c, 2
=>c,2
;((l=f.length())%n)>0
=>(l=f.length())%n>0
;Jelly , 13 Bytes
Probieren Sie es online!
Anders als Dennis 'Antwort.
Hinweis: Die Eingabe ist eigentlich eine Liste nicht negativer Ganzzahlen, aber der TIO-Link erleichtert Ihnen die Arbeit und akzeptiert entweder eine solche Liste oder eine Zeichenfolge.
quelle
Stax , 12 Bytes
Führen Sie es aus und debuggen Sie es
Dies ist keine in der Challenge angegebene Funktion, sondern ein Programm, da stax keine Funktionen unterstützt. Es unterstützt die Eingabe von Strings oder Array-Literalen.
quelle
Python 2 , 101 Bytes
Probieren Sie es online!
quelle
Dyalog APL , 36 Bytes
Probieren Sie es online!
Dies könnte wahrscheinlich mehr Golf gespielt werden.
quelle
PHP , 135 Bytes
Probieren Sie es online!
Der als Funktion implementierte Eingabepuffer ist ein Array von Ints und gibt ein Array von Ints zurück.
Ausgabe
Überprüfen Sie alle Testfälle
quelle
APL (NARS), 471 Zeichen, 942 Byte
kommentierter Code und Test:
quelle
Elixier ,
63 bis60 BytesProbieren Sie es online!
Übernimmt die Eingabe als Elixir-Binärdatei und gibt eine Liste von Ganzzahlen aus.
Dieser Code verwendet das Verständnis des Elixir-Bitstring-Generators, um die Binäreingabe in Bitblöcke
&1
mit der als Argument angegebenen Größe aufzuteilen&2
. Um verbleibende Bits am Ende zu berücksichtigen, füllen wir die Binärdatei mit&2 - 1
Null-Bits auf. Hier ist auch die Stelle, an der unerwünschte Ausführlichkeit einsetzt: Elixir beklagt sich, wenn wir nicht ausdrücklich&1
als Bitstring deklarieren , und es unterstützt auch keine Ausdrücke insize(...)
, weshalb eine zusätzliche variable Zuweisung erforderlich ist.Osterei: in der Fußzeile, ersetzen Sie
IO.inspect
mitIO.puts
und unsere Funktion magisch „übersetzt“ Lorem ipsum aus dem Lateinischen zu Chinesisch - Probieren Sie es online!quelle