এটি কি লিনিয়ারাইজড ট্রি? (প্রথমতম সংস্করণ)


11

পটভূমি

একটি লেবেলযুক্ত গাছ দেখতে দেখতে এটি দেখতে পারে:

   o
 / | \
o  o  o
|    / \
o   o   o

এই গাছটিকে লিনিয়ারাইজ করার জন্য , আমরা প্রথমে প্রতিটি নোডকে oতার শিশু নোডের সংখ্যার সাথে লেবেল করি:

   3
 / | \
1  0  2
|    / \
0   0   0

এবং তারপরে একটি তালিকাতে সংখ্যাটি শ্বাস-প্রশ্বাসের প্রথম পদ্ধতিতে লিখুন, যার অর্থ লাইন এবং বাম থেকে ডানদিকে:

[3, 1, 0, 2, 0, 0, 0]

এটি উপরের গাছটির একটি অনন্য এবং দ্ব্যর্থহীন উপস্থাপনা, যার অর্থ কোনও দুটি পৃথক খাঁটি গাছের একই লাইনারিকরণ থাকবে না এবং আমরা তালিকা থেকে মূল গাছটিকে পুনর্গঠন করতে পারি।

যদিও প্রতিটি গাছ একটি নির্দিষ্ট পূর্ণসংখ্যার তালিকার সাথে সম্পর্কিত তবে প্রতিটি পূর্ণসংখ্যার তালিকাটি একটি বৈধ রৈখিক গাছের [2, 0, 0, 0]প্রতিনিধিত্ব করে না : উদাহরণস্বরূপ, কোনও বৈধ গাছকে উপস্থাপন করা হয় না, যদি আমরা এটি ডি-লিনিয়ারাইজ করার চেষ্টা করি তবে আমরা এই গাছটি দিয়ে শেষ করব end

[2,0,0,0] -> 2 [0,0,0] -> 2 [0,0] -> 2 [0]
            / \          / \        / \
                        0          0   0

তবে তালিকায় এখনও একটি 0বাম আছে এবং এটি রাখার মতো কোথাও নেই। তেমনি [2, 0]একটি বৈধ ট্রি লিনিয়ারাইজেশনও নয়, কারণ ডি-রেখাযুক্ত গাছের খালি শিশু স্পট রয়েছে:

  2
 / \
0

কার্য

একটি পূর্ণসংখ্যা তালিকা দেওয়া হয়েছে, যতটা সম্ভব কম বাইট ব্যবহার করে এটি কোনও গাছের বৈধ লিনিয়ারাইজেশন কিনা তা স্থির করুন। আপনি একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন লিখতে পারেন।

ইনপুট: অ-নেতিবাচক পূর্ণসংখ্যার একটি খালি খালি তালিকা।

আউটপুট: তালিকাটি যদি গাছের লৈখিকরণ হয়, অন্যথায় মিথ্যা মান।

Testcases

Truthy
[0]
[2, 0, 0]
[1, 1, 1, 1, 1, 0]
[3, 1, 0, 2, 0, 0, 0]
[2, 0, 2, 2, 0, 0, 2, 0, 0]
[3, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0]
[1, 5, 3, 0, 2, 1, 4, 0, 1, 0, 0, 2, 1, 0, 0, 1, 1, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0]
Falsy
[0, 1]
[2, 0]
[2, 0, 0, 0]
[1, 0, 1]
[3, 2, 1, 0]
[2, 0, 0, 2, 0, 0]
[4, 1, 0, 3, 0, 0, 0, 0]
[4, 2, 0, 3, 1, 0, 0, 0, 0, 0]

উত্তর:


4

হাস্কেল, 44 বাইট

f[n:k]=iterate f[k]!!n
f _=[]
g x=f[x]==[[]]

একটি ফাংশন সংজ্ঞায়িত করে gযা একটি তালিকা গ্রহণ করে এবং বুলিয়ান দেয়। এটি দেখুন সমস্ত পরীক্ষার কেস পাস

ব্যাখ্যা

এটি গভীরতা-প্রথম এবং প্রস্থের প্রথম লিনিয়ারীকরণগুলি একই অ্যারে উত্পাদন করে তার উপর নির্ভর করে। বিশদ জানতে মার্টিনের উত্তর দেখুন; মূলত তারা উভয় অ্যারেতে একই গাণিতিক শর্ত দেয়।

