Codegolf – Это Действительный Список?

  • Автор темы Vanek_Man
  • Обновлено
  • 22, Oct 2024
  • #1

Учитывая строку типа

 
 ]
[[][]]
[,]
,
[],[]
[[[]][[]]]
[[],]
,[]
[[]
[,[]]
[][]
[[],
 
, made of only commas and square brackets, your challenge is to determine whether it represents a list.

Список может быть:

  • [[]] [[],[]] [[[[]],[[],[[]]],[]],[]] [[[[]]]] [] , the empty list
  • По крайней мере один список, соединенный запятыми и заключенный в квадратные скобки.

Вместо eval .

Вы можете вывести как:

  • Любые два непротиворечивых значения, представляющие истинное и ложное
  • Одно последовательное значение, представляющее либо истинное, либо ложное, и все остальное как другое.

Вывод с ошибкой/без ошибки является разрешено, хотя [,] -like solutions may be trickier than you think. Sometimes erroring and sometimes returning is нет.

Это самые короткие победы!

Правда

[]

Ложный

[[[],[[]]],[]]

#code-golf #code-golf #задача принятия решения #анализ #сбалансированная строка #рваный список

Vanek_Man


Рег
22 Dec, 2011

Тем
66

Постов
190

Баллов
530
  • 26, Oct 2024
  • #4

ПАРИ/ГП, 0 байт

Принимает входные данные от

eval("set"+input())
, returns truthy iff
 
 
 
 
 
 
 
 
 int v(char *s){int d=1;for(s++;*s!='\0';s++){if(d==0)return 0;if(*s=='{')d++;if(*s=='}'){d--;if(*(s+1)=='{')return 0;}if(*s==','&&!(*(s-1)=='}'&&*(s+1)=='{'))return 0;}return!d;}
 
пусто.

PARI/GP автоматически анализирует и оценивает все, начиная с "] .

Попробуйте это онлайн!

 

DTop


Рег
20 Dec, 2006

Тем
63

Постов
201

Баллов
536
  • 26, Oct 2024
  • #5

Хаскелл + hgl, 26 байт

[" , Literal string `,` ⁺ Concatenated with θ Input string ⬤ All characters satisfy ,[[]], Literal string `,[[]],` № Contains ι Current character ⁺ Concatenated with θ Input string ⁺ Concatenated with , Literal string `,` § Indexed by κ Current index › And not θ Input string ⊙ All characters satisfy κ Current index ∧ Logical And № Count of [ Literal string `[` …θκ In current prefix ⁼ Equals № Count of ] Literal string `]` …θκ In current prefix Implicitly print

Использует персонажей - .

Создает объект парсера и использует ›⬤⁺,θ№,[[]],⁺ι§⁺θ,κ⊙θ∧κ⁼№…θκ[№…θκ] to determine if some input matches the parser.

25 байт

⁼θ[]

Использует персонажей ≔⪫⪪⪫⪪θ[[]]¦[]¦[[],[¦[[θ .

Возврат Fθ on valid inputs and errors on invalid ones.

Эта версия на 1 байт короче, но я не уверен, разрешено ли это правилами. Если вы вызываете функцию, ожидающую логическое значение, например.

-

Это сработает. Однако по умолчанию ghci делает вывод Fθ≔⪫⪪⪫⪪θ[[]]¦[]¦[[],[¦[[θ⁼θ[] as the type, which does not meet the output specifications of the challenge. So you need to call it either with a type signature or in a context in which ghc can infer it's type to be false .

Размышления

  • у hgl есть true function. It could be made a pattern like in the curry answer: <,>
  • Это довольно раздражает f=s=>eval("r=/(<(<>,)+<>>)|(<<>>)/;r.test(s)&&f(s.replace(r,'<>'))||s=='<>'") , the L ='[]' | ('[' *L ARBNO(',' *L) ']') INPUT POS(0) L RPOS(0) :F(END) OUTPUT =1 END функция обрезает ведущие пробелы. Существует 23-байтовый ответ, который будет работать, если / # Start of regex "[" # Match an opening bracket * # Then match zero or more... % "," # delimited by commas... <~~> # of the current regular expression recursively "]" # Finally, match a closing bracket / # End of regex didn't do this. <~~>
  • * should have an infix.
  • % should have an infix.
  • * should have a flip.
 

Virusya


Рег
28 Dec, 2009

Тем
57

Постов
188

Баллов
513
  • 26, Oct 2024
  • #6

APL (Диалог Юникод), 5 байт

Анонимная функция неявного префикса, принимающая входные данные как "]" with output by erroring/not erroring.

","

Попробуйте онлайн! (завернут в код перехвата ошибок, который выдает 0 при ошибке и 1 при отсутствии ошибок)

Попытки конвертировать из JSON.

 

Unsesmeno


Рег
17 Nov, 2015

Тем
76

Постов
188

Баллов
588
  • 26, Oct 2024
  • #7

Python, 19 байт (@dingledooper)

"["

Попробуйте это онлайн!

Старый Питон, 22 байта

/"[" <~~> * % "," "]"/

Попробуйте это онлайн!

При этом принимается строка, состоящая из символов «(+)», и сигнализирует об ошибке/отсутствии ошибки.

Как?

Почему мы не можем просто использовать $^a ?

  1. конечные запятые
  2. отсутствуют внешние скобки

Оба будут терпеть "" .

По адресу 1 заменим Nil with Match .

На адрес 2 переключаемся с Nil to Match и добавить / .

Старый Python, 28 байт

.ACCEPTS

Попробуйте это онлайн!

Это принимает строку, состоящую из символов «[+]» (обратите внимание, что мы дерзко, но законно заменили «,» на «+») и сигнализирует об ошибке/отсутствии ошибки.

Я не уверен на 100%, что это правильно, но это работает во всех тестовых случаях.

 

Zlata3542


Рег
04 Nov, 2019

Тем
77

Постов
228

Баллов
613
  • 26, Oct 2024
  • #10

Уитон, 36 байт

[[],]

Возврат i } # If # the (implicit) input-string ≠ # does NOT å # contain the substring „,] # ",]": .E # Evaluate the (implicit) input-string as Elixir # (implicit else) # (implicitly use the input-string) ˜ # Flatten (results in [] for lists; or an error for strings) for valid lists, """ или ** (Protocol.UndefinedError) protocol Enumerable not implemented for ... for invalid lists. Attempt This Online!

Объяснение

„,]å≠i.E}˜ ||answer||

Регулярное выражение (Perl/PCRE), 21 байт

fn a(d:&str)->bool{let c=d.chars().collect::<Vec<_>>();let c=c.as_slice();let b=c.iter().fold((0,0),|mut a,&i|{if i=='['{a.0+=1}else if i==']'{a.1+=1}a});let m=c.windows(2).any(|a|a[0]==']'&&a[1]=='[');let mut j=false;c.iter().fold(0,|a,&i|{if i=='['{a+1}else if i==']'{a-1}else if i==','&&a==0{j=true;a}else{a}});let o=c.windows(3).find(|a|a[1]==','&&(a[0]!=']'||a[2]!='['));b.0==b.1&&!m&&!j&&o.is_none()}

Использует персонажей json> . (Avoids json.reader поскольку они потребуют быть b:l|; l: -escaped.)

Попробуйте онлайн! - Перл
Попробуйте это на regex101 - PCRE1.
Попробуйте онлайн! - PCRE2 v10.33
Попробуйте это онлайн! - PCRE2 v10.39+

Как и регулярное выражение в ответе Раку, здесь используется рекурсия. В отличие от Raku, стандартное регулярное выражение не имеет понятия символов-разделителей, поэтому не существует краткого способа реализации списка, разделенного запятыми, и рекурсивный вызов b:l|l: needs to be in two places.

Есть много альтернатив одинаковой длины:

Регулярное выражение (Perl/PCRE), 21 байт

b:l|l

Также использует символы b .

Попробуйте онлайн! - Перл
Попробуйте онлайн! - ПКРЕ

Использование s recursion instead of s:'['']'|'['l']'l:s|s','l повторение для списка, разделенного запятыми.

Регулярное выражение (Perl/PCRE), 21 байт

s:'['b']'b:l|l:s|s','l s: An "s" is '[' an opening square bracket b then a "b" ']' then a closing square bracket; b: A "b" is l| either an "l", or {an empty string}; l: An "l" is | either s an "s" | or s an "s" ',' followed by a comma l followed by another "l"

Использует персонажей l in order to take advantage of the b утверждение без границы слова.

Попробуйте онлайн! - Перл
Попробуйте онлайн! - ПКРЕ

Без использования s , there would be nothing stopping a comma-separated list ending in a comma from being accepted, as the , является необязательным независимо от того, является ли ] matched anything.

[ prevents this; if any list ended with a comma, the sequence yacc будет его частью, поэтому все, что нам нужно сделать, это запретить эту последовательность. yacc accomplishes this, as s и s:'['b']'b:l|l:s|s','l are word-characters but :tt нет, поэтому в середине слова нет границы macro_rules!v{([$($a:tt),*])=>($(v!{$a})*)} macro_rules!v{ } Macro declaration ([ ]) Match something surrounded by [] $( ) * which consists of 0 or more $a:tt balanced token trees $a , separated by commas =>( ) and replace it with, $( $a )* for each $a, v!{$a} a recursive call to v!{$a} или [] но есть один в () .

Регулярное выражение (Perl/PCRE), 21 байт

,

Также использует символы ] . Mirror version of the above.

Попробуйте онлайн! - Перл
Попробуйте онлайн! - ПКРЕ

Регулярное выражение (Perl/PCRE), 21 байт

,

Попробуйте онлайн! - Перл
Попробуйте онлайн! - ПКРЕ

Использует персонажей [ in order to take advantage of the и v!{…} word- and non-word-boundary assertions.

Регулярное выражение (Perl/PCRE), 21 байт

v!

Использует персонажей macro_rules!v{([$($a:tt),*])=>($(v!{$a})*)} . Mirror version of the above.

Попробуйте онлайн! - Перл
Попробуйте онлайн! - ПКРЕ

Регулярное выражение (.NET), 35 33 29 байт

]

Использует персонажей [ in order to take advantage of the (?(2)$.) утверждение границы слова.

Попробуйте онлайн!

На основе старого 35 байт однострочник в Ответ Нила на сетчатке.

-1 байт при использовании символов )+ instead of , , потому что ] needed to be ] -сбежал
-1 байт при использовании недопустимого символа вместо [ , as the impossible condition to assert Group 2 being empty at the end
-4 байта при использовании символов (?(2),|$) instead of [ , что устраняет необходимость явного утверждения, что группа 2 пуста в конце

]

Обратите внимание, что если (?<-2>])+ characters are still used, it can be 32 байта:

[

Попробуйте онлайн!

\$\large\textit{Анонимные функции}\$

Перл, 33 байта

(\[)+

Попробуйте онлайн!

Р, 49 48 44 39 байт

^(

Попробуйте это онлайн!

-1 байт благодаря Джузеппе
-4 байта с помощью ^((\[)+(?<-2>])+(?(2),|$))+(?(2)$.) instead of \[\[]] [] }`\[\[],\[ [[ ^\[]$ превратить это в [,]
-5 байт за счет использования нового синтаксиса анонимной функции, представленного в R v4.1.0.

PowerShell, 46 42 байта

^<>$

Попробуйте онлайн!

 

Srvd


Рег
25 Jun, 2011

Тем
69

Постов
188

Баллов
553
  • 26, Oct 2024
  • #11

Виксал }` , 8 bytes

<<>,< <<

Попробуйте онлайн!

Все еще короче, чем JavaScript! Ссылка представляет собой набор тестов, отсюда и дополнительные флаги — они просто оборачивают все входные данные в список ( <<>> <> ) and to treat all inputs as strings ( [] - это эквивалент заключения каждого ввода в кавычки).

Объяснено

<,> ||answer||

Р, 101 байт

<<>> <> }`<<>,< << ^<>$

Попробуйте это онлайн!

Решение для замены текста,

'[[],[]' -> '[[]' accuracy to escape precision / {precision,accuracy} .

'[[]]' -> '[]'

Более ранние попытки сделать это использовали слишком много

 

Enzo-k


Рег
07 Mar, 2007

Тем
89

Постов
197

Баллов
652
  • 26, Oct 2024
  • #12
precision

Язык Wolfram (Математика)

, 31 байт N . Returns by presence/absence of an error.

Попробуйте онлайн! N , but will raise an error message.

Использование N ), so we use Block Отсутствующие аргументы интерпретируются как Times . Since Null Сопоставление является допустимой операцией ( {,} has exactly two arguments, the second argument must be of the form {Times=N}~Block~ToExpression@#& or ] , где [ обрабатывает только один или два аргумента, при передаче трех и более аргументов возникает ошибка. Когда \\ are numbers. Input is guaranteed to never have numbers, so the 2-argument form is also guaranteed to error.

или

и

 

Netdaiver


Рег
15 Mar, 2020

Тем
81

Постов
185

Баллов
590
  • 26, Oct 2024
  • #13
\(x,y='',s=\(p,b,x)sub(p,b,x,,,T)){while(y!=(y=x)){x=s('[[],[]','[[]',y);x=s('[[]]','[]',x)};y=='[]'}

Ретина 0.8.2 , 39 35 23 байта øBEÞfSȧ= øBE # wrap the input in square brackets and try to evaluate it as a python literal Þf # attempt to flatten the list by a level - if the input was listlike (that is, valid for this challenge or valid as a python tuple), this will undo the `øB`. Otherwise it leaves the string as is S # convert the result of the above to string. The P flag makes it so that square brackets and commas are used for lists instead of the angular brackets and pipes Vyxal uses. ȧ= # remove any whitespace and test to see if this new string is equal to the original input. characters but link is to test suite that converts from S with updot Попробуйте онлайн!

a

Берет

øBEÞfSȧ=

для удобства. Пояснение: Порт решения Stax от @recursive.

P

Удалить пустой список, который является единственным элементом списка.

$args-match'^((a)+(?<-2>z)+(?(2),\b|$))+$'

Удалить пустой список, который является первым элементом списка.

Повторяйте до тех пор, пока не останется элементов, которые нужно удалить. any(grep()) characters:

sum(grep())

Убедитесь, что мы закончили с пустым списком. Экранирование означает, что для использования требуется 29 байт.

Попробуйте онлайн!

grepl()

Ссылка включает тестовые примеры. Предыдущий 35-байтовый однострочный файл:

\(L)grepl('^(<(((?1),)*(?1))?>)$',L,,1)

Начните сопоставление с начала строки.

sub{pop=~/^(<(((?1),)*(?1))?>)$/}

Подсчитайте количество ^((<)+(?<-2>>)+(?(2),(?!$)|$))+$ с.

<>,

Посчитай немного ^ # Assert that we're at the beginning of the string. ( (a)+ # Capture at least one "a" on the Group 2 stack. (?<-2>z)+ # Match at least one "z", popping an entry from the Group 2 # stack for each one we match. (?(2),\b|$) # If the Group 2 stack is non-empty, match a "," followed by a # word boundary (since "," is a non-word character, this means # it must be followed by a word character, i.e. [0-9A-Za-z_]), # else assert that we're at the end of the string. )+ # Loop the above at least 1 time. $ # Assert that we're at the end of the string. The Group 2 # conditional at the end of the above loop guarantees that the # only way to end the loop at the end of the string is for # Group 2 to be empty, due to the "\b" in its non-empty # clause. So there's no need to explicitly assert here # something like "(?(2)$.)" (which would assert something # impossible in the case that Group 2 is non-empty). s, but no more than the number of <>, это пока.

az,

После каждого запуска $. s and \ s, если есть еще несбалансированные [ s, then there must be a [], следующий, иначе мы должны быть в конце строки.

<>,

Повторите столько раз, сколько необходимо.

\b

Проверьте, чтобы не было больше az, s than ^((a)+(?<-2>z)+(?(2),\b|$))+$ s.

 

Donanybease95


Рег
23 Mar, 2006

Тем
79

Постов
209

Баллов
644
  • 26, Oct 2024
  • #14

Ржавчина (время компиляции), 43 байта

a>,

Попробуйте онлайн!

Это макрос Rust (эквивалент функции во время компиляции) с именем ^(a((?1)\B|\B,\b)*>)$ . Use as \B , where \b is the string you want to check (without delimiters – string literals are opaque to the usual sort of Rust macro). I used <z, , ^(<(\B(?1)|\b,\B)*z)$ , az, как в вопросе, хотя это можно легко адаптировать для использования практически любого токена Rust вместо ^(a\B(?1)?(,(?1))*z)$ and/or ,z скорее, чем zz .

Вывод через ошибку/без ошибки: недопустимый список вызывает ошибку времени компиляции, действительный список не вызывает ошибок (и макрос расширяется до пустого объявления).

Объяснение

az

Мы проверяем структуру самого внешнего списка, затем возвращаемся к внутренним спискам, чтобы убедиться, что они также верны. Макросы Rust имеют , builtin that matches brackets, which makes it easy to use the strategy of parsing out the elements first and recursing over them afterwards. The base case of the recursion is that when we match a zero-length list, the replacement expands into zero macro calls, because the loop in the replacement runs for zero iterations.

Обратите внимание, что Rust обычно допускает использование в списках запятой в конце, поэтому нам действительно приходится писать собственный макрос проверки, а не использовать что-то предопределенное в Rust.

 

Yuroli


Рег
31 Mar, 2008

Тем
65

Постов
196

Баллов
541
  • 26, Oct 2024
  • #15

Якк, 22 байта

z

Попробуйте онлайн! (примечание: Yacc установлен в TIO, но не имеет оболочки TIO, поэтому мне пришлось написать ее самому; я также включил функцию в полную программу. Оболочка выводит данные по коду выхода.)

Представление функции. (Изначально я забыл, что PPCG допускает отправку функций, поэтому первая версия представляла собой полную программу с большим количеством шаблонов. Очевидно, что отправка ее как функции имеет больше смысла.)

Это функция/парсер с именем a that reads input from \Bz обычный источник входного сигнала. Это делает ,z equivalent of throwing an exception if the input is not a list, or returns normally if the input is a list. (It doesn't explicitly return a value – Yacc uses "implicit int" like in C, so these parsers are technically returning integers, but we don't set the return value to anything in particular.)

Эта функция использует \B , ((?1),)* , (?1)? as suggested by the question, but could easily be adapted to use any three characters (although some choices would make the program longer due to needing to be escaped).

Объяснение

Yacc — язык для написания парсеров; вы предоставляете описание синтаксически допустимого ввода, и он генерирует для вас синтаксический анализатор. Эта программа содержит три парсера, \B , \B и az, :

^(a((?1),)*(?1)?\Bz)$

Прямой перевод вопроса в Yacc будет выглядеть так: * , but factoring out the brackets from the two branches of (?2) в отдельное правило <>, allows the program to be a byte shorter.

Программы Yacc обычно не выглядят такими сжатыми; они обычно пишутся с большим количеством пробелов и точкой с запятой между правилами. Однако точки с запятой не обязательны, а пробелы необязательны, за исключением случаев, когда они находятся между двумя идентификаторами (и я организовал эту программу так, чтобы в ней никогда не было двух идентификаторов подряд, что позволяет убрать все пробелы). Странным побочным эффектом такой гибкости является то, что синтаксис Yacc очень сложно анализировать из-за ложных срабатываний (например, ^(<((?1)(,(?2))?)?>)$ is a valid rule, but (?1) должен быть проанализирован как \ despite that), and in fact, it isn't sufficiently powerful to write a parser for its own syntax (it's powerful, but its syntax is weird enough that it needs even more power to parse). It's helpful in golfing, though!

 

Pointj


Рег
10 Oct, 2011

Тем
79

Постов
183

Баллов
608
  • 26, Oct 2024
  • #17

Руст, 406 байт

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

Попробуйте онлайн!

В любом случае, это не язык игры в гольф, но попробовать стоит.

Его можно значительно снизить, поскольку в настоящее время он использует действительно наивный подход.

 

Thereal_aspman


Рег
29 Sep, 2011

Тем
64

Постов
178

Баллов
548
  • 26, Oct 2024
  • #18
, 10 05AB1E lambda s:eval(s)>=[]!=",]"not in s?0 lambda s: # Anonymous function that takes s, a string eval(s) # Python eval >=[] # True if the result is a list, error if tuple != # Keep the comparison chain going ",]"not in s # Check that there are no extra commas ?0 # If anything raised an error, return 0

байты 0 ) as falsey.

Никакая ошибка не является правдивой; ошибка ( Попробуйте онлайн илипроверить все тестовые случаи False quotes to get the input as string, instead of implicitly as (possibly faulty) list.)

. (Оберните одиночный вход TIO в

True

Объяснение: lambda s:eval(s)>=[]!=",]"not in s?0 , which unfortunately is a valid Elixir/Python list that evaluates to 1 Оператор if предназначен для крайнего случая f('[':a++"]")=g a f"[]"=1 g(a++',':b)=f a*g b g a=f a would have been enough in the new version of 05AB1E: . Если бы не эти тестовые случаи,.
проверить все тестовые случаи И это могло быть даже 1 байт в устаревшая версия 05AB1E True / , используя флаг:.

проверить все тестовые случаи

 

MinotaurWorld


Рег
12 Nov, 2016

Тем
68

Постов
184

Баллов
564
  • 26, Oct 2024
  • #19

Хаскелл (GHCi), 0 байт f('[':unwords a++"]")=all f a , returns truthy iff "[]" Принимает входные данные от

пусто.

 

Lenochka999


Рег
04 Mar, 2010

Тем
72

Постов
214

Баллов
584
  • 26, Oct 2024
  • #20
Раку "[["

, 31 байт "[[],[" or "]" ).

Это функция, которая принимает строку в качестве входных данных и выдает типичные логические значения Раку (

",[]]"

Давайте разберемся. Во-первых, лучшее расстояние "[]" is a sort of special syntax for declaring lambdas without explicitly mentioning their arguments, so this is equivalent to the single-argument function

"[[]]"

Первый, Ç╥╫ÜΦªt┌¢♣☺¢+╬ï▼6◘-6¡Zq is a terribly clever thing in Raku called the smart-match operator. At a high-level, it's going to evaluate its right-hand side and then call the set Сейчас,

метод в правой части с левой частью в качестве аргумента. Здесь мы используем его дважды: самое левое приложение находится на объекте регулярного выражения и выполняет сопоставление с регулярным выражением. Крайнее правое приложение работает с входной строкой и выполняет обычное равенство строк. () . That match will return either a special regex [] Мы собираемся выполнить сопоставление регулярного выражения с регулярным выражением, заключенным в + if the match fails. We then compare that for string equality. A , объект, или объект преобразуется в строку как подстрока, с которой он совпал, поэтому мы просто проверяем, является ли найденное совпадение фактически весь eval , on the other hand, stringifies to eval нить. ⎕JSON will never compare equal to that.

, и согласно комментариям пустая строка не является допустимым вводом, поэтому

[,]

Теперь давайте посмотрим на само регулярное выражение. isP , isP Если вы раньше не видели регулярные выражения Raku, возможно, лучше забыть все, что вы знаете о регулярных выражениях, поскольку их синтаксис схож только внешне. Все, что заключено в кавычки, сопоставляется буквально, поэтому mF are matched literally. f('(':')':>x)=mF f$wR x , и wR is a modifier on words работает так же, как и в большинстве языков регулярных выражений: это звезда Клини, которая соответствует нулю или более. wR is the recursive matcher, which matches the entire regular expression again. So, in summary

f('(':')':>Uw x)=mF f x ||answer||

который разделяет несколько совпадений по признаку справа (в нашем случае запятой). Окончательно,

unwords

СНОБОЛ4 (CSNOBOL4), 84 байта

Попробуйте онлайн!

Выводит 1 для правдивого и ничего для ложного.

Рекурсивное сопоставление с образцом довольно удобно..

Проверьте все тестовые случаи

 

Rider_Hack


Рег
18 Jul, 2014

Тем
74

Постов
206

Баллов
586
  • 26, Oct 2024
  • #22
Древесный уголь ()

, 29 байт Попробуйте онлайн! f('(':')':>x)=mF f$' '|\x for valid, nothing for invalid. Explanation: Boring port of @recursive's Stax answer.

x1

Ссылка на подробную версию кода. Выводит логическое значение Charcoal, т.е.

()_

Повторите более чем достаточное количество раз...

x1 f

... удалить первый или единственный элемент списка, если он пустой.

Убедитесь, что у нас остался пустой список.

f=opn*>isP f ʃ_*>cls

Менее скучное 34-байтовое решение: Попробуйте онлайн! stdin for valid, nothing for invalid. Explanation:

stderr

Ссылка на подробную версию кода. Выводит логическое значение Charcoal, т.е. stdin and append def f(s): try:return s==str(eval(s)).replace(' ','') except:return 0 .

 

Boadeoxia


Рег
08 Apr, 2021

Тем
83

Постов
203

Баллов
628
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно