এক্সকেসিডি-স্টাইলের ন্যারেটিভ চার্ট তৈরি করুন


45

আরও আইকোনিক এক্সকেসিডি স্ট্রিপগুলির মধ্যে র‌্যান্ডাল মুনরো বর্ণনামূলক চার্টের কয়েকটি চলচ্চিত্রের সময়সীমাটি কল্পনা করেছিলেন:

এখানে চিত্র বর্ণনা লিখুন (আরও বড় সংস্করণের জন্য ক্লিক করুন।)

সূত্র: এক্স কেসিডি নং 657

সিনেমার টাইমলাইনের (বা অন্য কোনও আখ্যানের) বিবরণ দেওয়া, আপনি এই জাতীয় চার্ট তৈরি করতে পারেন। এটি একটি জনপ্রিয়তার প্রতিযোগিতা, সুতরাং সর্বাধিক (নেট) ভোট সহ উত্তরটি জিতবে।

সর্বনিম্ন প্রয়োজনীয়তা

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

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

    ["T-Rex", "Raptor", "Raptor", "Raptor", "Malcolm", "Grant", "Sattler", "Gennaro",
     "Hammond", "Kids", "Muldoon", "Arnold", "Nedry", "Dilophosaurus"]
    [
      [[0],[1,2,3],[4],[5,6],[7,8,10,11,12],[9],[13]],
      [[0],[1,2,3],[4,7,5,6,8,9,10,11,12],[13]],
      [[0],[1,2,3],[4,7,5,6,8,9,10],[11,12],[13]],
      [[0],[1,2,3],[4,7,5,6,9],[8,10,11,12],[13]],
      [[0,4,7],[1,2,3],[5,9],[6,8,10,11],[12],[13]],
      [7],
      [[5,9],[0],[4,6,10],[1,2,3],[8,11],[12,13]],
      [12],
      [[0, 5, 9], [1, 2, 3], [4, 6, 10, 8, 11], [13]], 
      [[0], [5, 9], [1, 2], [3, 11], [4, 6, 10, 8], [13]], 
      [11], 
      [[0], [5, 9], [1, 2, 10], [3, 6], [4, 8], [13]], 
      [10], 
      [[0], [1, 2, 9], [5, 6], [3], [4, 8], [13]], 
      [[0], [1], [9, 5, 6], [3], [4, 8], [2], [13]], 
      [[0, 1, 9, 5, 6, 3], [4, 8], [2], [13]], 
      [1, 3], 
      [[0], [9, 5, 6, 3, 4, 8], [2], [13]]
    ]
    

    উদাহরণস্বরূপ প্রথম লাইনটির অর্থ চার্টের শুরুতে টি-রেক্স একাকী, তিনটি র‌্যাপ্টর একসাথে, ম্যালকম একা, গ্রান্ট এবং স্যাটারেল একসাথে থাকে ইত্যাদি। দ্বিতীয় থেকে শেষ ইভেন্টটির অর্থ হ'ল র‌্যাপ্টরের মধ্যে দুটি মারা যায় ।

    আপনি কীভাবে ইনপুটটি সঠিকভাবে প্রত্যাশা করেন, যতক্ষণ না এই ধরণের তথ্য সুনির্দিষ্ট করা যায়। যেমন আপনি যে কোনও সুবিধাজনক তালিকা ফর্ম্যাট ব্যবহার করতে পারেন। আপনি ইভেন্টগুলির অক্ষরগুলি আবার পুরো চরিত্রের নাম ইত্যাদি আশা করতে পারেন etc.

    আপনি ধরে নিতে পারেন (তবে এটি করতে হবে না) গ্রুপগুলির প্রতিটি তালিকায় প্রতিটি গ্রুপে প্রতিটি জীবন্ত চরিত্র রয়েছে। তবে, আপনার ধরে নেওয়া উচিত নয় যে একটি ইভেন্টের মধ্যে থাকা গ্রুপগুলি বা চরিত্রগুলি বিশেষত সুবিধাজনক ক্রমে রয়েছে।

  • স্ক্রিন বা ফাইলে রেন্ডার করুন (ভেক্টর বা রাস্টার গ্রাফিক হিসাবে) একটি চার্ট যাতে প্রতিটি অক্ষরের জন্য একটি লাইন থাকে। প্রতিটি লাইনটি অবশ্যই লাইনের শুরুতে একটি অক্ষরের নামের সাথে লেবেল করা উচিত।

  • প্রতিটি সাধারণ ইভেন্টের জন্য অবশ্যই চার্টের কিছু ক্রস-সেকশন থাকতে হবে যেখানে অক্ষরের গোষ্ঠীগুলি তাদের স্বতন্ত্র রেখার সান্নিধ্যের সাথে পরিষ্কারভাবে সাদৃশ্যযুক্ত।
  • প্রতিটি মৃত্যুর ইভেন্টের জন্য, প্রাসঙ্গিক অক্ষরের রেখাগুলি একটি দৃশ্যমান ব্লবের মধ্যে অবশ্যই শেষ হওয়া উচিত।
  • আপনাকে র‌্যান্ডাল এর প্লটগুলির অন্য কোনও বৈশিষ্ট্য পুনরুত্পাদন করতে হবে না বা তার অঙ্কন শৈলীর পুনরুত্পাদন করতে হবে না। তীক্ষ্ণ বাঁকযুক্ত সরল রেখাগুলি, সমস্ত কালোতে, আরও লেবেল ছাড়াই এবং প্রতিযোগিতায় প্রবেশের জন্য একটি শিরোনাম পুরোপুরি ঠিক। স্থানটি দক্ষতার সাথে ব্যবহার করারও দরকার নেই - যেমন সময়ের স্বতঃস্ফূর্ত দিকনির্দেশ না পাওয়া পর্যন্ত আপনি অন্যান্য অক্ষরের সাথে দেখা করতে কেবল অলগরিদমকে কেবল নীচের দিকে অগ্রসর করে আপনি অ্যালগরিদমকে সহজতর করতে পারেন।

