क्यूआर कोड ... और वह सब जैज!


18

यह अपेक्षाकृत चुनौतीपूर्ण कोड-गोल्फ चुनौती है।

इनपुट: किसी भी URL में प्रोटोकॉल संलग्न होना चाहिए, जैसे http://codegolf.stackexchange.com (जो हमारा टेस्ट केस होगा)

आउटपुट: एक उत्पन्न क्यूआर कोड जो इस URL का प्रतिनिधित्व करता है, जो स्मार्ट डिवाइस द्वारा स्कैन किए जाने पर आपको स्मार्ट डिवाइस के ब्राउज़र पर उस URL पर ले जाएगा।

इस कोड-गोल्फ के लिए नियम

  1. हमेशा की तरह, सबसे छोटा कोड जीतता है।
  2. आपके लिए कोड जनरेट करने के लिए कोई बाहरी वेब संसाधन, लाइब्रेरी या प्लगइन्स नहीं। आपके कोड को QR कोड छवि की गणना करनी चाहिए।
  3. आउटपुट HTML5 / CSS3 द्वारा उत्पन्न छवि द्वारा प्रस्तुत किया जा सकता है, या यहां तक ​​कि उपयुक्त यूनिकोड ब्लॉकों का उपयोग करके, या यदि आपके प्लेटफ़ॉर्म के ASCII ने इसे उपलब्ध किया है, तो ASCII वर्णों के माध्यम से जो क्यूआर कोड बना सकते हैं (यह पिछले एक कॉमोडोर 64 बेसिक पर निर्देशित है) Amiga QBasic, Amstrad बेसिक, आदि उपयोगकर्ताओं), लेकिन यह एक QR कोड आउटपुट उत्पन्न करना चाहिए जैसे कि मैं कोड स्कैन कर सकता हूं।
  4. कोड के प्रविष्टियों को उत्पन्न आउटपुट के साथ पालन किया जाना चाहिए, या तो आपके कोड को निष्पादित करने के बाद आउटपुट के एक स्क्रीन शॉट द्वारा, या आउटपुट दिखाने वाले लिंक के साथ (जो भी स्थिति सबसे अच्छी लगती है)
  5. आपको URL " http://codegolf.stackexchange.com " के साथ अपने कोड का परीक्षण करना है , और नियम 3 से 4 के अनुसार आउटपुट की रिपोर्ट करना है।
  6. आपको अपनी पसंद के URL के साथ अपने कोड का भी परीक्षण करना है, और नियम 3 से 4 के अनुसार आउटपुट की रिपोर्ट करना है।

संदर्भ:

1) http://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders

2) http://www.pclviewer.com/rs2/calculator.html

3) http://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction

4) http://en.wikipedia.org/wiki/QR_code

5) http://www.qrstuff.com/ प्रेरणा के लिए ...)


4
नियम 5 पर अनंत पुनरावृत्ति
user12205

@ace वेल स्पोटेड ... यह तय किया गया है
वैलीवेस्ट

1
कुछ दस्तावेज पढ़ने के बाद, मुझे लगता है कि "अपेक्षाकृत चुनौतीपूर्ण" एक समझ है।
डैनी

क्या हमें इस बात का स्पष्टीकरण मिल सकता है कि "आपके कोड को क्यूआर कोड छवि की गणना कैसे करनी चाहिए"? मैं इसका मतलब यह निकाल रहा हूं कि हमें प्रस्तुत कोड में दो प्रमुख बिंदुओं को करना होगा : 1) आरएस एन्कोडिंग , और 2) मॉड्यूल लेआउट
निक टी

नियम 3: तो एससीआई कला एक टर्मिनल फाइन से छपी है, या क्या इसे एक वास्तविक छवि फ़ाइल में जाना है?

जवाबों:


17

अजगर 3: 974 वर्ण [एनबी]

आगे बदसूरत छड़ी के साथ हराया, GH-Gist पर नोटबुक देखें । पायथन 3 में अंतर्निहित ASCII-85 एन्कोडिंग है, जो ज़िप्ड सॉस के साथ मदद करता है। 3 के अधिक उन्नत अंतर्निहित संपीड़न एल्गोरिदम (LZMA) ऐसी छोटी चीजों के साथ अच्छी तरह से काम नहीं करते हैं।

