হিলবার্ট বক্ররেখার মানচিত্রের স্ট্রিং


27

আসুন 2 ডি স্পেসে কিছু স্ট্রিং ম্যাপ করুন, ফ্র্যাক্টাল স্টাইল। আপনার কাজ হিলবার্ট বক্ররেখার গণনা করা এবং এটির সাথে একটি স্ট্রিং রাখা।

হিলবার্ট কার্ভ, পুনরাবৃত্তি 1 থেকে 8

কার্য

কাজটি হ'ল একক-লাইন ইনপুট স্ট্রিংটি নেওয়া এবং এটি ধারণের জন্য যথেষ্ট বড় হিলবার্ট বক্ররেখার পাশে রেখে দেওয়া , তবে এর চেয়ে বড় কিছু নয়। বাইট গণনা যতটা সম্ভব কম করার চেষ্টা করুন; এই হল সব পরে!

পরিবেশ

  • হোয়াইটস্পেসের সাথে প্যাড করার জন্য কোনও ফাঁক, তবে লাইনের শেষে প্যাডিংয়ের প্রয়োজন নেই।
  • লাইনের শুরুটি শীর্ষ-বাম কোণে এবং নীচে-বামে শেষ হওয়া উচিত।
  • আপনি একটি প্রোগ্রাম বা ফাংশন তৈরি করতে পারেন।
  • কিছু নতুন টেস্ট-কেস হাজির হতে পারে, তাই কিছু হার্ডকোড করবেন না!

বোনাসেস

দ্রষ্টব্য: বোনাসগুলি এর মতো স্ট্যাক: -50% & -20% on 100B= -20% on 50Bবা -50% on 80B= 40B

  • -50% যদি ইনপুটটি একাধিক-লাইনের স্ট্রিং হয় তবে মূল ইনপুটটি তৈরি করতে প্রক্রিয়াটি বিপরীত করুন। বোনাসের জন্য পরীক্ষার কেসগুলি: কেবল বিদ্যমানগুলি ব্যবহার করুন (বোনাস পরীক্ষার ক্ষেত্রেও!)
  • -20% যদি আপনি আউটপুট থেকে সমস্ত অপ্রয়োজনীয় শ্বেতস্পেসটি ছাঁটাই করেন (যেমন একটি লাইনের শেষে)।
  • -5% যদি আপনি বিশ্বব্যাপী নেমস্পেসকে দূষিত না করেন (তবে আপনি কী জানেন আমার অর্থ!)

পরীক্ষার মামলা

abcdefghijklmn

adef
bchg
 nij
 mlk


The quick brown fox jumps over the lazy dog.

Thn f ju
 ewooxpm
qckr rs 
ui btevo
    hlaz
    e  y
      do
      .g

এবং হোয়াইট স্পেস-স্ট্রিপিং বোনাসের জন্য:

No  hitespac  her 

Noher

hesc
itpa

লিডারবোর্ড

আপনার উত্তরটি প্রদর্শিত হয়েছে তা নিশ্চিত করার জন্য, দয়া করে নীচের মার্কডাউন টেমপ্লেটটি ব্যবহার করে আপনার উত্তরটি শিরোনাম দিয়ে শুরু করুন:

# Language Name, N bytes

Nআপনার জমা দেওয়ার আকারটি কোথায় ? আপনি যদি নিজের স্কোরটি উন্নত করেন তবে আপনি পুরানো স্কোরগুলি শিরোনামে রেখে দিতে পারেন । এই ক্ষেত্রে:

# Ruby, <s>104</s> <s>101</s> 96 bytes

যদি আপনি নিজের শিরোনামে একাধিক সংখ্যা অন্তর্ভুক্ত করতে চান (যেমন আপনার স্কোর দুটি ফাইলের সমষ্টি বা আপনি পৃথকভাবে দোভাষী পতাকা দণ্ডের তালিকা করতে চান), নিশ্চিত করুন যে আসল স্কোরটি শিরোনামের শেষ সংখ্যা:

# Perl, 43 + 2 (-p flag) = 45 bytes

আপনি ভাষাটির নামটিকে একটি লিঙ্কও বানাতে পারেন যা লিডারবোর্ড স্নিপেটে প্রদর্শিত হবে:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

যদি কেউ আরও কিছু টেস্টকেস করতে পারেন তবে তা প্রশংসিত হবে।
wizzwizz4

সুতরাং বৈশিষ্ট্যগুলি বক্রাকার উল্লম্ব দ্বারা প্রতিনিধিত্ব করা উচিত?
flawr