আমি একটি রেফারেন্স সমাধান যুক্ত করেছি যা ঠিক এই ন্যূনতম প্রয়োজনীয়তা পূরণ করে।

এটি সুন্দর করা

এটি যদিও একটি জনপ্রিয়তা প্রতিযোগিতা, সুতরাং এর সর্বোপরি, আপনি যা চান তা কল্পনা করতে পারেন। সর্বাধিক গুরুত্বপূর্ণ সংযোজন হ'ল একটি শালীন লেআউটিং অ্যালগরিদম যা চার্টটিকে আরও সুগঠিত করে তোলে - উদাহরণস্বরূপ যা লাইনগুলিকে অনুসরণ করা সহজ করে তোলে এবং প্রয়োজনীয় লাইন ক্রসিংয়ের সংখ্যা হ্রাস করে। এটিই এই চ্যালেঞ্জের মূল অ্যালগোরিদমিক সমস্যা! চার্টটি পরিষ্কার রাখার ক্ষেত্রে আপনার অ্যালগরিদম কতটা ভাল পারফর্ম করে তা ভোটগুলি সিদ্ধান্ত নেবে।

তবে এখানে আরও কিছু ধারণা দেওয়া হয়েছে, সেগুলির বেশিরভাগ র‌্যান্ডাল এর চার্টের উপর ভিত্তি করে:

সাজসজ্জা:

  • রঙিন লাইন।
  • চক্রান্তের জন্য একটি শিরোনাম।
  • লেবেলিং লাইন শেষ।
  • একটি ব্যস্ত বিভাগের মধ্য দিয়ে চলে গেছে যা স্বয়ংক্রিয়ভাবে রিবেলিলিং লাইনগুলি।
  • হস্তনির্মিত স্টাইল (বা অন্য? যেমনটি আমি বলেছি) লাইন এবং ফন্টগুলির জন্য র্যান্ডাল এর স্টাইলটি পুনরায় উত্পাদন করার দরকার নেই।
  • সময় অক্ষের কাস্টমাইজড ওরিয়েন্টেশন।

