কিউআর কোডগুলি ... এবং যা জাজ!


18

এটি তুলনামূলকভাবে চ্যালেঞ্জিং কোড-গল্ফ চ্যালেঞ্জ হতে চলেছে।

ইনপুট: যে কোনও ইউআরএল, অবশ্যই প্রোটোকল সংযুক্ত থাকতে হবে, যেমন: http://codegolf.stackexchange.com (যা আমাদের পরীক্ষার ক্ষেত্রে হবে)

আউটপুট: একটি উত্পন্ন কিউআর কোড যা এই URL টি উপস্থাপন করে, যখন কোনও স্মার্ট ডিভাইস দ্বারা স্ক্যান করা আপনাকে স্মার্ট ডিভাইসের ব্রাউজারে সেই URL এ নিয়ে যায়।

এই কোড-গল্ফের জন্য নিয়ম

  1. যথারীতি, সবচেয়ে ছোট কোডটি জয়ী।
  2. আপনার জন্য কোড তৈরি করতে কোনও বাহ্যিক ওয়েব সংস্থান, গ্রন্থাগার বা প্লাগইন নেই। আপনার কোড অবশ্যই QR কোড চিত্র গণনা করতে হবে।
  3. এইচটিএমএল 5 / সিএসএস 3 দ্বারা উত্পাদিত, বা উপযুক্ত ইউনিকোড ব্লক ব্যবহার করে বা আপনার প্ল্যাটফর্মের এএসসিআইআই যদি এটি উপলব্ধ থাকে তবে কিউআর কোড তৈরি করতে পারে এমন ASCII অক্ষরগুলির মাধ্যমে আউটপুট উপস্থাপন করা যেতে পারে (এই শেষটি কমোডোর Bas৪ বেসিক, অ্যামিগা কিউবাসিক, আমস্ট্রাদ বেসিক, ইত্যাদি ব্যবহারকারী) তবে এটি অবশ্যই একটি QR কোড আউটপুট উত্পন্ন করে যাতে আমি কোডটি স্ক্যান করতে পারি।
  4. কোডের প্রবেশদ্বারগুলি অবশ্যই আপনার কোড সম্পাদন করার পরে আউটপুটটির স্ক্রিন শট দ্বারা আউটপুট প্রদর্শিত হবে বা আউটপুট দেখাচ্ছে এমন কোনও লিঙ্কের সাথে (যা পরিস্থিতিকে সর্বোত্তমভাবে স্যুট করবে) অবশ্যই অনুসরণ করা উচিত
  5. আপনাকে " http://codegolf.stackexchange.com " URL টি দিয়ে আপনার কোডটি পরীক্ষা করতে হবে এবং বিধি 3 থেকে 4 অনুসারে আউটপুটটি রিপোর্ট করতে হবে।
  6. আপনি নিজের পছন্দের একটি ইউআরএল দিয়ে আপনার কোডটি পরীক্ষা করতে হবে এবং বিধি 3 থেকে 4 অনুসারে আউটপুটটি রিপোর্ট করবেন।

তথ্যসূত্র:

1) http://en.wikiversity.org/wiki/Reed%E2%80%93 সলোমন_কোড_স_ কোডার

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

3) http://en.wikedia.org/wiki/Reed%E2%80%93 সলোমন_অরর_ক্র্যাকশন

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

5) অনুপ্রেরণার জন্য http://www.qrstuff.com/ ...))


4
বিধি 5 এ অসীম পুনরাবৃত্তি
ব্যবহারকারী 12205

@ স্পষ্টতই স্পট করা হয়েছে ... এটি ঠিক করা হয়েছে
ওয়ালিওয়েস্ট

1
কিছু ডকুমেন্টেশন পড়ার পরে, আমি "তুলনামূলকভাবে চ্যালেঞ্জিং" একটি সংক্ষেপণ বলে মনে করি।
ড্যানি

"আপনার কোডটি কিউআর কোড চিত্র গণনা করতে হবে" এর অর্থ কী তা সম্পর্কে আমরা একটি ব্যাখ্যা পেতে পারি? আমি এটি বোঝাতে চাইছি যে আমাদের অবশ্যই জমা দেওয়া কোডের দুটি প্রধান পয়েন্টটি করতে হবে : 1) আরএস এনকোডিং এবং 2) মডিউল লেআউট
নিক টি

নিয়ম 3: সুতরাং আসকি শিল্পটি টার্মিনাল থেকে সূক্ষ্মভাবে মুদ্রিত হয়, না এটি একটি বাস্তব চিত্রের ফাইলে যেতে হবে?

উত্তর:


17

পাইথন 3: 974 টি চর [এনবি]

কুরুচিপূর্ণ লাঠি দিয়ে আরও বীট করুন, জিএইচ-জিস্টে নোটবুকটি দেখুন । পাইথন 3-এ বিল্ট-ইন ASCII-85 এনকোডিং রয়েছে, যা জিপড সসগুলিতে সহায়তা করে। 3 এর আরও উন্নত অন্তর্নির্মিত সংক্ষেপণ অ্যালগরিদম (এলজেডএমএ) এ জাতীয় ছোট জিনিসগুলির সাথে ভাল কাজ করে বলে মনে হয় না।

চারপাশে অক্ষর পরিবর্তন করা সম্পর্কে জিপিং খুব চঞ্চল, প্রায় এমন কিছু লিখতে প্ররোচিত হয়েছিল যা জিপ করা আকারটি হ্রাস করার জন্য এলোমেলোভাবে ভেরিয়েবলগুলির জন্য বিভিন্ন 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()

ভাল কিউআর কোড


দারূন কাজ! দুঃখের বিষয় যে গল্ফিং সলিউশনগুলিতে পাইথন সেরা নয়, তবে এটি লক্ষণীয় কোডিং, @ নিকট!
ওয়ালিওয়েস্ট

আমি যদি structআমার 'মাস্টার স্ট্রিং' কেটে ফেলে কলটি এবং কিছু অপ্রয়োজনীয় কিছুটা চাপ দিই তবে আমি সম্ভবত আরও কিছু সঞ্চয় করতে পারি ...
নিক টি

এফওয়াইআই দ্বিতীয় ইন্ডেন্টেশন স্তরটি মাত্র দুটি স্পেস হতে পারে। আমি লক্ষ্য করেছি যে আপনি চার / ট্যাব ব্যবহার করেন।
বিটা ক্ষয়

1
@ বেটাডেেকে ঠিক 1 টি ট্যাব হওয়ার কথা (1 ট্যাব> 1 স্পেস যতক্ষণ ইনডেন্টিং সম্পর্কিত, ... আমার মনে হয় এসই ট্যাবগুলি ভাঙ্গাচ্ছে?)
নিক টি

@ নিকটি হ্যাঁ, এটি করে।
Rɪᴋᴇʀ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.