Основна Pyth-синтаксична перевірка


25

Pyth - мова для гольфу, заснована на Python. Він використовує позначення префікса, при цьому кожна команда має різну сутність (кількість аргументів, які вона приймає).

Ваше завдання - написати перевірку синтаксису для (неіснуючої) мови, схожої на Pyth, Pith.

Синтаксис Піта

Pith має лише 8 одночастотних команд:

01234()"

01234кожен має сукупність відповідного числа, а тому очікуйте, що після нього буде багато аргументів. Наприклад,

400010

правильна програма Pith , тому що 4слідують чотири аргументи 0 0 0і 10, останній з яких є 1наступним єдиним аргументом 0. Щоб візуалізувати це, ми можемо подивитися на таке дерево:

      R
      |
      4
      |
-------------
|   |   |   |
0   0   0   1
            |
            0

де Rзнаходиться кореневий вузол. Альтернативний спосіб подумати про це полягає в тому, що кожне число посилається на кількість дітей, які має відповідний вузол у дереві вище.

Ось ще одна дійсна програма Pith з більш ніж однією базовою командою:

210010

відповідна

           R
           |
     -------------
     |           |
     2           1
     |           |
 ---------       0
 |       |
 1       0
 |
 0

З іншої сторони,

3120102100

це НЕ правильна програма Pith , оскільки вихідний 3має тільки два аргументи, які ми можемо побачити, подивившись на дерево нижче:

                R
                |
                3
                |
     ------------------------ ??
     |          |
     1          2
     |          |
     2        ------
     |        |    |
   ------     1    0
   |    |     |
   0    1     0
        |
        0

Далі (починається без обмежень і )закінчується без обмеження. Без обмежень приймає будь-яку кількість аргументів (жадібно) і вважається єдиним аргументом для будь-якої батьківської команди. Будь-які відкриті до кінця програми незв’язані обмеження автоматично закриваються. )Команда не є помилкою , якщо немає unboundeds відкриті - це просто нічого не робить *.