অতিরিক্ত এক্সপ্রেশনেস:

  • নামকরণ করা ইভেন্ট / গোষ্ঠী / মৃত্যু।
  • অদৃশ্য হওয়া এবং পুনরায় উপস্থিত হওয়া।
  • অক্ষর দেরীতে প্রবেশ।
  • হাইলাইটগুলি যা অক্ষরগুলির (স্থানান্তরযোগ্য?) বৈশিষ্ট্যগুলি নির্দেশ করে (যেমন লোটআর চার্টে রিংবাটারটি দেখুন)।
  • গ্রুপিং অক্ষগুলিতে অতিরিক্ত তথ্য এনকোডিং (উদাহরণস্বরূপ লোটআর চার্টের মতো ভৌগলিক তথ্য)।
  • সময় ভ্রমণ?
  • বিকল্প বাস্তবতা?
  • একটি চরিত্র অন্য একটি মধ্যে বাঁক?
  • দুটি চরিত্র মার্জ? (একটি চরিত্র বিভাজন?)
  • 3D? (আপনি যদি সত্যিই আরও দূরে চলে যান তবে অনুগ্রহ করে নিশ্চিত হয়ে নিন যে আপনি প্রকৃতপক্ষে কিছুটা কল্পনা করার জন্য অতিরিক্ত মাত্রাটি ব্যবহার করছেন!)
  • অন্য যে কোনও প্রাসঙ্গিক বৈশিষ্ট্য, যা কোনও চলচ্চিত্রের (বা বই ইত্যাদির) আখ্যানটি কল্পনা করতে কার্যকর হতে পারে।

অবশ্যই, এর মধ্যে অনেকের অতিরিক্ত ইনপুট প্রয়োজন হবে এবং আপনি প্রয়োজনীয় হিসাবে আপনার ইনপুট ফর্ম্যাটটি মুক্ত করতে পারেন তবে দয়া করে কীভাবে ডেটা প্রবেশ করা যেতে পারে তা নথি করুন।

আপনি যে বৈশিষ্ট্যগুলি প্রয়োগ করেছেন সেগুলি দেখানোর জন্য দয়া করে এক বা দুটি উদাহরণ অন্তর্ভুক্ত করুন।

আপনার সমাধানটি কোনও বৈধ ইনপুট নিয়ে কাজ করতে সক্ষম হওয়া উচিত, তবে এটি অন্যদের তুলনায় নির্দিষ্ট ধরণের বর্ণনাকে আরও ভালভাবে উপভোগ করতে পারলে এটি একেবারে ঠিক।

ভোটের মানদণ্ড

আমার কোনও বিভ্রান্তি নেই যে আমি লোকদের কীভাবে তাদের ভোটগুলি ব্যয় করা উচিত তা বলতে পারি, তবে এখানে গুরুত্বের দিক থেকে কিছু প্রস্তাবিত গাইডলাইন রয়েছে:

  • ডাবোটোট উত্তরগুলি যা লুফোলগুলি, স্ট্যান্ডার্ডগুলি বা অন্যকে শোষণ করে বা হার্ডকোড এক বা একাধিক ফলাফলকে শোষণ করে ।
  • ন্যূনতম প্রয়োজনীয়তা পূরণ করে না এমন উত্তরগুলিকে আপগ্যাট করবেন না (বাকিটি যতটা অভিনব হোক না কেন)।
  • প্রথম এবং সর্বাগ্রে, দুর্দান্ত লেআউটিং অ্যালগরিদমগুলিকে আপভোট করুন। এর মধ্যে এমন উত্তরগুলি অন্তর্ভুক্ত রয়েছে যা গ্রাফটি সুস্পষ্ট রাখার জন্য লাইনগুলি অতিক্রম করার সময় লম্বা লম্বা করার সময় অনেকগুলি উল্লম্ব স্থান ব্যবহার করে না বা উল্লম্ব অক্ষে অতিরিক্ত তথ্য এনকোড করার ব্যবস্থা করে। বিশাল জগাখিচুড়ি না করে গ্রুপিংয়ের দৃশ্যায়ন করা এই চ্যালেঞ্জের মূল ফোকাস হওয়া উচিত, এটি এটি একটি আকর্ষণীয় অ্যালগরিদমিক সমস্যাটিকে কেন্দ্র করে একটি প্রোগ্রামিং প্রতিযোগিতা হিসাবে রয়ে গেছে।
  • উদ্ভাসিত শক্তি যোগ করে এমন alচ্ছিক বৈশিষ্ট্যগুলিকে উত্সাহিত করুন (যেমন কেবল খাঁটি সজ্জা নয়)।
  • শেষ অবধি, উপস্থাপনা ভাল উপস্থাপনা।

7
কারণ কোড-গল্ফের পর্যাপ্ত পরিমাণে
এক্সকেসিডি নেই