चारों ओर बदलते पात्रों के बारे में ज़िपिंग बहुत चंचल है, लगभग कुछ ऐसा लिखने के लिए लुभाया गया था जो ज़िप किए गए आकार को कम करने के लिए चर के लिए अलग-अलग 1-अक्षर नामों की कोशिश करेगा।

पायथन 2: 1420 1356 1085 1077 वर्ण

यहाँ छवि विवरण दर्ज करें

मैंने जब बुलाया गया पहला तर्क पढ़ा, जो 106-ईश वर्णों तक लंबा एक स्ट्रिंग हो सकता है। आउटपुट हमेशा एक संस्करण 5-एल क्यूआर कोड और मास्क 4 होता है, जिसका अर्थ है कि यह 37x37 मॉड्यूल बड़ा है और केवल ~ 5% क्षति को संभाल सकता है।

कार्यक्रम की केवल निर्भरताएं हैं numpy(सरणी जोड़तोड़) और matplotlib(केवल प्रदर्शन); सभी रीड-सोलोमन एन्कोडिंग, डेटा पैकिंग और मॉड्यूल लेआउट प्रदान किए गए कोड के भीतर नियंत्रित किए जाते हैं । रुपये के लिए, मैंने मूल रूप से विकीवर्सिटी कार्यों को लूट लिया ... यह अभी भी मेरे लिए एक ब्लैक-बॉक्स की तरह है। किसी भी घटना में क्यूआर के बारे में एक टन सीखा।

यहाँ कोड है इससे पहले कि मैं इसे बदसूरत छड़ी के साथ हराऊं:

import sys
import numpy as np
import matplotlib.pyplot as plt
# version 5-L ! = 108 data code words (bytes), 106 after metadata/packing

### RS code stolen from https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#RS_generator_polynomial
gf_exp = [1] + [0] * 511
gf_log = [0] * 256
x = 1
for i in range(1,255):
    x <<= 1
    if x & 0x100:
        x ^= 0x11d
    gf_exp[i] = x
    gf_log[x] = i
for i in range(255,512):
    gf_exp[i] = gf_exp[i-255]

def gf_mul(x,y):
    if x==0 or y==0:
        return 0
    return gf_exp[gf_log[x] + gf_log[y]]

