Чи представляє цей набір натуральне число?


26

В теорії множин, натуральні числа N={0,1,2,3,...} зазвичай кодуються як чисті множини , тобто множини, які містять лише порожній набір або інші чисті множини. Однак не всі чисті множини представляють натуральні числа. Ця задача полягає у визначенні того, чи представляє даний чистий набір кодування натурального числа чи ні.

Кодування натуральних чисел працює таким чином 1 :

  • Нуль - це порожній набір: Set(0)={}
  • Для числа н>0 : Set(n)=Set(n1){Set(н-1)}

Таким чином, кодування перших кількох натуральних чисел є

  • 0{}
  • 1{0}{{}}
  • 2{0,1}{{},{{}}}
  • 3{0,1,2}{{},{{}},{{},{{}}}}
  • 4{0,1,2,3}{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}}

Завдання

  • Давши рядок, що представляє чистий набір, визначте, чи цей набір кодує натуральне число відповідно до вищезгаданої конструкції.
  • Однак зауважте, що елементи набору не впорядковані, тому не є єдиним дійсним поданням 3, як, наприклад, \ {\ {\ {\} \}, \ {\}, \ {\ {\ {\} \}, \ {\} \} \} являє собою той самий набір.{{},{{}},{{},{{}}}}3{{{}},{},{{{}},{}}}
  • Ви можете використовувати [], ()або <>замість {}.
  • Ви можете припустити, що набори задані без ,розділювача.
  • Можна припустити, що у введенні не буде жодних повторюваних елементів, наприклад {{},{}}, це невірний вхід і що вхід добре сформований, наприклад, ні {{},, {,{}}або подібний.

Випробування

Правда:

{}
{{}}
{{},{{}}}
{{{}},{}}
{{},{{}},{{},{{}}}}
{{{},{{}}},{},{{}}}
{{{{}},{}},{{}},{}}
{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}}
{{{{{}},{}},{{}},{}},{{}},{},{{},{{}}}}
{{},{{}},{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}},{{{}},{}},{{},{{}},{{},{{}}}}}
{{{{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}}

Помилковий:

{{{}}}
{{{{}}}}
{{{{}},{}}}
{{},{{}},{{{}}}}
{{{},{{}}},{{}}}
{{{{{}}},{}},{{}},{}}
{{},{{}},{{},{{}}},{{},{{}},{{{}}}}}
{{{{{}},{}},{{{}}},{}},{{}},{},{{},{{}}}}
{{{{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{}},{}},{{}},{}},{{{}},{}},{{}}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}}

Пов'язане: Натуральна конструкція (Виведіть набір кодування заданого натурального числа.)
1 Див. Https://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers


13
Тестові приклади виглядають як програма в (поки що) безперервному езолангу :)
Гален Іванов

2
чи може вхід бути структурою даних (вкладені списки) замість рядка?
ngn

3
Я на хвилину подумав, що це Мозг .
Belhenix

5
@ngn Ні, введенням повинно бути рядок.
Лайконі

4
@KirillL. Технічно ці відповіді не були правильними для початку, оскільки виклик завжди говорив: "З огляду на рядок, що представляє чистий набір", хоча я бачу сенс, що дозволяючи вкладені структури даних дають можливість отримати цікаві можливості для гольфу. Однак мені важко вирішити, де провести межу щодо того, що є дозволеною структурою даних, а що не уникнути зловживання надто м'яким форматом введення, тому я вирішив обмежити введення рядками заради простоти та однозначності .
Лайконі

Відповіді:


11

JavaScript (Node.js) , 53 48 44 байт

f=a=>(a=eval(a)).every(e=>a[e.length]&&f(e))

Спробуйте в Інтернеті! Тестові справи здебільшого безсоромно вкрали з відповіді @ Arnauld. Пояснення: Якщо множина представляє натуральне число, то натуральне число, яке він представляє, повинно бути рівним розміру множини, і (враховуючи, що елементи гарантовано відрізняються), елементи повинні бути поданнями натуральних чисел менше, ніж його, і вони повинні мати більш короткі довжини. Це банально вірно з порожнім набором курсу. Редагувати: Збережено 5 байт завдяки @Arnauld. Збережено 4 байти завдяки @Cowsquack.