8
@ প্রগাডাসকেলার পিপিসিগিতে কখনও পর্যাপ্ত এক্সকেসিডি থাকতে পারে না। ;) তবে আমি মনে করি না যে আমরা এখনও তার সুপারভাইজড তথ্য গ্রাফিক্স / ভিজ্যুয়ালাইজেশনের চ্যালেঞ্জগুলি তৈরি করার চেষ্টা করেছি, তাই আমি আশা করি আমি এটি দিয়ে টেবিলে নতুন কিছু আনছি। এবং আমি নিশ্চিত যে অন্যদের মধ্যে কেউ কেউ খুব আলাদা এবং আকর্ষণীয় চ্যালেঞ্জও তৈরি করবে।
মার্টিন এন্ডার

আমার সমাধানটি যদি কেবল 12 ক্রুদ্ধ লোক, ডুয়েল (স্পিলবার্গ, 1971, নিয়মিত মোটর চালক বনাম ক্রেজিড ট্র্যাকার) এবং প্লেন, ট্রেন এবং অটোমোবাইলগুলি পরিচালনা করে তবে কী ঠিক আছে? ;-)
স্তরের নদী সেন্ট

4
আমি ভাবছি যে প্রাইমারের ইনপুটটি কেমন হবে ...
জোশুয়া

1
হ্যাঁ, এই ধারণাটি ছিল যদি কোনও ইভেন্টে আরও তালিকা থাকে তবে এটি তালিকাভুক্তি। সুতরাং এর [[x,y,z]]অর্থ হ'ল সমস্ত অক্ষর বর্তমানে এক সাথে রয়েছে। তবে যদি ইভেন্টে তালিকাগুলি না থাকে তবে কেবলমাত্র অক্ষরগুলি সরাসরি হয়, এটি এমনকি একটি মৃত্যুরও তাই একই পরিস্থিতিতে [x,y,z]মানে এই তিনটি চরিত্র মারা যায়। অন্য কিছু ফর্ম্যাট ব্যবহার করতে দ্বিধা বোধ করবেন না, কোনও কিছু মৃত্যু বা গ্রুপিং ইভেন্ট কিনা তা আপনাকে সুস্পষ্টভাবে নির্দেশ করে। উপরের ফর্ম্যাটটি কেবল একটি পরামর্শ। যতক্ষণ না আপনার ইনপুট ফর্ম্যাটটি কমপক্ষে অভিব্যক্তিযুক্ত ততক্ষণ আপনি অন্য কিছু ব্যবহার করতে পারেন।
মার্টিন এন্ডার

উত্তর:


18

পাইপোন 3 নপি, স্কিপি এবং ম্যাটপ্ল্লোলিব সহ

জুরাসিক পার্ক

সম্পাদনা করুন :

  • আমি গ্রুপগুলিকে ইভেন্টের মধ্যে একই আপেক্ষিক অবস্থানে রাখার চেষ্টা করেছি, তাই sorted_eventফাংশন।
  • অক্ষরের y অবস্থান নির্ণয়ের জন্য নতুন ফাংশন ( coords)।
  • প্রতিটি জীবিত ইভেন্ট এখন দু'বার প্লট করা হয়েছে, তাই চরিত্রগুলি আরও ভালভাবে একসাথে আঁকড়ে যায়।
  • যোগ করা কিংবদন্তি এবং সরানো অক্ষ লেবেল।
import math
import numpy as np
from scipy.interpolate import interp1d
from matplotlib import cm, pyplot as plt


def sorted_event(prev, event):
    """ Returns a new sorted event, where the order of the groups is
    similar to the order in the previous event. """
    similarity = lambda a, b: len(set(a) & set(b)) - len(set(a) ^ set(b))
    most_similar = lambda g: max(prev, key=lambda pg: similarity(g, pg))
    return sorted(event, key=lambda g: prev.index(most_similar(g)))


def parse_data(chars, events):
    """ Turns the input data into 3 "tables":
    - characters: {character_id: character_name}
    - timelines: {character_id: [y0, y1, y2, ...],
    - deaths: {character_id: (x, y)}
    where x and y are the coordinates of a point in the xkcd like plot.
    """
    characters = dict(enumerate(chars))
    deaths = {}
    timelines = {char: [] for char in characters}

    def coords(character, event):
        for gi, group in enumerate(event):
            if character in group:
                ci = group.index(character)
                return (gi + 0.5 * ci / len(group)) / len(event)
        return None

    t = 0
    previous = events[0]
    for event in events:
        if isinstance(event[0], list):
            previous = event = sorted_event(previous, event)
            for character in [c for c in characters if c not in deaths]:
                timelines[character] += [coords(character, event)] * 2
            t += 2
        else:
            for char in set(event) - set(deaths):
                deaths[char] = (t-1, timelines[char][-1])

    return characters, timelines, deaths