ফাংশনটি fএকটি সিঙ্গলটন তালিকায় মোড়ানো ইনপুট তালিকা দেওয়া হয়। এটি nতালিকার বাইরে থাকা একটি নম্বরকে পপ করে , তারপরে nপপড নোডের শিশুদের প্রক্রিয়া করার জন্য অবশিষ্ট তালিকায় নিজেকে বার বার কল করে (গভীরতা প্রথমে)। খালি তালিকার পপিংয়ের ফলাফল [], যা আমি একটি ত্রুটি রাষ্ট্র হিসাবে ব্যবহার করি। ফাংশনটি চূড়ান্ত করে gযে শেষ ফলাফলটি [[]], কোনও অনপ্রসেসড নোড সহ অনন্য-ভুল-ভ্রান্ত অবস্থা। যদি হাস্কেল দুর্বলভাবে টাইপ করা থাকে তবে আমি কেবল 0ত্রুটি রাষ্ট্র হিসাবে বা অন্য কিছু ব্যবহার করতে পারতাম এবং অন্য কোনও তালিকায় ইনপুটটি গুটিয়ে রাখতে হত না।


3

গণিত, 38 বাইট

Last@#<0<=Min@Most@#&@Accumulate[#-1]&

মূল ধারণাটি হ'ল আমরা পূরণ করতে প্রচুর নোডের ট্র্যাক রাখি। তালিকার প্রতিটি উপাদান একটি নোড ব্যবহার করে এবং এতে যতটা সন্তান রয়েছে তত বেশি যোগ করে। সুতরাং প্রতিটি উপাদান iদ্বারা মোট গণনা পরিবর্তন i-1। এই গণনাটি একে একে বন্ধ রয়েছে, কারণ 1(মূল) থেকে শুরু হওয়া উচিত , না 0

গাছটি বৈধ হওয়ার জন্য আমরা ক) 0তালিকার জুড়ে কখনই নীচে যেতে পারি না , কারণ বর্তমান নোডটি রাখার মতো আমাদের কোথাও নেই এবং খ) শেষে শেষ হওয়া দরকার -1, অন্যথায় আমরা অব্যবহৃত নোডগুলি পেয়েছি।

আমরা এই চলমান মোট নোডগুলি সহ Accumulate[#-1]পাই (যা ইনপুট তালিকার বিয়োগের উপসর্গের যোগফলগুলি গণনা করে)। এবং তারপরে আমরা চেক করব যে শেষ উপাদানটি এবং কেবলমাত্র শেষ উপাদানটি রয়েছে -1:

Last@#<0<=Min@Most@#

নোট করুন যে শেষ উপাদানটি নেতিবাচক কিনা তা যাচাই করা যথেষ্ট, যেহেতু আমরা কখনই এর চেয়ে বেশি হ্রাস করতে পারি না 1, সুতরাং সর্বশেষ মানগুলি -2কম বা কম হলে এটি অন্যদের পক্ষে সর্বনিম্ন-নেতিবাচক হওয়া অসম্ভব।


2

রেটিনা , 29 বাইট

\d+
$*
^(?<-1>(1)*,)*$(?(1)!)

এটি অনলাইন চেষ্টা করুন! (প্রথম লাইন একটি লাইনফিড-বিচ্ছিন্ন পরীক্ষা স্যুট সক্ষম করে))

ব্যাখ্যা

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

\d+
$*

এই কেবল, ইউনারী ইনপুট পরিবর্তন করে প্রতিটি পূর্ণসংখ্যা বাঁক nমধ্যে n1s।

^(?<-1>(1)*,)*$(?(1)!)

আসল যাদুটি এখানেই ঘটে। এটি একটি মোটামুটি সংক্ষিপ্ত রেজেক্স যা কেবল বৈধ গাছের সাথে মেলে তবে এটি মেকানিক্সগুলি বেশ সূক্ষ্ম।

আমি নোডের সংখ্যা ট্র্যাক রাখতে ব্যালেন্সিং গ্রুপগুলি ব্যবহার করছি , যা রেজেক্সের অভ্যন্তরে স্ট্যাকের সাথে কাজ করার একটি উপায়।

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