def main():
    s = sys.argv[1]

    version = 5
    mode = 4 # byte mode
    dim = 17 + 4 * version
    datamatrix = 0.5 * np.ones((dim, dim))
    nsym = 26

    # PACK
    msg = [mode * 16, len(s) * 16] + [ord(c) << 4 for c in s]
    for i in range(1, len(msg)):
        msg[i-1] += msg[i] // 256
        msg[i] = msg[i] % 256

    pad = [236, 17]
    msg = (msg + pad * 54)[:108]

    # MAGIC (encoding)
    gen = [1]
    for i in range(0, nsym):
        q = [1, gf_exp[i]]
        r = [0] * (len(gen)+len(q)-1)
        for j in range(0, len(q)):
            for i in range(0, len(gen)):
                r[i+j] ^= gf_mul(gen[i], q[j])
        gen = r
    msg_enc = [0] * (len(msg) + nsym)
    for i in range(0, len(msg)):
        msg_enc[i] = msg[i]
    for i in range(0, len(msg)):
        coef = msg_enc[i]
        if coef != 0:
            for j in range(0, len(gen)):
                msg_enc[i+j] ^= gf_mul(gen[j], coef)
    for i in range(0, len(msg)):
        msg_enc[i] = msg[i]


    # PATTERN
    # position marks
    for _ in range(3):
        datamatrix = np.rot90(datamatrix)
        for i in range(4):
            datamatrix[max(0, i-1):8-i, max(0, i-1):8-i] = i%2
    datamatrix = np.rot90(datamatrix.T)

    # alignment
    for i in range(3):
        datamatrix[28+i:33-i, 28+i:33-i] = (i+1)%2

    # timing
    for i in range(7, dim-7):
        datamatrix[i, 6] = datamatrix[6, i] = (i+1)%2

    # the "dark module"
    datamatrix[dim-8, 8] = 1

    # FORMAT INFO
    L4 = '110011000101111' # Low/Mask4
    ptr_ul = np.array([8, -1])
    steps_ul = [0, 1] * 8 + [-1, 0] * 7
    steps_ul[13] = 2 # hop over vertical timing
    steps_ul[18] = -2 # then horizontal

    ptr_x = np.array([dim, 8])
    steps_x = [-1, 0] * 7 + [15-dim, dim-16] + [0, 1] * 7

    for bit, step_ul, step_x in zip(L4, np.array(steps_ul).reshape(-1,2), np.array(steps_x).reshape(-1,2)):
        ptr_ul += step_ul
        ptr_x += step_x
        datamatrix[tuple(ptr_ul)] = int(bit)
        datamatrix[tuple(ptr_x)] = int(bit)

    # FILL
    dmask = datamatrix == 0.5

    cols = (dim-1)/2
    cursor = np.array([dim-1, dim]) # starting off the matrix
    up_col = [-1, 1, 0, -1] * dim
    down_col = [1, 1, 0, -1] * dim
    steps = ([0, -1] + up_col[2:] + [0, -1] + down_col[2:]) * (cols/2)
    steps = np.array(steps).reshape(-1, 2)
    steps = iter(steps)

    # bit-ify everything
    msg_enc = ''.join('{:08b}'.format(x) for x in msg_enc) + '0' * 7 # 7 0's are for padding
    for bit in msg_enc:
        collision = 'maybe'
        while collision:
            cursor += steps.next()
            # skip vertical timing
            if cursor[1] == 6:
                cursor[1] = 5
            collision = not dmask[tuple(cursor)]
        datamatrix[tuple(cursor)] = int(bit)

    # COOK
    mask4 = lambda i, j: (i//2 + j//3)%2 == 0
    for i in range(dim):
        for j in range(dim):
            if dmask[i, j]:
                datamatrix[i, j] = int(datamatrix[i, j]) ^ (1 if mask4(i, j) else 0)

    # THE PRESTIGE
    plt.figure(facecolor='white')
    plt.imshow(datamatrix, cmap=plt.cm.gray_r, interpolation='nearest')
    plt.axis('off')
    plt.show()

if __name__ == '__main__':
    main()

उपरांत:

import sys
from pylab import*
n=range
l=len
E=[1]+[0]*511
L=[0]*256
x=1
for i in n(1,255):
 x<<=1
 if x&256:x^=285
 E[i]=x;L[x]=i
for i in n(255,512):E[i]=E[i-255]
def f(x,y):
 if x*y==0:return 0
 return E[L[x]+L[y]]
m=sys.argv[1]
m=[ord(c)*16 for c in'\4'+chr(l(m))+m]
for i in n(1,l(m)):m[i-1]+=m[i]/256;m[i]=m[i]%256
m=(m+[236,17]*54)[:108]
g=[1]
for i in n(26):
 q=[1,E[i]]
 r=[0]*(l(g)+l(q)-1)
 for j in n(l(q)):
    for i in n(l(g)):r[i+j]^=f(g[i],q[j])
 g=r
e=[0]*134
for i in n(108):
 e[i]=m[i]
for i in n(108):
 c=e[i]
 if c: 
    for j in n(l(g)):e[i+j]^=f(g[j],c)
for i in n(108):e[i]=m[i]
m=.1*ones((37,)*2)
for _ in n(3):
 m=rot90(m)
 for i in n(4):m[max(0,i-1):8-i,max(0,i-1):8-i]=i%2
m=rot90(m.T)
for i in n(3):m[28+i:33-i,28+i:33-i]=(i+1)%2
for i in n(7,30):m[i,6]=m[6,i]=(i+1)%2
m[29,8]=1
a=array
t=tuple
g=int
r=lambda x:iter(a(x).reshape(-1,2))
p=a([8,-1])
s=[0,1]*8+[-1,0]*7
s[13]=2
s[18]=-2
P=a([37,8])
S=[-1,0]*7+[-22,21]+[0,1]*7
for b,q,Q in zip(bin(32170)[2:],r(s),r(S)):p+=q;P+=Q;m[t(p)]=g(b);m[t(P)]=g(b)
D=m==0.1
c=a([36,37])
s=r(([0,-1]+([-1,1,0,-1]*37)[2:]+[0,-1]+([1,1,0,-1]*37)[2:])*9)
for b in ''.join('{:08b}'.format(x) for x in e):
 k=3
 while k:
    c+=s.next()
    if c[1]==6:c[1]=5
    k=not D[t(c)]
 m[t(c)]=g(b)
a=n(37)
for i in a:
 for j in a:
    if D[i,j]:m[i,j]=g(m[i,j])^(j%3==0)
imshow(m,cmap=cm.gray_r);show()

(4/8 / जो भी रिक्त स्थान की संख्या के आधार पर गणना करने के लिए एक टैब पर निर्भर है = = 2., यह सुनिश्चित नहीं है कि यह कितनी अच्छी तरह से कॉपी करेगा)

क्योंकि यह इतना लंबा है, हम इसे ज़िप कर सकते हैं (किसी ने इसे कहीं और करते हुए देखा, हालांकि भूल गया कि कौन है :() कुछ और पात्रों को बचाने के लिए, कुल 1085 1077 को नीचे लाया क्योंकि pylabगंदी है:

import zlib,base64
exec zlib.decompress(base64.b64decode('eJxtU0tzmzAQvvSkX6FLaglkyiM2hHRvyS2HZNobo3QwwY6IBVjQFrfT/96V3KR4Wg5I+/6+3ZXSfWdGOhwHsjWdpv1xX26oclqPtGDKdleTPezrltxCEUm/CKW3iiJyB/YWr9ZkgohsO0MVVS1tWSTi1YrnhE4fP6KFqi2d3qNfPj1CnK0IvS2UhOn6rpgkqHkkxolVFPPceeBviRpJnuot3bJJHG1Sm807AoS5qcevpqUhoX9ut4VN6d8VRymJBuQUlGb3DUGjVHTmiVXci9bUVqyw4uLdwq+eDdszzbmv5TkJp801gkDSgKf8gCSu7cVJF5a6Bqb9Ik7WIkqxLZe8yKMwk2RnW3VGbW3BH1AtLDmJoF3/sPiO+3t24MuIEwetOUVYnY3Bb5bHuvPcFMpv5CNs2Q6TiUPRSAzegSG1yxoll2dkwsxmql+h/8dWgbW69lY5favazKvWs6qNFBX/J8/fChqCyOvaemAsSQX34pPzl5NzYktqMN14FWKbyZzhpW26LicWCmw9z7OlEucibs1FTN7Cg89nQBIbH2e+ypMEQ99uEpjyI46RM+dUJKEbslhb4Gsxc8MsVyKTuMIllMaURzLC+LXf1zhd1Y7EwL7Um6eSTrkaa8NKNvHA1MNz2ddsia+Ac9JDyYpM4ApxMuBoRCS9zC/QilNKyVBEiYTYnlhoGZN7648Ny9D/E7z6YUAci9g9PpshdRQ24iAeLI0fqmcbhczjKA15EedSGDZw/H3CqfU+HK7vfXjA1R1ZzyXs2IY74f6PQG5A44sKIlK5+muRpA6wYQwr2gfALBZEYwUvSV0V/832j4l7V6ehbCzAxSJoOgS4+JmH2ebXIkCLLkfslxv8ZH1quxIvkBD6/Vnta/pyWv3KhyFo62lk3Ml2P/FpAaxzd66c9gXabqQ3SKniuMT6dDlxKwE7k85WpMxn76zMX9Pe4BI00u1CY0NPF/7ImosEm8OJ0sNz951pUemyh0oHO9yJL4ZfOzX/DQ2mdSs='))

यहाँ छवि विवरण दर्ज करें

यदि आप अंतिम पंक्ति को निम्नलिखित के साथ प्रतिस्थापित करते हैं (यह 62 वर्ण जोड़ता है), तो आपको लगभग-पूर्ण आउटपुट मिलता है, लेकिन दूसरा अभी भी स्कैन करता है, इसलिए जो भी हो।

figure(facecolor='white');imshow(m,cmap=cm.gray_r,interpolation='nearest');axis('off');show()

अच्छा QR कोड


अच्छा काम! यह अफ़सोस की बात है कि पायथन गोल्फ के समाधान में सबसे अच्छा नहीं है, लेकिन यह उल्लेखनीय कोडिंग है, @NickT!
21

मैं शायद कुछ और बचा सकता हूं अगर मैं structकॉल खो देता हूं और कुछ अनावश्यक बिट को अपने 'मास्टर स्ट्रिंग' को
निक टी

FYI करें दूसरा इंडेंटेशन स्तर केवल दो स्थान हो सकता है। मैंने देखा है कि आप चार / टैब का उपयोग करते हैं।
बीटा डिके

1
@ BetaDecay इसे केवल 1 टैब (1 टैब> 1 स्पेस माना जाता है जहां तक ​​इंडेंटिंग का संबंध है ... मुझे लगता है कि एसई टैब को तोड़ देता है?)
निक टी

@NickT हाँ, यह करता है।
R
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.