def plot_data(chars, timelines, deaths):
    """ Draws a nice xkcd like movie timeline """

    plt.xkcd()  # because python :)

    fig = plt.figure(figsize=(16,8))
    ax = fig.add_subplot(111)
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)
    ax.set_xlim([0, max(map(len, timelines.values()))])

    color_floats = np.linspace(0, 1, len(chars))
    color_of = lambda char_id: cm.Accent(color_floats[char_id])

    for char_id in sorted(chars):
        y = timelines[char_id]
        f = interp1d(np.linspace(0, len(y)-1, len(y)), y, kind=5)
        x = np.linspace(0, len(y)-1, len(y)*10)
        ax.plot(x, f(x), c=color_of(char_id))

    x, y = zip(*(deaths[char_id] for char_id in sorted(deaths)))
    ax.scatter(x, y, c=np.array(list(map(color_of, sorted(deaths)))), 
               zorder=99, s=40)

    ax.legend(list(map(chars.get, sorted(chars))), loc='best', ncol=4)
    fig.savefig('testplot.png')


if __name__ == '__main__':
    chars = [
        "T-Rex","Raptor","Raptor","Raptor","Malcolm","Grant","Sattler",
        "Gennaro","Hammond","Kids","Muldoon","Arnold","Nedry","Dilophosaurus"
    ]
    events = [
        [[0],[1,2,3],[4],[5,6],[7,8,10,11,12],[9],[13]],
        [[0],[1,2,3],[4,7,5,6,8,9,10,11,12],[13]],
        [[0],[1,2,3],[4,7,5,6,8,9,10],[11,12],[13]],
        [[0],[1,2,3],[4,7,5,6,9],[8,10,11,12],[13]],
        [[0,4,7],[1,2,3],[5,9],[6,8,10,11],[12],[13]],
        [7],
        [[5,9],[0],[4,6,10],[1,2,3],[8,11],[12,13]],
        [12],
        [[0,5,9],[1,2,3],[4,6,10,8,11],[13]],
        [[0],[5,9],[1,2],[3,11],[4,6,10,8],[13]],
        [11],
        [[0],[5,9],[1,2,10],[3,6],[4,8],[13]],
        [10],
        [[0],[1,2,9],[5,6],[3],[4,8],[13]],
        [[0],[1],[9,5,6],[3],[4,8],[2],[13]],
        [[0,1,9,5,6,3],[4,8],[2],[13]],
        [1,3],
        [[0],[9,5,6,3,4,8],[2],[13]]
    ]
    plot_data(*parse_data(chars, events))

হাহ, খুব সুন্দর এক্স কে সি ডি চেহারা:) ... যে কোনও সুযোগ আপনি লাইনগুলি লেবেল করতে সক্ষম হবেন?
মার্টিন এন্ডার

লাইনগুলি লেবেল করুন, বিভিন্ন প্রস্থের রেখাগুলি থাকুন (কিছু পয়েন্টের মধ্যে হ্রাস / বাড়ার সাথে) এবং শেষ অবধি ... ইন্টারপোল্ট করার সময় একটি শীর্ষবিন্দুর কাছাকাছি হলে লাইনগুলি আরও অনুভূমিক করুন, আরও বেজিয়ার বক্ররেখির মতো এবং এটি সেরা প্রবেশিকা আইএমও হবে: )
অপ্টিমাইজার 21

1
ধন্যবাদ, তবে এক্সকেসিডি শৈলীটি ম্যাটপ্ল্লোলিবের অন্তর্ভুক্ত, সুতরাং এটি কেবল একটি ফাংশন কল ছিল :) আচ্ছা, আমি একটি কিংবদন্তি তৈরি করেছি, তবে এটি চিত্রটির প্রায় এক তৃতীয়াংশ অধিকার করেছে, তাই আমি এটি মন্তব্য করেছিলাম।
pgy

আমি আমার উত্তরটি পরিবর্তন করেছি, আমি মনে করি এটি এখন আরও ভাল দেখাচ্ছে।
পিজি

6

টি-এসকিউএল

আমি এন্ট্রি হিসাবে এতে সন্তুষ্ট নই, তবে আমি মনে করি এই প্রশ্নটি কমপক্ষে এটি চেষ্টা করার যোগ্য। আমি পরে সময় দেওয়ার অনুমতি দেওয়ার ক্ষেত্রে এটির উন্নতি করার চেষ্টা করব, তবে এসকিউএল-এ লেবেলিং সবসময় সমস্যা হবে। সমাধানটির জন্য এসকিউএল 2012+ প্রয়োজন এবং এটি এসএসএমএসে চালিত হয় (এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও)। আউটপুট স্থানিক ফলাফল ট্যাবে।

-- Variables for the input
DECLARE @actors NVARCHAR(MAX) = '["T-Rex", "Raptor", "Raptor", "Raptor", "Malcolm", "Grant", "Sattler", "Gennaro", "Hammond", "Kids", "Muldoon", "Arnold", "Nedry", "Dilophosaurus"]';
DECLARE @timeline NVARCHAR(MAX) = '
[
   [[1], [2, 3, 4], [5], [6, 7], [8, 9, 11, 12, 13], [10], [14]],
   [[1], [2, 3, 4], [5, 8, 6, 7, 9, 10, 11, 12, 13], [14]],
   [[1], [2, 3, 4], [5, 8, 6, 7, 9, 10, 11], [12, 13], [14]],
   [[1], [2, 3, 4], [5, 8, 6, 7, 10], [9, 11, 12, 13], [14]],
   [[1, 5, 8], [2, 3, 4], [6, 10], [7, 9, 11, 12], [13], [14]],
   [8],
   [[6, 10], [1], [5, 7, 11], [2, 3, 4], [9, 12], [13, 14]],
   [13],
   [[1, 6, 10], [2, 3, 4], [5, 7, 11, 9, 12], [14]],
   [[1], [6, 10], [2, 3], [4, 12], [5, 7, 11, 9], [14]],
   [12],
   [[1], [6, 10], [2, 3, 11], [4, 7], [5, 9], [14]],
   [11],
   [[1], [2, 3, 10], [6, 7], [4], [5, 9], [14]],
   [[1], [2], [10, 6, 7], [4], [5, 9], [3], [14]],
   [[1, 2, 10, 6, 7, 4], [5, 9], [3], [14]],
   [2, 4],
   [[1], [10, 6, 7, 5, 9], [3], [14]]
]
';

-- Populate Actor table
WITH actor(A) AS ( SELECT CAST(REPLACE(STUFF(REPLACE(REPLACE(@actors,', ',','),'","','</a><a>'),1,2,'<a>'),'"]','</a>') AS XML))
SELECT ROW_NUMBER() OVER (ORDER BY(SELECT \)) ActorID, a.n.value('.','varchar(50)') Name
INTO Actor
FROM actor CROSS APPLY A.nodes('/a') as a(n);

-- Populate Timeline Table
WITH Seq(L) AS (
    SELECT CAST(REPLACE(REPLACE(REPLACE(REPLACE(@timeline,'[','<e>'),']','</e>'),'</e>,<e>','</e><e>'),'</e>,','</e>') AS XML)
    ),
    TimeLine(N,Exerpt,Elem) AS (
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) N
        ,z.query('.')
        ,CAST(REPLACE(CAST(z.query('.') AS VARCHAR(MAX)),',','</e><e>') AS XML)
    FROM Seq 
        CROSS APPLY Seq.L.nodes('/e/e') AS Z(Z)
    ),
    Groups(N,G,Exerpt) AS (
    SELECT N, 
        ROW_NUMBER() OVER (PARTITION BY N ORDER BY CAST(SUBSTRING(node.value('.','varchar(50)'),1,ISNULL(NULLIF(CHARINDEX(',',node.value('.','varchar(50)')),0),99)-1) AS INT)), 
        CAST(REPLACE(CAST(node.query('.') AS VARCHAR(MAX)),',','</e><e>') AS XML) C
    FROM TimeLine 
        CROSS APPLY Exerpt.nodes('/e/e') as Z(node)
    WHERE Exerpt.exist('/e/e') = 1
    )
SELECT * 
INTO TimeLine
FROM (
    SELECT N, null G, null P, node.value('.','int') ActorID, 1 D 
    FROM TimeLine CROSS APPLY TimeLine.Elem.nodes('/e') AS E(node)
    WHERE Exerpt.exist('/e/e') = 0
    UNION ALL
    SELECT N, G, DENSE_RANK() OVER (PARTITION BY N, G ORDER BY node.value('.','int')), node.value('.','int') ActorID, 0
    FROM Groups CROSS APPLY Groups.Exerpt.nodes('/e') AS D(node)
    ) z;

-- Sort the entries again
WITH ReOrder AS (
            SELECT *, 
                ROW_NUMBER() OVER (PARTITION BY N,G ORDER BY PG, ActorID) PP, 
                COUNT(P) OVER (PARTITION BY N,G) CP, 
                MAX(G) OVER (PARTITION BY N) MG, 
                MAX(ActorID) OVER (ORDER BY (SELECT\)) MA
            FROM (
                SELECT *,
                    LAG(G,1) OVER (PARTITION BY ActorID ORDER BY N) PG,
                    LEAD(G,1) OVER (PARTITION BY ActorID ORDER BY N) NG
                FROM timeline
                ) rg
    )
SELECT * INTO Reordered
FROM ReOrder;
ALTER TABLE Reordered ADD PPP INT
GO
ALTER TABLE Reordered ADD LPP INT
GO
WITH U AS (SELECT N, P, LPP, LAG(PP,1) OVER (PARTITION BY ActorID ORDER BY N) X FROM Reordered)
UPDATE U SET LPP = X FROM U;
WITH U AS (SELECT N, ActorID, P, PG, LPP, PPP, DENSE_RANK() OVER (PARTITION BY N,G ORDER BY PG, LPP) X FROM Reordered)
UPDATE U SET PPP = X FROM U;
GO

SELECT Name, 
    Geometry::STGeomFromText(
        STUFF(LS,1,2,'LINESTRING (') + ')'
        ,0)
        .STBuffer(.1)
        .STUnion(
        Geometry::STGeomFromText('POINT (' + REVERSE(SUBSTRING(REVERSE(LS),1,CHARINDEX(',',REVERSE(LS))-1)) + ')',0).STBuffer(D*.4)
        )
FROM Actor a
    CROSS APPLY (
        SELECT CONCAT(', '
            ,((N*5)-1.2)
                ,' ',(G)+P
            ,', '
            ,((N*5)+1.2)
                ,' ',(G)+P 
            ) AS [text()]
        FROM (
            SELECT ActorID, N,
                CASE WHEN d = 1 THEN
                    ((MA+.0) / (LAG(MG,1) OVER (PARTITION BY ActorID ORDER BY N)+.0)) * 
                    PG * 1.2
                ELSE 
                    ((MA+.0) / (MG+.0)) * 
                    G * 1.2
                END G,
                CASE WHEN d = 1 THEN
                (LAG(PPP,1) OVER (PARTITION BY ActorID ORDER BY N) -((LAG(CP,1) OVER (PARTITION BY ActorID ORDER BY N)-1)/2)) * .2 
                ELSE
                (PPP-((CP-1)/2)) * .2 
                END P
                ,PG
                ,NG
            FROM Reordered
            ) t
        WHERE a.actorid = t.actorid
        ORDER BY N, G
        FOR XML PATH('')
        ) x(LS)
    CROSS APPLY (SELECT MAX(D) d FROM TimeLine dt WHERE dt.ActorID = a.ActorID) d
GO

DROP TABLE Actor;
DROP TABLE Timeline;
DROP TABLE Reordered;

ফলাফল টাইমলাইন নিম্নলিখিত মত দেখাচ্ছে এখানে চিত্র বর্ণনা লিখুন


4

গণিত, রেফারেন্স সমাধান

রেফারেন্সের জন্য, আমি একটি গাণিতিক স্ক্রিপ্ট সরবরাহ করি যা ন্যূনতম প্রয়োজনীয়তাগুলি পুরোপুরি পূরণ করে, আরও কিছু নয়, কিছু কম নয়।

এটি অক্ষরগুলিকে প্রশ্নটির ফর্ম্যাট charsএবং এর মধ্যে ইভেন্টগুলির তালিকা হতে পারে events