Наприклад, програма Pith

)31(0)0(201000100

відповідає дереву

            R
            |
            3
            |
    ------------------------------
    |       |                    |
    1       0                    (
    |                            |
    (              -----------------------------
    |              |      |      |      |      |
    0              2      0      0      1      0
                   |                    |
                -------                 0
                |     |
                0     1
                      |
                      0

Порожні незв’язані параметри нормально, так ()це дійсна програма Pith.

Недійсна програма Pith з необмеженою є

12(010

оскільки 2єдиний отримує один аргумент (необмежений).

Нарешті, "починається і закінчується рядок, який завжди дорівнює 0 і вважається одним аргументом, наприклад

2"010""44)()4"

що є просто 2істотою, що передається двома рядковими аргументами "010"і "44)()4". Як і незв'язані, рядки також можуть бути порожніми, а будь-які незакриті рядки до кінця програми автоматично закриваються.

* Ця частина відрізняється від оригінального Pyth, який насправді робить щось у подібному випадку 1), закінчуючи 1-арність і створюючи помилку.

Введення-виведення

Введенням буде один непустий рядок, що складається лише з символів 01234()". Ви можете необов'язково припускати, що додатковий новий рядок завжди присутній. Ви можете написати функцію або повну програму для цього завдання.

Ви повинні вивести триєдне значення, якщо вхід є синтаксично дійсним Pith, або помилковим значенням є інше. Цінні і хибні значення повинні бути виправлені, тому ви не можете виводити 1для однієї дійсної програми та 2для іншої.

Оцінка балів

Це код-гольф, тому код у найменших байтах виграє.

Тестові справи

Truthy:

0
)
(
"
()
""
10
400010
210010
("")00
3"""""
(0)))0)1)0
2(2(2(0)0)0)0
2"010""44)()4"
)31(0)0(201000100
())2)1))0"3())"))
3("4321("301(0)21100"4")"123"00)40"121"31000""01010

Фальсі:

1
1(310
(1)0)
12(010
4"00010"
3120102100
20(2((0)(0)))
2(2(2(0)0)0)01)
4(0102)00)00000
2"00"("00"2(""))

Чи не повинно бути дерево за 20100100 (у першому необмеженому прикладі) [( [2 [0] [1 [0] ] ] [0] [1 [0]] [0] ]? У вас є гілки 2, 0, 0, 1 і 0 - другої там не повинно бути.
bcsb1001

@ bcsb1001 Дякуємо та виправляємо. Я хотів показати, що без обмежень може вийти більше 4.
Sp3000

@Ypnypn є тестові випадки, які стверджують, що його дійсність має кілька коренів
Optimizer

Будь ласка, додайте тестовий випадок для ())2)1))0"3())"))(я думаю, це має бути правдою).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Додано - це дійсно правда (оскільки це в основному ()210""з великою кількістю
невідступів

Відповіді:


12

CJam, 65 байт

q'"/La+2%{0s*}:Z~_,:L')*+{L{4{)_Z+s/Z}/L{'(\Z')++/Z}/}*')-}2*0s-!

Боже, я хотів би, щоб CJam мав Regex, тоді це могло б бути завершено менше ніж 50 байт

Основна ідея полягає в тому, щоб тримати скорочення матеріалу , щоб 0тобто 10до 0, 200до 0і так далі. Як тільки це буде зроблено, ми зменшуємо всі відповідні кронштейни до 0, тобто ()до 0, (0)до 0, (00)до 0і так далі. Ми повторюємо часи циклу L, де Lдовжина вводу.

Рядок введення спочатку проходить додаткову обробку, де ми налаштовуємо неперевершені "та додаємо багато, )щоб компенсувати незрівняне(

Це гарантує, що після всіх ітерацій у нас повинно залишитися лише 0(і без опції )) у рядку.

Оновлення - виправлена ​​помилка, коли непридатний режим верхнього рівня )вважається шкідливим

Розширення коду

q'"/La+2%{0s*}:Z~_,:L')*      "Part 1 - Preprocessing";
q'"/                          "Read the input and split it on quote";
    La+                       "Add an extra empty array to the split array to compensate";
                              "for unmatched ending quote";
        2%                    "Take every other splitted part, ignoring the contents";
                              "of the strings in the code";
          {0s*}:Z~            "Join the parts by string 0. Also create a function Z";
                              "that does that for future use. We are now done with";
                              "reducing "XYZ" to 0 ";
                  _,:L        "Store the length of the remaining code in L";
                      ')*     "Append L ) to the string to compensate for unmatched (";

{L{4{)_Z+s/Z}/L{'(\Z')++/Z}/}*')-}2*   "Part 2 - the reducing loop";
 L{                         }*         "Run the reduction logic L times";
   4{)_Z+s/Z}/                         "Part 2a - reducing arities";
   4{       }/                         "Run the iteration for 0, 1, 2 and 3";
     )_                                "Increment the iteration number and make a copy";
       Z+s                             "Get that many 0 and append it to the number";
          /Z                           "Split the code onto this number and convert it";
                                       "to 0. This successfully reduces 10, 200, ";
                                       "3000 and 4000 to 0";
              L{'(\Z')++/Z}/           "Part 2b - reducing groups";
              L{          }/           "Run the iteration for 0 through L - 1";
                '(\Z')++               "Get the string '(<iteration number of 0>)'";
                        /Z             "split on it and join by 0. This successfully";
                                       "reduces (), (0), (00) and so on .. to 0";
                              ')-      "After running the part 2 loop L times, all";
                                       "reducible arities and brackets should be reduced";
                                       "except for cases like '30)00' where the no-op )";
                                       "breaks the flow. So we remove ) from the code";
                                       "and run Part 2 L times again";

0s-!                          "Now, if the code was valid, we should only have 0 in the";
                              "remaining code. If not, the code was invalid";

Спробуйте в Інтернеті тут або запустити весь набір


11

Регекс, аромат PCRE, 83 байти

^(?3)*\)*$(()((?(2)|\)*)(\((?1)*(\)|$)|0|"[^"]*.?|(1|(2|(3|4(?3))(?3))(?3))(?3))))?

Спробуйте тут.

Регекс, аромат PCRE, 85 байт

^((?(3)|\)*)(?>\((?2)*(()(?1))?(\)|$)|0|"[^"]*.?|(1|(2|(3|4(?1))(?1))(?1))(?1)))*\)*$

Спробуйте тут.

Використовували деякі ідеї у відповіді на дан1111 .

Деякі пояснення щодо(?2)*(()(?1))? .


(?2)*(()(?1))?є заключним твором головоломки, який я шукав. Приємна знахідка! ;)
Мартін Ендер

Якщо я (?2)*(()(?1))?правильно розумію частину, (()(?1))?частина ніколи нічого не відповідає, оскільки вона (?2)*вже з'їдає все, що (()(?1))?може відповідати, і ця конструкція використовується для встановлення групи захоплення 3, коли ми входимо (і вимикаємо групу 3, коли ми знаходимось поза ()конструкцією (щоб дозволити збіг непарний )).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

4

lex, 182 байт (157 Вт / стек фіксованого розміру)

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

%%
 int n=0,s=0,*t=0;
[0-4] n+=*yytext-48-!!n;
\( (t=realloc(t,(s+1)*sizeof n))[s++]=n-!!n;n=0;
\) if(s&&n)exit(1);s&&(n=t[--s]);
\"[^"]*.? n-=!!n;
\n while(s)t[--s]&&n++;exit(!!n);

Вищеописана програма буде за замовчуванням, якщо у неї не вистачить пам’яті, що теоретично може статися, якщо ви дасте їй достатньо (. Але оскільки segfault вважається невдачею, я сприймаю це як "фальси", хоча опис проблеми не говорить про те, що робити, якщо ресурсів не вистачає.

Я скоротив її на 157 байт, просто використовуючи стек фіксованого розміру, але це здавалося обманом.

%%
 int n=0,s=0,t[9999];
[0-4] n+=*yytext-48-!!n;
\( t[s++]=n-!!n;n=0;
\) if(s&&n)exit(1);s&&(n=t[--s]);
\"[^"]*.? n-=!!n;
\n while(s)t[--s]&&n++;exit(!!n);

Для складання:

flex -o pith.c pith.l    # pith.l is the above file
c99 -o pith pith.c -lfl

Тест:

while IFS= read -r test; do
  printf %-78s "$test"
  if ./pith <<<"$test"; then echo "OK"; else echo "NO"; fi
done <<EOT
0
)
(
"
()
""
10
400010
210010
("")00
3"""""
2(2(2(0)0)0)0
2"010""44)()4"
)31(0)0(201000100
3("4321("301(0)21100"4")"123"00)40"121"31000""01010
1
1(310
12(010
4"00010"
3120102100
20(2((0)(0)))
2(2(2(0)0)0)01)
4(0102)00)00000
2"00"("00"2(""))
EOT

Тестовий вихід:

0                                                                             OK
)                                                                             OK
(                                                                             OK
"                                                                             OK
()                                                                            OK
""                                                                            OK
10                                                                            OK
400010                                                                        OK
210010                                                                        OK
("")00                                                                        OK
3"""""                                                                        OK
2(2(2(0)0)0)0                                                                 OK
2"010""44)()4"                                                                OK
)31(0)0(201000100                                                             OK
3("4321("301(0)21100"4")"123"00)40"121"31000""01010                           OK
1                                                                             NO
1(310                                                                         NO
12(010                                                                        NO
4"00010"                                                                      NO
3120102100                                                                    NO
20(2((0)(0)))                                                                 NO
2(2(2(0)0)0)01)                                                               NO
4(0102)00)00000                                                               NO
2"00"("00"2(""))                                                              NO

Я думаю, я повинен був бути трохи зрозумілішим - ви можете припустити, що або новий рядок ніколи не існує, або завжди є. Чи допомагає це?
Sp3000

Чи можна було б використовувати програму стека фіксованого розміру, але встановити розмір стека на довжину вводу?
isaacg

@isaacg Оскільки вхід є stdin, ми не маємо уявлення, поки він не буде прочитаний. Я легко міг написати драйвер, який використовує аргумент або рядок командного рядка, але гольф має інші пріоритети. Динамічний стек в 25 символів не поганий за стандартами c, але я впевнений, що все-таки можна пограти в гольф.
rici

4

80386 Асемблер, 97 байт

Шістнадцятковий дамп:

0000000: 8b54 2404 5589 e531 c96a ff8a 022c 303c  .T$.U..1.j...,0<
0000010: f275 04f6 d530 c084 ed75 263c f875 0141  .u...0...u&<.u.A
0000020: 3cf9 750f 84c9 7419 4958 3c00 7c03 50eb  <.u...t.IX<.|.P.
0000030: 2430 c084 c075 0958 483c ff7f 0140 ebf3  $0...u.XH<...@..
0000040: 5042 8a02 84c0 75c5 4a84 edb0 2275 be84  PB....u.J..."u..
0000050: c9b0 2975 b85a 31c0 39e5 7501 4089 ec5d  ..)u.Z1.9.u.@..]
0000060: c3                                       .

Це проходить через вхід один раз, висуваючи числа, більші за нуль, на стек і зменшуючи їх, коли нуль обробляється. Без обмежень обробляється як -1.

Прототип функції (в С) (функція повертає 0, якщо недійсна і 1, якщо дійсна):

int __cdecl test(char *in);

Еквівалентна збірка (NASM):

bits 32
; get input pointer into edx
mov edx, [esp+4]                ; 8B 54 24 04

; save ebp; set ebp = esp
push ebp                        ; 55
mov ebp, esp                    ; 89 E5

; clear ecx
xor ecx, ecx                    ; 31 C9

; push base -1
push byte(-1)                   ; 6A FF

; get top char
mov al, [edx]                   ; 8A 02

    sub al, 0x30                ; 2C 30

    ; if al == quote
    cmp al, 0xF2                ; 3C F2
    jne $+6                     ; 75 04
        ; set ch (in quote?) to opposite
        not ch                  ; F6 D5
        ; set value to 0
        xor al, al              ; 30 C0

    ; if in quote, continue
    test ch, ch                 ; 84 ED
    jnz $+40                    ; 75 26

    cmp al, 0xF8                ; 3C F8
    jne $+3                     ; 75 01
        ; increment cl=depth
        inc ecx                 ; 41

    cmp al, 0xF9                ; 3C F9
    jne $+17                    ; 75 0F
        ; check depth = 0
        test cl, cl             ; 84 C9
        jz $+27                 ; 74 19
        ; decrement cl=depth
        dec ecx                 ; 49
        ; pop and check -1
        pop eax                 ; 58
        cmp al, 0               ; 3C 00
        jl $+5                  ; 7C 03
            push eax            ; 50
            jmp $+38            ; EB 24
        xor al, al              ; 30 C0

    test al, al                 ; 84 C0
    jnz $+11                    ; 75 09
        pop eax                 ; 58
        dec eax                 ; 48
        cmp al, -1              ; 3C FF
        jg $+3                  ; 7F 01
            inc eax             ; 40
        jmp $-11                ; EB F3
    push eax                    ; 50

    inc edx                     ; 42
    mov al, [edx]               ; 8A 02
    test al, al                 ; 84 C0
    jnz $-57                    ; 75 C5

    dec edx                     ; 4A

    ; in quote?
    test ch, ch                 ; 84 ED
    mov al, 0x22                ; B0 22
    jnz $-64                    ; 75 BE

    ; depth not zero?
    test cl, cl                 ; 84 C9
    mov al, 0x29                ; B0 29
    jnz $-70                    ; 75 B8

; pop base -1
pop edx                         ; 5A

; set return value based on ebp/esp comparison
xor eax, eax                    ; 31 C0
cmp ebp, esp                    ; 39 E5
jne $+3                         ; 75 01
inc eax                         ; 40
; restore esp
mov esp, ebp                    ; 89 EC
; restore ebp
pop ebp                         ; 5D
; return
ret                             ; C3

Наступний код на C може бути використаний з GCC в системі POSIX для тестування:

#include <sys/mman.h>
#include <stdio.h>
#include <string.h>

int main(){
    char code[] = {
        0x8b, 0x54, 0x24, 0x04, 0x55, 0x89, 0xe5, 0x31, 0xc9, 0x6a, 0xff,
        0x8a, 0x02, 0x2c, 0x30, 0x3c, 0xf2, 0x75, 0x04, 0xf6, 0xd5, 0x30, 
        0xc0, 0x84, 0xed, 0x75, 0x26, 0x3c, 0xf8, 0x75, 0x01, 0x41, 0x3c, 
        0xf9, 0x75, 0x0f, 0x84, 0xc9, 0x74, 0x19, 0x49, 0x58, 0x3c, 0x00, 
        0x7c, 0x03, 0x50, 0xeb, 0x24, 0x30, 0xc0, 0x84, 0xc0, 0x75, 0x09, 
        0x58, 0x48, 0x3c, 0xff, 0x7f, 0x01, 0x40, 0xeb, 0xf3, 0x50, 0x42, 
        0x8a, 0x02, 0x84, 0xc0, 0x75, 0xc5, 0x4a, 0x84, 0xed, 0xb0, 0x22, 
        0x75, 0xbe, 0x84, 0xc9, 0xb0, 0x29, 0x75, 0xb8, 0x5a, 0x31, 0xc0, 
        0x39, 0xe5, 0x75, 0x01, 0x40, 0x89, 0xec, 0x5d, 0xc3,
    };
    void *mem = mmap(0, sizeof(code), PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_PRIVATE, -1, 0);
    memcpy(mem, code, sizeof(code));
    int __cdecl (*test)(char *) = (int __cdecl (*)(char *)) mem;

    #define TRY(s) printf(s ": %d\n", test(s))

    printf("Truthy tests:\n");
    TRY("0");
    TRY(")");
    TRY("(");
    TRY("\"");
    TRY("()");
    TRY("\"\"");
    TRY("10");
    TRY("400010");
    TRY("210010");
    TRY("(\"\")00");
    TRY("3\"\"\"\"\"");
    TRY("(0)))0)1)0");
    TRY("2(2(2(0)0)0)0");
    TRY("2\"010\"\"44)()4\"");
    TRY(")31(0)0(201000100");
    TRY("())2)1))0\"3())\"))");
    TRY("3(\"4321(\"301(0)21100\"4\")\"123\"00)40\"121\"31000\"\"01010");

    printf("\nFalsy tests:\n");
    TRY("1");
    TRY("1(310");
    TRY("(1)0)");
    TRY("12(010");
    TRY("4\"00010\"");
    TRY("3120102100");
    TRY("20(2((0)(0)))");
    TRY("2(2(2(0)0)0)01)");
    TRY("4(0102)00)00000");
    TRY("2\"00\"(\"00\"2(\"\"))");

    munmap(mem, sizeof(code));
    return 0;
}

3

Python 2, 353 байт

Функція синтаксичного аналізу проходить через лексеми по черзі та створює дерево програмної структури. Недійсні програми викликають виняток, який спричиняє друк нуля (Falsy), інакше успішний синтаксис аналізує результат.

def h(f,k=0):
 b=[]
 if k:
  while f:b+=[h(f)]
  return b
 q=f.pop(0)
 if q==')':return[]
 elif q=='"':
  while f:
   q+=f.pop(0)
   if q[-1]=='"':break
 elif q=='(':
  while f:
   if f and f[0]==')':f.pop(0);break
   b+=h(f)
 else:
  for i in range(int(q)):b+=h(f)
  assert len(b)==int(q)
 return[[q,b]]
try:h(list(raw_input()));r=1
except:r=0
print r

Вихід тестів, що показують вихід аналізатора:

------------------------------------------------------------
True: 0
    0

------------------------------------------------------------
True: )

------------------------------------------------------------
True: (
    (

------------------------------------------------------------
True: "
    "

------------------------------------------------------------
True: ()
    (

------------------------------------------------------------
True: ""
    ""

------------------------------------------------------------
True: 10
    1
        0

------------------------------------------------------------
True: 400010
    4
        0
        0
        0
        1
            0

------------------------------------------------------------
True: 210010
    2
        1
            0
        0
    1
        0

------------------------------------------------------------
True: ("")00
    (
        ""
    0
    0

------------------------------------------------------------
True: 3"""""
    3
        ""
        ""
        "

------------------------------------------------------------
True: 2(2(2(0)0)0)0
    2
        (
            2
                (
                    2
                        (
                            0
                        0
                0
        0

------------------------------------------------------------
True: 2"010""44)()4"
    2
        "010"
        "44)()4"

------------------------------------------------------------
True: )31(0)0(201000100
    3
        1
            (
                0
        0
        (
            2
                0
                1
                    0
            0
            0
            1
                0
            0

------------------------------------------------------------
True: 3("4321("301(0)21100"4")"123"00)40"121"31000""01010
    3
        (
            "4321("
            3
                0
                1
                    (
                        0
                2
                    1
                        1
                            0
                    0
            "4"
        "123"
        0
    0
    4
        0
        "121"
        3
            1
                0
            0
            0
        ""
    0
    1
        0
    1
        0

------------------------------------------------------------
False: 1
0
------------------------------------------------------------
False: 1(310
0
------------------------------------------------------------
False: 12(010
0
------------------------------------------------------------
False: 4"00010"
0
------------------------------------------------------------
False: 3120102100
0
------------------------------------------------------------
False: 20(2((0)(0)))
0
------------------------------------------------------------
False: 2(2(2(0)0)0)01)
0
------------------------------------------------------------
False: 4(0102)00)00000
0
------------------------------------------------------------
False: 2"00"("00"2(""))
0

Код перед мініфікатором:

def parse(tokens, first=False):
    toklist = []
    if first:
        while tokens :
            toklist += [parse(tokens)]
        return toklist
    tok = tokens.pop(0)
    if tok == ')' :
        return []
    elif tok == '"':
        while tokens:
            tok += tokens.pop(0)
            if tok[-1] == '"' :
                break
    elif tok == '(':
        while tokens:
            if tokens and tokens[0] == ')' :
                tokens.pop(0);
                break
            toklist += parse(tokens)
    else:
        for i in range(int(tok)) :
            toklist += parse(tokens)
        assert len(toklist) == int(tok)
    return [[tok, toklist]]

try :
    parse(list(raw_input()));
    r = 1
except :
    r = 0
print r

Добре (аб) використання винятків! Ви можете зберегти пробіли, замінивши порядок операндів на ==тести - введення рядків спочатку означає, що ви можете зробити if')'==q. Я вважаю, що одне із breakтверджень можна було б замінити f=0, оскільки це також виведе вас із while fциклу. Нарешті, замість assert x==yвас можна використовувати 1/(x==y)для ZeroDivisionError. ;)
DLosc

@DLosc, дякую за кілька дуже корисних порад щодо гольфу. Якби я був одним з лідерів змагань з гольфу, я б використав твої ідеї, щоб змагатися. Оскільки мій запис далекий від конкурентоспроможного (для гольфу), я вважаю за краще читати приклад. Я відзначив ваші розумні прийоми, хоч для подальшого використання ;-)
Логічний лицар

1

Піп , 88 72 байти

Ідея взята з CJam оптимізатора . Моя первісна ступінь проблеми з рекурсивним аналізатором спуску була ... досить довшою.

Qpz:,5.iX,5AL'(.0X,#p.')p^:'"Fj,#pIj%2p@j:0p:Jpp.:')X#pL#ppR:z0!pRM')Rz0

Відформатовано з поясненням:

Qp                Query user for p
z:                Store the following list in z:
  ,5 . 0X,5         For x in range(5), concatenate x zeros to it
  AL                (append list)
  '(. 0X,#p .')     For x in range(len(p)), concatenate x zeros inside parens
p^: '"            Split p on " and assign result back to p
Fi,#p             Loop over the indices of the resulting list:
 Ii%2               If index is odd:
  p@i:0               Replace that item with 0
p: Jp             Concatenate the results and assign back to p
p.: ')X#p         Append len(p) closing parens to p
L#p               Loop len(p) times:
 pR:z0              Replace every occurrence in p of items of z with 0
! pRM')Rz0        Remove ) from result and replace z with 0 one more time; then
                  take logical negation, which will be true iff string is empty OR
                  consists only of zeros

Цікаві хитрощі:

  • Багато операторів працюють у списках та діапазонах, що відповідають умовам. Так 0X,5, наприклад, є 0 X [0 1 2 3 4] == ["" "0" "00" "000" "0000"].
  • За станом на кілька днів тому, Rоператор третього місця може взяти список для будь-якого з його аргументів: "abracadabra" R ["br" "ca"] 'bподає ababdaba, наприклад. Я добре використовую цю функцію zтут.
  • Помилкові значення Pip включають порожній рядок "", порожній список []та будь-який скаляр, який дорівнює нулю. Таким чином, 0є помилковим, але також 0.0і "0000000". Ця функція іноді незручна (щоб перевірити, чи рядок порожній, треба перевірити його довжину, тому що "0"теж помилково), але для цієї проблеми це ідеально.

1

Javascript (ES6), 289 288 285 282 278 244 241 230 байт

c=prompt(k="0"),j=c[l="length"];if((c.match(/"/g)||[])[l]%2)c+='"';c=c[R="replace"](/".*?"/g,k);c+=")".repeat(j);while(j--)c=c[R](/\(0*\)/,k)[R](/10/g,k)[R](/200/g,k)[R](/3000/g,k)[R](/40000/g,k);alert(!c[R](/0/g,"")[R](/\)/g,""))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.