No..hitespac..her.যেখানে বিন্দাগুলি ফাঁকা থাকে সেগুলি বোনাসের জন্য আরও ভাল পরীক্ষার কেস হবে। (এবং বর্তমানে পরীক্ষার .
কেসটি

আপনি যদি এল-সিস্টেমের পদ্ধতি অবলম্বন করে থাকেন তবে আপনি http: // কোডগলফ / প্রশ্ন / 48697 / এসকিআই-এল-সিস্টেম-রেন্ডারার চেষ্টা করতেও পারেন । এটি আপনাকে উত্তরগুলি গল্ফ করতে সহায়তা করতে পারে।
wizzwizz4

উত্তর:


7

সিজেএম, 119 117 113 112 109 * 0.5 * 0.8 = 43.6 বাইট

1 বাইট সঞ্চয় করার জন্য ডেনিসকে ধন্যবাদ।

এখানে একটি সূচনা ...

{+e`W<e~}:F;q_N-,4mLm]0aa{4\#4e!1=f*\:G[zGGW%zW%G].ff+2/{~.+~}%}@:L/\_N&{N/]z:z:~$1f>sS}{4L#' e]f{f=SF}N*N}?F

ফরোয়ার্ড ট্রান্সফর্মটি পরীক্ষা করুনবিপরীত রূপান্তর পরীক্ষা করুন।

আমি নিশ্চিত যে বক্রটি উত্পন্ন করার জন্য একটি আরও ছোট উপায় আছে ...

ব্যাখ্যা

প্রথমে, আমি অ্যারের প্রান্ত থেকে কিছু উপাদান ছাঁটাইতে একটি ফাংশন সংজ্ঞায়িত করি, কারণ আমার এটি বেশ কয়েকটি জায়গায় প্রয়োজন। এটি স্ট্যাকের শীর্ষে অ্যারের এবং উপাদানটি (একটি পৃথক অ্যারের অভ্যন্তরে) প্রত্যাশা করে।

{
  +  e# Append the element to the array.
  e` e# Run-length encode.
  W< e# Discard last run.
  e~ e# Run-length decode.
}:F; e# Store in F and discard.

এখন কোডের সিংহভাগ প্রয়োজনীয় হিলবার্ট বক্রের আকার নির্ধারণ করে এবং এটি 2D অ্যারে হিসাবে তৈরি করে যেখানে উপাদানগুলি বক্ররেখার সাথে সূচকগুলি হয়। আমি নিম্নলিখিত পর্যবেক্ষণের ভিত্তিতে এটি নির্মাণ করি:

2x2 হিলবার্ট বক্ররেখা বিবেচনা করুন:

01
32

4x4 হিলবার্ট কার্ভটি হ'ল:

0345
1276
ed89
fcba

আমরা যদি প্রতিটি চতুর্ভুজ থেকে ন্যূনতম মানটি বিয়োগ করি (এবং এগুলি ভিজ্যুয়াল স্পষ্টতার জন্য কিছুটা পৃথক করে), আমরা পাই:

03 01
12 32

21 01
30 32

এই প্যাটার্নটি যে কোনও আকারের জন্য ধারণ করে। এর অর্থ হল যে আমরা চারটি চতুর্ভুজ হিসাবে ব্যবহার করে বর্তমান স্তর থেকে পরবর্তী স্তরটি তৈরি করতে পারি: ক) বর্তমান স্তরের স্থানান্তর, খ) বর্তমান স্তরটি নিজেই, গ) অ্যান্টি-ডায়াগোনাল বরাবর ট্রান্সপোজ, ঘ) আবার বর্তমান স্তর নিজেই। এবং তারপরে আমরা তাদের যথাক্রমে 0, 1, 3, 2 গুণ আকারের অফসেট করি।

q           e# Read input.
_N-         e# Make a copy and remove all linefeeds.
,4mLm]      e# Take that string's length's logarithm with base 4, rounded up.
            e# This is the Hilbert curve level we need.