n = Length@chars;
m = Max@Map[Length, events, {2}];
deaths = {};
Graphics[
 {
  PointSize@Large,
  (
     linePoints = If[Length@# == 3,
         lastPoint = {#[[1]], #[[2]] + #[[3]]/(m + 2)},
         AppendTo[deaths, Point@lastPoint]; lastPoint
         ] & /@ Position[events, #];
     {
      Line@linePoints,
      Text[chars[[#]], linePoints[[1]] - {.5, 0}]
      }
     ) & /@ Range@n,
  deaths
  }
 ]

উদাহরণ হিসাবে, এখানে ম্যাথমেটিকার তালিকার ধরণটি ব্যবহার করে জুরাসিক পার্কের উদাহরণ রয়েছে:

chars = {"T-Rex", "Raptor", "Raptor", "Raptor", "Malcolm", "Grant", 
   "Sattler", "Gennaro", "Hammond", "Kids", "Muldoon", "Arnold", 
   "Nedry", "Dilophosaurus"};
events = {
   {{1}, {2, 3, 4}, {5}, {6, 7}, {8, 9, 11, 12, 13}, {10}, {14}},
   {{1}, {2, 3, 4}, {5, 8, 6, 7, 9, 10, 11, 12, 13}, {14}},
   {{1}, {2, 3, 4}, {5, 8, 6, 7, 9, 10, 11}, {12, 13}, {14}},
   {{1}, {2, 3, 4}, {5, 8, 6, 7, 10}, {9, 11, 12, 13}, {14}},
   {{1, 5, 8}, {2, 3, 4}, {6, 10}, {7, 9, 11, 12}, {13}, {14}},
   {8},
   {{6, 10}, {1}, {5, 7, 11}, {2, 3, 4}, {9, 12}, {13, 14}},
   {13},
   {{1, 6, 10}, {2, 3, 4}, {5, 7, 11, 9, 12}, {14}},
   {{1}, {6, 10}, {2, 3}, {4, 12}, {5, 7, 11, 9}, {14}},
   {12},
   {{1}, {6, 10}, {2, 3, 11}, {4, 7}, {5, 9}, {14}},
   {11},
   {{1}, {2, 3, 10}, {6, 7}, {4}, {5, 9}, {14}},
   {{1}, {2}, {10, 6, 7}, {4}, {5, 9}, {3}, {14}},
   {{1, 2, 10, 6, 7, 4}, {5, 9}, {3}, {14}},
   {2, 4},
   {{1}, {10, 6, 7, 4, 5, 9}, {3}, {14}}
};

আমরা পাবো:

এখানে চিত্র বর্ণনা লিখুন

(আরও বড় সংস্করণের জন্য ক্লিক করুন।)

এটি খুব খারাপ দেখাচ্ছে না, তবে এটি বেশিরভাগ কারণ ইনপুট ডেটা কম বেশি অর্ডার করা হয়। আমরা যদি প্রতিটি ইভেন্টে গোষ্ঠী এবং চরিত্রগুলিকে বদলে ফেলি (একই কাঠামোটি বজায় রেখে) তবে এর মতো জিনিসগুলি ঘটতে পারে:

এখানে চিত্র বর্ণনা লিখুন

যা কিছুটা গোলমেলে।

আমি যেমন বলেছি, এটি কেবল সর্বনিম্ন প্রয়োজনীয়তা পূরণ করে। এটি একটি দুর্দান্ত বিন্যাস সন্ধান করার চেষ্টা করে না এবং এটি সুন্দর নয়, তবে এটিই আপনি ছেলেরা এসেছেন!


আমি কেবল ভেবেছিলাম ধারালো কোণগুলি অপসারণ করার জন্য আপনি চতুর্ভুজ বা ঘনক্ষেত্রগুলি ব্যবহার করে সম্ভবত এটি 'প্রাকটিটাইফাই' করতে পারবেন? (আমি এটি সেভাবে করব যাতে প্রদত্ত পয়েন্টগুলির স্পর্শক সর্বদা 0 থাকে)
flawr

@ ফ্লোয়ার শিওর, বা আমি এই কৌশলগুলির কয়েকটি প্রয়োগ করতে পারি , তবে এটি এই উত্তরটির উদ্দেশ্য ছিল না। ;) আমি সত্যই নিখুঁত সর্বনিম্নের জন্য একটি রেফারেন্স সরবরাহ করতে চেয়েছিলাম।
মার্টিন ইন্ডার

3
ওহ দুঃখিত, এমনকি আপনার খেয়ালও করেন নি যে এটি আপনার নিজের প্রশ্ন = পি
ফ্লাওয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.