সুতরাং এখানে regex একটি ভাঙ্গন আছে:

^        e# Anchor the match to the beginning of the string.
(?<-1>   e# Each repetition of this group will match one number. 
         e# We can ignore the <-1> for now.
  (1)*   e#   Match each unary digit of the current number, pushing
         e#   a capture onto stack 1. This increments our total of
         e#   remaining nodes by 1 for each child.
  ,      e#   Match a comma. Note that this requires that there is at
         e#   least one more number in the list.
)*       e# At the end of the repetition the <-1> pops one capture from
         e# the stack. This is the node that the current number itself
         e# takes up.
$        e# Match the end of the string. This requires the input to end
         e# in a zero, because the last thing we matched was a comma.
(?(1)!)  e# Make sure that stack 1 is empty, so that we don't have any
         e# unused nodes.

1

সিজেএম (20 বাইট)

{X0@{+\(_0>{\}*}/|!}

অনলাইন পরীক্ষা স্যুট । এটি একটি বেনামে ব্লক যা স্ট্যাকের একটি অ্যারে নেয় এবং স্ট্যাকের উপরে 0 বা 1 ছেড়ে যায়।

ব্যবচ্ছেদ

সিউডোকোডে এটি হ'ল:

p = 1
q = 0
foreach (i in input):
  q += i
  if (--p <= 0):      # in practice, if (--p == 0):
      p, q = q, p
return (p | q) == 0   # i.e. p == 0 && q == 0

qগাছের বর্তমান স্তরে নোডগুলির লেবেলের যোগফল জমা করে; pবর্তমান স্তরের অবশিষ্ট নোডগুলি গণনা করে।


{X0@{+\(_{\}&}/|!}আমি মনে করি?
মার্টিন ইন্ডার

এছাড়াও মনে হচ্ছে আপনার এটিকে এড়ানোর জন্য একটি সম্পূর্ণ প্রোগ্রাম ব্যবহার করে একটি বাইট সংরক্ষণ করতে সক্ষম হওয়া উচিত @
মার্টিন এন্ডার

1

ল্যাবরেথ , 17 বাইট

(
+?
;-)
,_"
@@,!

এটি অনলাইন চেষ্টা করুন!

সত্যবাদী আউটপুট -1এবং মিথ্যা আউটপুট খালি। লাইব্রের্থে সত্যবাদী এবং মিথ্যা সংজ্ঞা দেওয়া কিছুটা জটিল, কারণ ল্যাবরেথের শাখাগুলি মূলত তিনটি হয়। তবে, নির্ভরযোগ্যভাবে দুটি শাখা দিয়ে শর্তাধীন নির্মাণের একমাত্র উপায়, আপনি কেবল এটি করতে পারেন:

>"F
 T

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

ব্যাখ্যা

অ্যালগরিদমটি এখনও আমার ম্যাথমেটিকা ​​এবং রেটিনা জবাবগুলির মতো একই, তবে ল্যাবরেথের নিয়ন্ত্রণ প্রবাহের কারণে, এটি এবার কিছুটা আলাদা কাজ করেছে:

  • আমরা এখানে মোট কাউন্টার ছাড়াই কাজ করি না। পরিবর্তে আমরা ক) একটি নেতিবাচক কাউন্টার নিয়ে কাজ করি এবং খ) প্রাথমিকভাবে এটি সূচনা করি -11, যাতে আমরা চাই যে কাউন্টারের তালিকাগুলিতে negativeণাত্মক থাকুক এবং শেষ ইনপুটটিতে শূন্য হিট হোক। এটি আসলে এখানে নিয়ন্ত্রণ প্রবাহকে সহজতর করে।
  • সম্পূর্ণ তালিকা তৈরির পরিবর্তে এবং এতে ভুল মান রয়েছে কিনা তা যাচাই করার পরিবর্তে তিনটি সম্ভাব্য সমাপ্তির শর্ত রয়েছে:

    1. আমরা শূন্যের মোট গণনা পৌঁছানোর আগে ইওএফ হিট করেছি। সেক্ষেত্রে অব্যবহৃত নোডগুলি বাকি আছে এবং আমরা কিছুই প্রিন্ট করি না।
    2. আমরা শূন্যে পৌঁছেছি এবং আমরা ইওএফ এ আছি। এই ক্ষেত্রে, আমরা একটি বৈধ গাছ পেয়েছি।
    3. আমরা শূন্যে পৌঁছেছি এবং ইওএফ-তে এখনও নেই। এই ক্ষেত্রে, সমস্ত উপাদান coveringেকে দেওয়ার আগে আমরা নোডের বাইরে চলে এসেছি এবং আমরা কিছুই প্রিন্ট করি না।