0aa         e# Push [[0]] as the level-0 Hilbert curve.
{           e# Store the Hilbert curve level in L. Then for each i from 0 to L-1...
  4\#       e#   Compute 4^i. This is the offset of the four quadrants.
  4e!1=     e#   Get [0 1 3 2] as the second permutation returned by 4e!.
  f*        e#   Multiply each of them by the offset.
  \:G       e#   Swap with the Hilbert curve so far and call it G.
  [         e#   Create an array with...
    z       e#     The transpose of G.
    G       e#     G itself.
    GW%zW%  e#     The anti-diagonal transpose of G.
    G       e#     G itself.
  ]
  .ff+      e#   Add the appropriate offsets to the indices in each of the four quadrants.
  2/        e# Split into a 2x2 grid.
  {         e# Map this onto each pair of quadrants...
    ~       e#   Dump both quadrants on the stack.
    .+      e#   Concatenate them line by line.
    ~       e#   Dump the lines on the stack.
  }%        e# Since this is a map, the lines will automatically be collected in an array.
}@:L/

অবশেষে, আমরা ইনপুটগুলিতে উপযুক্ত রূপান্তরটি প্রয়োগ করতে সূচকগুলির এই হিলবার্ট বক্রাকে ব্যবহার করি:

\_        e# Swap the curve with the input and make another copy.
N&{       e# If the input contains linefeeds, execute the first block, else the second...
  N/      e#   Split the input into lines. The stack now has a grid of indices and a grid
          e#   of characters.
  ]z:z:~  e#   This is some weird transposition magic which zips up the indices with the
          e#   corresponding characters from both grids, and finally flattens the grid
          e#   into a linear list of index/character pairs. Those cells that don't have
          e#   characters due to trimmed whitespace in the input will be turned into
          e#   arrays containing only an index.
  $       e#   Sort the pairs (which sorts them by indices).
  1f>     e#   Discard the indices.
  s       e#   Flatten the result into a single string.
  S       e#   Leave a space on the stack to be trim trailing spaces later.
}{        e# or...
  4L#     e#   Compute the size of the Hilbert curve.
  ' e]    e#   Pad the input to that size with spaces.
  f{      e#   Map this block over lines of the curve, passing the padding input as an
          e#   additional parameter...
    f=    e#     For each index in the current line, select the appropriate character
          e#     from the padded input.
    SF    e#     Trim spaces from the end of the line.
  }
  N*      e#   Join the lines with linefeed characters.
  N       e#   Leave a linefeed on the stack to be trim trailing linefeeds later.
}?
F         e# We left either a space or a linefeed on stack... trim that character from
          e# the end of the string.

3

পাইথন 3, 467 434 423 457 451 426 386 374 342 291 304 * 80% * 95% = 231.04 বাইট

যেভাবে এটি কাজ করে তা হ'ল আমি লিন্ডেনমায়ার সিস্টেমটি ব্যবহার করে হিলবার্ট বক্ররেখা তৈরি করি এবং স্ট্রিংগুলির অ্যারের পাশাপাশি বাম, ডান এবং সামনে নির্দেশাবলী অনুসরণ করি। যদিও এটি আরও ভালভাবে চালিত হতে পারে এমন অনেকগুলি উপায় রয়েছে; বিশেষত শর্তসাপেক্ষে এবং স্ট্রিংগুলির অ্যারে তৈরিতে। (আমি চেষ্টা করেছি [" "*p for i in range(p)]কিন্তু স্ট্রিং আইটেম অ্যাসাইনমেন্টকে সমর্থন করে না (স্পষ্টতই) I আমি যদি এটি কাজ করতে পারি তবে আমিও যোগদান থেকে মুক্তি পেতে পারি))

সম্পাদনা: ধন্যবাদ সঙ্গে কন্ডিশন কিছু Golfed ডেনিস । এবং আমি স্ট্রিং এর অ্যারে নিচে গল্ফড। এবং একটি নো-বাইট পরিবর্তন কারণ ফলাফলগুলি প্রকাশিত হচ্ছিল উপরের উদাহরণগুলির তুলনায়।

সম্পাদনা: হোয়াইটস্পেস-স্ট্রিপিং বোনাস প্রয়োগ করা হয়েছে।

সম্পাদনা: আরও ছয়টি বাইটের জন্য আমার সাদা স্থান-স্ট্রিপিং কোডে একটি বাগ স্থির করে

সম্পাদনা করুন: যেহেতু এই উত্তরটি বিশ্বব্যাপী নেমস্পেসকে দূষিত করে না, তাই এখানে উইজউইফজ 4 অনুসারে আমি 5% বোনাস পাব ।

সম্পাদনা: কীভাবে gবৃদ্ধি এবং হ্রাস করা যায় তা পরিবর্তন করা হয়েছে । এখন ব্যবহার eval()এবং str.translate

সম্পাদনা: এই উত্তরটি এখন কোনও ফাংশনের পরিবর্তে একটি প্রোগ্রাম।

সম্পাদনা: পূর্বের গল্ফ থেকে কিছু বাগ স্থির করা হয়েছে।

s=input();m=(len(bin(len(s)-1))-1)//2;t=eval("[' ']*2**m,"*2**m);t[0][0],*s=s;x=y=g=0;b="A";exec("b=b.translate({65:'-BF+AFA+FB-',66:'+AF-BFB-FA+'});"*m)
while s:
 c,*b=b;g+=(c<"-")-(c=="-")
 if"B"<c:x,y=[[x+1-g%4,y],[x,y+g%4-2]][g%2];t[x][y],*s=s
print("\n".join(''.join(i).rstrip()for i in t).rstrip())

Ungolfed:

# hilbert(it) is now implemented in the code with exec("b=b.translate")

def hilbert(it):
    s="A"
    n=""
    for i in range(it):
        for c in s:
            if c == "A":
                n += "-BF+AFA+FB-"
            elif c == "B":
                n += "+AF-BFB-FA+"
            else:
                n += c
        s=n;n=""
    return s

def string_to_hilbert(string):
    length = len(string)
    it = (len(bin(length-1))-1)//2
    hil = hilbert(it)
    pow_2 = 2**it
    # we use eval("[' ']*pow_2,"*pow_2) in the code, but the following is equivalent
    output = [[" "for j in range(pow_2)] for i in range(pow_2)]
    output[0][0] = string[0]
    x = 0
    y = 0
    heading = 0
    while string: # while there are still characters in string
        char, *hil = hil
        if char == "-": heading = heading - 1
        elif char == "+": heading = heading + 1
        elif char == "F":
            if heading % 4 == 3: y += 1
            elif heading % 4 == 2: x -= 1
            elif heading % 4 == 1: y -= 1
            else: x += 1
            output[x][y], *string = string
    array = [''.join(i).rstrip()for i in output]
    array = "\n".join(array).rstrip()
    print(array)
    return

5% বোনাস সম্পর্কে কৌতূহলী। ভেরিয়েবলগুলি পাইথনে স্বয়ংক্রিয়ভাবে স্থানীয় হয়?
edc65

@ edc65 আমি চ্যালেঞ্জ লেখক জিজ্ঞাসা একটি অনুরূপ জিনিস এখানে: chat.stackexchange.com/transcript/240?m=28529277#28529277 । আশা করি কিছুটা হলেও সাহায্য হবে। তা না হলে আমরা আড্ডায় আলোচনা চালিয়ে যেতে পারি।
শার্লক

2

রুবি, 358 356 344 322 319 * 80% * 95% = 242.44 বাইট

এটি আমার পাইথন কোডটি রুবিতে স্থানান্তরিত হয়েছে। আমার আরও উত্তর লিখতে হবে রুবিতে। এটি গল্ফ করার জন্য একটি শালীন ভাষা।

সম্পাদনা: আমি ভুলে গিয়েছি যে এই প্রশ্নে ফাংশনগুলির নামকরণ করার দরকার নেই।

সম্পাদনা করুন: যেহেতু এই উত্তরটি বিশ্বব্যাপী নেমস্পেসকে দূষিত করে না, তাই এখানে উইজউইফজ 4 অনুসারে আমি 5% বোনাস পাব ।

->s{l=s.size;m=((l-1).bit_length+1)/2;x=2**m;t=(1..x).map{[" "]*x};t[0][0]=s[0];x=y=g=z=0;d=1;b=?A;m.times{b=b.split("").map{|c|c==?A?"-BF+AFA+FB-":c==?B?"+AF-BFB-FA+":c}.join("")};(c=b[z];z+=1;g+=c<?-?1:c==?-?-1:0;(g%2>0?y+=g%4-2:x+=1-g%4;t[x][y]=s[d];d+=1)if c>?B)while d<l;puts (t.map{|i|(i*'').rstrip}*"\n").rstrip}

Ungolfed:

def map_string(string)
  len = string.size
  m = ((len-1).bit_length+1)/2
  pow = 2**m
  output = (1..pow).map{[" "]*pow}
  output[0][0] = s[0]
  x = y = heading = char_index = 0
  chars_in_output = 1
  b = ?A
  m.times do |j|
    a = b.split("").map do |char|
      if char == "A"
        "-BF+AFA+FB-"
      else if char == "B"
        "+AF-BFB-FA+"
      else
        char
      end
    end
    b = a.join("")
  end
  while chars_in_output < len
    char = b[char_index]
    char_index += 1
    if char == "-"
      heading += -1
    else if char == "+"
      heading += 1
    else if char == "F"
      if heading % 2 == 0
        y += heading % 4 - 2
      else
        x += 1 - heading % 4
      end
    end
    output[x][y] = string[char_index]
    char_index += 1
  end
  return (output.map{|i|(i*'').rstrip}*"\n").rstrip

এই কোডটি কোনও কোড লাইসেন্সের আওতায় দ্বৈত-লাইসেন্সকৃত? আমি জিপিএলের অধীনে প্রকাশিত একটি ডেরিভেটিভ কাজ উত্পাদন করতে চাই (যদিও কোনও জিপিএল-সামঞ্জস্যপূর্ণ লাইসেন্স এটি দিয়ে কাজ করবে)। এটি বর্তমানে সিসি বাই-এসএ 3.0 এর আওতায় প্রকাশিত হয়েছে।
wizzwizz4

@ wizzwizz4 এখানে চ্যাট করুন: chat.stackexchange.com/rooms/56405/…
শার্লক 9

1

জাভাস্ক্রিপ্ট (ES6), 227 - 20%: 181.6 বাইট

m=>{for(n=1<<((33-Math.clz32(m.length-1))/2),t='',y=0;y<n;y++,t+=`
`)for(x=0;x<n;x++,t+=m[h]||' ')for(u=y,v=x,h=0,s=n;s>>=1;q||(p&&(u=s+~u,v=s+~v),[u,v]=[v,u]))h+=s*s*(3*!!(p=u&s)^!!(q=v&s));return t.replace(/ +$/mg,'').trim()}

5% বোনাস পাওয়ার চেষ্টা করছে

m=>{for(var n=1<<((33-Math.clz32(m.length-1))/2),t='',x,y=0;y<n;y++,t+=`
`)for(x=0;x<n;x++,t+=m[h]||' ')for(var p,q,u=y,v=x,h=0,s=n;s>>=1;q||(p&&(u=s+~u,v=s+~v),[u,v]=[v,u]))h+=s*s*(3*!!(p=u&s)^!!(q=v&s));return t.replace(/ +$/mg,'').trim()}

241 * 0.8 * 0.95: 183.16 আরও বড়

কম গল্ফড

m=>
{
  // calc the size of the bounding square, clz32 is a bit shorter than ceil(log2()
  n = 1<<( (33-Math.clz32(m.length-1)) / 2); 
  t = '';
  for(y = 0; y < n; y++) 
  {
    for(x = 0 ; x < n; x++)
    {
      // for each position x,y inside the square
      // get the index postion in the hilbert curve
      // see https://en.wikipedia.org/wiki/Hilbert_curve (convert x,y to d)
      for(u=y, v=x, h=0, s=n; s >>= 1; )
      {
        h += s*s*(3 * !!(p = u & s) ^ !!(q = v & s));
        q || (p && (u = s+~u, v = s+~v),[u,v]=[v,u])
      }
      // add char at given index to output  
      t += m[h]||' '; // blank if beyond the length of m
    }
    t += '\n'; // add newline add end line
  }
  return t.replace(/ +$/mg,'').trim() // to get the 20% bonus
}  

পরীক্ষা

F=m=>{for(n=1<<((33-Math.clz32(m.length-1))/2),t='',y=0;y<n;y++,t+=`
`)for(x=0;x<n;x++,t+=m[h]||' ')for(u=y,v=x,h=0,s=n;s>>=1;q||(p&&(u=s+~u,v=s+~v),[u,v]=[v,u]))h+=s*s*(3*!!(p=u&s)^!!(q=v&s));return t.replace(/ +$/mg,'').trim()}

function Test() { O.textContent = F(I.value) }

Test()
#I { width: 90% }
#O { border: 1px solid #ccc}
<input id=I oninput='Test()' value='The quick brown fox jumps over the lazy dog.'>
<pre id=O></pre>


var5% বোনাস পাওয়ার জন্য এটি যুক্ত করা কি উপযুক্ত হবে ?
wizzwizz4

var s,x,y,u,v,t,p,q,n,hনা এটি @ wizzwizz4
edc65

আপনি varপ্রতিটি ব্যবহারের আগে স্রেফ রাখতে পারেন ... ওহ, এটি আরও খারাপ।
wizzwizz4

@ wizzwizz4 সব মিলিয়ে হয়ত আপনার একটা বক্তব্য আছে ... আমি চেষ্টা করছি ... না। খুব খারাপ
edc65
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.