!e[a.length-1]слід зберегти 3 байти
Арнольд

1
@Arnauld Або ще краще, a[e.length]&&на 5 байт!
Ніл

@JoKing Фу, я щойно скопіював Arnauld ... рядок введення коштує 14 байт :-(
Ніл

Звичайно, g=(A,a=eval(A))=>a.every(e=>a[e.length]&&g(e))працювали б?
Kritixi Lithos

@Cowsquack Ах, приємно, що насправді економить 4 байти, дякую!
Ніл

6

Python 3 , 69 58 44 байт

11 байтів завдяки Еріку Переможнику.

14 байт завдяки спадару Xcoder.

f=lambda s:all(len(e)<len(s)*f(e)for e in s)

Спробуйте в Інтернеті!


@ Mr.Xcoder зроблено
Leaky Nun

О, вау, приємне поліпшення!
Містер Xcoder

@ Mr.Xcoder, і тоді я розумію, що це те саме, що відповідь Ніла ... так технічно Ніл переміг мене
Leaky Nun

5

Мова Вольфрама (Mathematica) , 60 59 байт

E!=(If[Sort@#===Range[t=Tr[1^#]]-1,t,E]&//@ToExpression@#)&

Спробуйте в Інтернеті!

Основою цього рішення є функція

If[Sort@#===Range[t=Tr[1^#]]-1,t,E]&

який перетворює список форми {0,1,2,...,n-1}в будь-якому порядку в вихідний n(зокрема, він перетворює {}в 0), і перетворює все інше в дійсне число E.

Викличте цю функцію f. Враховуючи такі дані "{{{}},{}}", ми робимо наступне:

  1. Перетворіть рядок у вираз Mathematica.
  2. Застосовуйте fна кожному рівні, отримуючи f[{f[{f[{}]}], f[{}]}].
  3. Оцінюючи всі f"s", виведете натуральне число для вхідних даних, що представляють його. Наприклад, f[{f[{f[{}]}], f[{}]}]= f[{f[{0}], 0}]= f[{1, 0}]= 2. Все інше виробить E.
  4. Ми перевіряємо, чи результат є натуральним числом, перевіряючи, чи немає E.

3

Брахілог (v2), 9 байт

↰ᵐo.t~k|Ė

Спробуйте в Інтернеті!

Як зазвичай для , це повноцінна програма. Введіть із стандартного вводу, використовуючи квадратні дужки. Вихід на стандартний вихід true.порівняно з false..

Пояснення

Хоча я вже говорив, що це повноцінна програма, насправді це цікавіше; його і повна програма, і функція. Якщо використовується як повноцінна програма, вона друкує, true.якщо набір є натуральним числом, або false.якщо це не так. Якщо він використовується як функція, він "нормалізує" натуральне число (тобто нормалізує всі його елементи і сортує їх по порядку за значенням; ця програма використовує списки внутрішньо, а не встановлює), або "кидає виняток" (фактично невдача, оскільки це є Prolog), якщо вхід не є натуральним числом.

Повноцінну поведінку програми досить просто пояснити: це абсолютно неявна трактування Брахілогом повних програм, які не містять інструкцій вводу / виводу. Поведінка, про яку йде мова, "запускає функцію, беручи свій вклад зі стандартного введення, і стверджуючи, що її вихід відповідає опису, наведеному в аргументі першого командного рядка; якщо твердження не вдається або програма кидає виняток, друкуйтеfalse. інакше друкує true." . У цьому випадку аргумент командного рядка відсутній (тобто "все йде"), тому поведінка функції виключення / відсутності виключення дає результат.

Щодо поведінки функції:

↰ᵐo.t~k|Ė
↰ᵐ          Map a recursive call to this function over the list
  o         Sort the list
   .   |    Assert that the following operation need not change the list:
    t         Take the last (i.e. greatest) element of the list
     ~k       Append an arbitrary element to the resulting list
   .   |    Output the unchanged list
       |    Exception handler: if the above threw an exception,
        Ė     Assert that the input is empty, and output an empty list

Натуральне число визначається як містить дві частини: елементи натурального числа внизу, з'єднані з самим числом. Таким чином, всі його елементи також є натуральними числами. Ми можемо розпізнати натуральне число шляхом а) перевірки того, що всі його елементи є натуральними числами, б) перевірки того, що найбільший елемент набору є тотожним безлічі без його найбільшого елемента.

Коли ми використовуємо списки, а не множини (таким чином, квадратні дужки), нам потрібно ввести їх у послідовний порядок для порівняння рівності (у цьому випадку відсортованого за "значенням"). Порядок сортування Brachylog за замовчуванням сортуватиме префікс списку перед самим списком, що зручно означає, що він буде сортувати натуральні числа за числовим значенням. Тож ми можемо просто рекурсивно сортувати всі наші номери, щоб привести їх у послідовний порядок. Насправді, завдяки функції, яку ми визначаємо рекурсивно, ми можемо досягти одночасно обох результатів: рекурсивно сортувати елементи числа та перевірити, чи є це натуральним числом.

Таким чином, функція має чотири основні частини. ↰ᵐ- це рекурсивний виклик, що забезпечує кожен елемент натуральним числом і перетворює його кожен елемент у нормалізовану форму. oнормалізує саме число (його елементи вже нормалізуються, тому все, що нам потрібно зробити, - це сортувати його). Потім .t~k|гарантує, що у нас є структура, яку ми хочемо, перевіривши, чи найбільший елемент та інші елементи однакові. У порожньому списку (тобто 0) немає останнього елемента, тому вийде помилка твердження з t; обробляє цей випадок, через даючи явний запасний варіант у разі , коли список входів порожній.


2

K (нг / к) , 26 24 27 байт

~^{$[#(!#x)^o'x;0N;#x]}@`j@

Спробуйте в Інтернеті!

input - рядок json, розібраний `j@(синтаксис, специфічний для ngn / k)

{ }- рекурсивна функція з аргументом x. він повертає натуральне число, представлене набором x, або null ( 0N), якщо воно не представляє його.

$[ ; ; ]це якщо-то-інше. 0 - фальси, інші цілі числа - truthy

!#xцілі числа від 0 (включно) до довжини x(виключно)

^ без

o'xрекурсія ( o) на кожному ( ') елементіx

# довжина

^ нуль?

~ ні

@діє як манекен останнього дієслова, так що ~і ^складається, { }а не застосовується до нього



0

Japt , 9 байт

Рішення JS Порта Ніла . Будь ласка, підкресліть це, якщо ви підтримуєте це.

e@Ê>XÊ©ßX

Спробуйте або запустіть усі тестові приклади

              :Implicit input of array U
e             :Does every element in U return true
 @            :When passed through the following function as X
  Ê           :Length of U
   >          :Greater than
    XÊ        :Length of X
      ©       :Logical AND with
       ßX     :A recursive call of the programme with X passed as the new value of U


0

Желе , 8 байт

߀Ṣ
ÇṖƤƑ

Оскільки вхід повинен бути рядком, це подання діє лише як повна програма.

Спробуйте в Інтернеті! або перевірити всі тестові випадки

Як це працює

߀Ṣ   Helper link. Argument: A (array)

߀    Recursively map the helper link over A.
  Ṣ   Sort the result.

Це дає канонічне зображення входу, що складається виключно з відсортованих масивів.

ÇṖƤƑ  Main link. Argument: A (array)

Ç     Call the helper link to canonicalize the array.
   Ƒ  Fixed; call the link to the left and test if it returns its argument unchanged.
 ṖƤ       Pop prefix; for each non-empty prefix of the result, remove its last element.

0

Желе , 7 байт

Ẉ<La߀Ạ

Це порт відповіді Leaky Nun's Python .

Оскільки вхід повинен бути рядком, це подання діє лише як повна програма.

Спробуйте в Інтернеті! або перевірити всі тестові випадки

Як це працює

Ẉ<La߀Ạ  Main link. Argument: A (array)

Ẉ        Width; compute the length of A's elements.
  L      Yield the length of A.
 <       Compare them, yielding an array of Booleans.
    ߀   Recursively map the main link over A.
   a     Take the logical AND of the Booleans and the results of the map.
      Ạ  All; yield 1 if and only if all ANDs yielded 1.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.