Können Sie Barcodes in einer Bar codieren?

12

Willkommen in der piNapple Bar in Melbourne. Die besten Code-Golfer sind hier, mit ihren Laptops, Cocktails und immer schlechterem Programm.

Ich habe das besondere Bedürfnis, den letzten Punkt noch einmal zu betonen. Immer schlimmer. Alkohol kann lustige Dinge mit der Programmierlogik tun.

Also - ein paar Golfer versuchten sich an verschachtelten Quinen in immer exotischeren Sprachen. Jemand hatte den vierten Befehl in INTERCAL ausgeführt. Dann hörte der Alkoholfluss auf. Betrunken löschte er versehentlich die Barcode-Lesealgorithmen von einem völlig anderen Computer ... der nicht einmal mit einem Netzwerk verbunden war! (Kinder - nicht INTERCAL. Für dich. Für deine Familie.)

Normalerweise wäre dies kein großes Problem. Einige Golfer hatten das System jedoch schon vor Jahren entwickelt, und keiner der Barcodes war Standard. Angenommen, Einsen sind Zeilen und Nullen sind Leerzeichen. Sie beginnen alle mit 101 und enden mit 1001. Alles in der Mitte ist 7-Bit-ASCII-codiert.

Der Barkeeper verfügt über einen ausgefallenen Barcode-Leser, der je nach Programm eine beliebige Zeichenfolge (mit weniger als 300 Bit) von Einsen und Nullen über STDIN, Argument oder Datei ausgibt. Und es kann vorwärts oder rückwärts kommen, je nachdem, wie die Flasche gehalten wird. Ihr Programm muss die Zeichenfolge aus der Mitte des Barcodes über STOUT oder die Datei zurückgeben.

Leider hat er nicht so viel für seinen Speicher ausgegeben, so dass das Programm mit der kürzesten Quelle ausgewählt wird und kostenlose Getränke und betrunkene Programmier-Tutorials von den anderen Golfern gewonnen werden.

Viel Glück!

Lochok
quelle
7
Mit anderen Worten, bestimmen Sie, ob die Eingabe 101...1001oder ist, 1001...101und kehren Sie sie in letzterem Fall um, und packen Sie dann die Mitte in Bytes.
John Dvorak
1
Völlig genau. Aber was macht das für einen Spaß? : p
lochok

Antworten:

9

GolfScript, 30 Zeichen

.-1%]$1=3>7/);{{1&}%2base}%""+

Die Eingabe erfolgt über STDIN. Beispiel :

> 1011000001100001010000111001
ABC

> 1001110000101000011000001101
ABC
Howard
quelle
1

J - 35 Bytes

_7(a.{~#.)\_4}.3}.|.^:([:-.2{])"."0

Erklärung kommt später :).

jpjacobs
quelle
4
Wie viel später? ;-)
Tim
0

Pyth , 21

smCid2c:?zv@z2_z3_4 7

Erläuterung:

        ?zv@z2_z           Input if 3rd character of input is 1, else reversed input.
       :        3_4        Slice out the middle portion, ASCII of the above string.
      c             7      Chop into 7 character chunks.
 mCid2                     Convert each chunk from binary to integer, then to a character.
s                          Sum up the characters into a string and print.

Beachten Sie, dass die Frage zwar älter als die Sprache ist, die Existenz der Frage jedoch keinen Einfluss auf die Gestaltung der Sprache hatte, da ich die Frage heute noch nicht gesehen habe.

Trotzdem sind Regeln Regeln, also mache ich es CW.

isaacg
quelle
OK, dann mache ich es CW.
isaacg
0

AWK, 116 Bytes

/101$/{r=1}{L=split($0,a,"")
n=r?L-2:3
N=r?-1:1
while(d<L-7){c=0
for(k=0;k<7;k++){c*=2;c+=a[n+=N];d++}printf"%c",c}}

Ich weiß, dass diese Frage nicht viel Liebe gesehen hat, aber ich war neugierig auf das Sehen und die AWKLösung. Das ist nicht so clever, aber es scheint zu funktionieren und ich sehe keine offensichtlichen Bereiche für Golf. Ich habe die Zeichenfolge ursprünglich bei Bedarf umgekehrt, dadurch wurden jedoch mehr Bytes hinzugefügt, als nur die Inkrementierungslogik zu optimieren, um rückwärts zu springen.

Robert Benson
quelle