আসল কোড হিসাবে, আমরা উপরের বাম কোণে শুরু। (একটি মধ্যে স্ট্যাকের উপর অন্তর্নিহিত শূন্য সক্রিয় -1, যা চলমান মোট হবে। এরপরে আমরা প্রোগ্রামটির খুব কড়া প্রধান লুপটি প্রবেশ করি +?-)"_,;+:

+   Add the top two values. This does nothing on the first iteration,
    but gets rid of a helper-zero on subsequent iterations.
?   Read and push integer.
-   Subtract it from running total.
)   Increment.
"   No-op. There is a branch at this point. If the running total is zero,
    we move straight ahead onto the , (see below). Otherwise, the loop continues.
_   Push a zero. This is necessary to prevent the IP from turning south.
,   Read a character. This will either be the next separator (some positive
    number) or EOF (-1). If it's EOF, the IP turns south and the program
    terminates. Otherwise, the loop continues.
;   Discard the separator.

এটি কেবলমাত্র সেই ক্ষেত্রে ফেলেছে যেখানে আমরা চলমান মোট পরিমাণকে এক পর্যায়ে হ্রাস করেছি। আইপি নীচের ডানদিকে চলে যায় ,এবং আমরা EOF এ পৌঁছেছি কিনা তা পরীক্ষা করতে অন্য একটি অক্ষর পড়ে। যদি তা না হয় তবে মানটি ইতিবাচক হবে এবং আইপি পশ্চিম দিকে ঘুরবে @এবং প্রোগ্রামটি সমাপ্ত হবে। আমরা যদি নাগালের ফাইলের শেষে করেনি, আইপি পূর্ব ফিরিয়ে নেয় এবং ছাপে -1সঙ্গে !@প্রোগ্রামটি শেষ করার জন্য আইপিটি কিছুটা অদ্ভুত পথ দিয়ে নীচের বাম দিকে যাওয়ার পথে কীট হয়ে যাবে।


0

পাইথন, 82 বাইট

lambda l:len(l)==sum(l)+1 and not any(list(l[x]>=len(l)-x for x in range(len(l))))

আরও পরীক্ষার মামলা দরকার।


listকমপক্ষে এটি পাইথন 2 হলে আপনার সাথে কাস্ট করার দরকার নেই এবং দ্বিতীয় শর্তটি পুনরায় সাজানো এবং বিবর্তিত করে আপনি এটি 70 বাইটে পেতে পারেন:lambda l:all(l[x]<len(l)-x for x in range(len(l)))and len(l)==sum(l)+1
কেড

^ এই সম্পর্ক, আপনাকে লাশ পরিবর্তন করতে পারেন allহতে x<len(l)-y for y,x in enumerate(l)68 থেকে এটি পেতে অন্য 2 বাইট সংরক্ষণ করতে
Kade

আমি এই মুহূর্তে আরও গল্ফ করছি না কারণ আমি মনে করি এটি সঠিক সমাধান নয়। টিপস জন্য ধন্যবাদ।
স্পার 15

0

পাইথ, 13 বাইট

qxsM._tMQ_1tl

আমরা ইনপুট উপস্থাপনার সমস্ত পয়েন্টে গাছের বর্তমান ভরাট-নেস গণনা করে শুরু করি। ধারণার সেই অংশটি মূলত মার্টিন ইন্ডারের কাছ থেকে নেওয়া হয়েছে, তাই তাকে ধন্যবাদ।sM._tMQ

আমাদের কাছে এই তালিকাটি তৈরি হয়ে গেলে, আমরা পরীক্ষা করে দেখি যে -1( x..._1) যুক্ত প্রথম সূচকটি ইনপুট বিয়োগের এক ( q...tl(Q)) এর দৈর্ঘ্য কিনা ।

বিশ্বাস করি না এটি কাজ করে? এটি নিজে চেষ্টা করো!

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