Чи прапорець не знятий?


65

Роблячи огляд коду, я натрапив на такий код, який перевіряє статус прапорця:

if (!isNotUnchecked()) { ... }

Мені довелося тримати мозковий штурм протягом 30 хвилин, щоб дізнатися, який фактичний статус прапорця очікував код. Будь ласка, напишіть мені програму, яка може спростити ці дурні вирази!


Програма повинна прийняти як введення рядок, що представляє вираз для спрощення (наприклад !isNotUnchecked():). Програма повинна вивести логічно еквівалентний спрощений вираз, isChecked()або !isChecked().

Назва методу у вхідному виразі завжди починається з is, містить 0..n Notі закінчується Checked()або Unchecked(). Метод може бути префіксом будь-якої кількості !.

Приклади

isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()

Чи текст завжди відрізняється великим регістром? Буде вхід notunischecked?
stevefestl

1
@SteveFest Ні, ви можете припустити, що введення завжди у форматі, який я описав вище. isnotuncheckedНаприклад, вам не потрібно звертатися .
Арно

6
З такою назвою функції я б дав їй 10 на 1 шанси, що він навіть не перевіряв перевірений стан відповідно до його іменування.
Калеб

2
Іншими словами, ви знаєте, що таке неперевірений прапорець, ви знаєте, що таке неперевірений прапорець (він встановлений, якщо і лише якщо "позначено" і "не відмічено" є єдиними двома можливими станами, інакше це може бути що-небудь у прапорець: int, знак ...) і для цього конкретного прапорця він не є (він не "встановлений", незалежно від того, чи це галочка чи що-небудь). Якщо тоді правда, ви впевнені, що прапорець нічого не "перевіряється". Якщо помилково, добре, ви знаєте, що прапорець - це неперевірений прапорець, але це не обов'язково означає, що він встановлений, якщо тільки два можливі стани (тоді це встановлено).
J Doe

1
@J Доу, дякую за роз’яснення!
Арно

Відповіді:


31

Пітон , 51 байт

lambda s:sum(map(s.count,'!NU'))%2*'!'+'isC'+s[-8:]

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


Ти чистий геній! Ніколи б не думав про цеs[-8:]
містер Xcoder

Напевно 'isC'+s[-8:], байт довше 'isChecked'?
Ніл

9
але на 1 байт коротше, ніж "isChecked ()"
Ендрю Сміт

Чи може хтось пояснити, що s[-8:]таке / робить?
ESR

1
@EdmundReed Він займає останні 8 символів вводу, які завжди є hecked().
xnor

24

Сітківка , 23 байти

Unc
!C
Not
!
O`is|!
!!

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

Пояснення

Unc
!C

Перетвориться Uncheckedна !Checked.

Not
!

Увімкніть усі Nots !. Зараз ми отримуємо щось на кшталт !!!is!!!!Checked().

O`is|!

Сортувати всі збіги isабо !. Оскільки ! < isце переміщує все на !початок рядка, так би став вищенаведений приклад !!!!!!!isChecked().

!!

Видаліть пари, !щоб скасувати повторне заперечення.



13

Пітон , 43 байти

lambda s:sum(map(ord,s))%2*'!'+'isC'+s[-8:]

Безіменна функція взяття рядка sта повернення рядка.

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

Немає необхідності , щоб перевірити наявність символів , коли !, Notі Unвсі вони мають рівно один непарний порядковий номер (та , cі Cобидва непарні), так що просто підсумовувати порядкові і використовувати значення по модулю 2 , щоб вирішити , якщо ми хочемо !чи ні.

Крім того, що форма є такою ж, як відповідь xnor , тому що я не знайшов нічого кращого. Далі також 43:

lambda s:'!isC'[~sum(map(ord,s))%2:]+s[-8:]

10

JavaScript (ES6), 51 50 байт

f=
s=>(s.split(/!|n/i).length%2?'':'!')+'isChecked()'
<input oninput=o.textContent=f(this.value)><pre id=o>

Робота шукає !, Nі nсимволи, які инвертировать перевірене стан. splitповертає непарну довжину масиву за замовчуванням, тому ми додаємо, !коли splitдовжина парна. Редагувати: Збережено 1 байт завдяки @ETHproductions. Альтернативна версія, також на 50 байт:

s=>`${s.split(/!|n/i).length%2?``:`!`}isChecked()`

Ага, зараз я повертаюся назад і дивлюся інші відповіді, вони все роблять.
Ніл

Ви повинні мати можливість скинути глобальний прапор з RegEx, щоб зберегти байт.
Кудлатий

@Shaggy Насправді моя довжина правильна, я просто не зміг видалити gостанню редакцію .
Ніл

1
Я думаю, ви можете зберегти байт за допомогою/!|N/i
ETHproductions

@ETHproductions Я думаю, ти мав на увазі /!|N/без iмодифікатора
SplittyDev


7

Java 7, 100 77 байт

String c(String s){return(s.split("[!NU]").length%2<1?"!":"")+"isChecked()";}

Пояснення:

String c(String s){  // Method with String parameter and String return-type
  return(s.split("[!NU]").length
                     //  Count the amount of '!', 'N' and 'U' in the input String (+ 1)
    %2<1?            //  and if they are an even number:
     "!"             //   Start with an examination mark
    :                //  Else:
     "")             //   Start with nothing
    +"isChecked()";  //  And append "isChecked()" to that
}                    // End of method

Код тесту:

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

class M{
  static String c(String s){return(s.split("[!NU]").length%2<1?"!":"")+"isChecked()";}

  public static void main(String[] a){
    System.out.println(c("isChecked()"));
    System.out.println(c("isUnchecked()"));
    System.out.println(c("isNotChecked()"));
    System.out.println(c("!isNotChecked()"));
    System.out.println(c("!!!isNotNotUnchecked()"));
  }
}

Вихід:

isChecked()
!isChecked()
!isChecked()
isChecked()
isChecked()

7

Ацето , 49 байт

&M"pp"
L!)(de
&c;`Che"
`!d!sick
!',@p"!'
'N'U`!Lu

крива Ядда Ядда Гільберт.

Перш за все, ми натискаємо на стек трьох важливих символів:

!'
'N'U

Потім встановлюємо знак лову і починаємо з читання одного символу. Ми dускладнюємо його і заперечуємо, і якщо результат цього є неправдоподібним (так, якщо рядок був порожнім; значить, введення закінчилося), ми переходимо до кінця:

;`
d!
,@

За допомогою решти копії вхідного символу ми перевіряємо, чи міститься він у решті стека (тобто, чи є його один з!, N, U). Якщо це не так, ми робимо помилку, відкидаючи нас до позначки лову, де ми читаємо іншого символу:

&c
`!

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

&M
L!

Коли введення припинено, нас відправляють до кінця. Там ми перевертаємо напрямок, натискаємо знак оклику та завантажуємо швидке зберігання та заперечуємо його. Якщо це правда (тобто у нас було непарна кількість заперечень), ми друкуємо знак оклику, який ми натиснули:

p !'
`!Lu

Нарешті, ми висуваємо рядок у двох частинах і друкуємо їх (з економії місця):

"pp"
)(de
  Che"
  sick
   "

Згодом програма все ще повертається до початкового початку, але оскільки жодна з команд нічого не виводить або не має певної поведінки, це не має значення. Власне, перша непомітна команда, яку ми дістаємо, викликає виняток, пропускаючи більшість коду, тому що ми переходимо до позначки лову, тобто все, що Aceto бачить у цій частині, це:

&



!' @
'N'U

Оскільки Uна даний час не передує одиночної лапки , і тому не розглядається в якості символьного литерала, він отримує інтерпретується як команда: Uперевертає все елементи в стеку (тепер це !, N, U, з верхньої частини), а також 'Nі '!висунути більш символів, тобто закінчуємо стеком [U, N, !, N, !].

Побічна примітка: Це перша програма Aceto, написана (частково) за допомогою нового редактора Aceto .


6

C, 78 70 68 байт

Дякую Крістофе!

c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}

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

Вихід:

isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()

1
c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}за допомогою xor для перевертання cекономить 2 байти.
Крістоф

6

Perl 5 , 31 байт

-2 байт завдяки @Dom Гастінгс .

30 байт коду + -pпрапор.

/c/i;$_="!"x(y/UN!//%2).isC.$'

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

y/UN!//підраховує кількість входжень Un, Notі !. У результаті виходить багато !модулів 2, за якими слідує isChecked().


Ще одна спроба, заснована на регулярному вираженні, для 38 байт (Дом Гастінгс зберег 1 байт на цьому):

s/isNot|isUn(c)/!is\u$1/?redo:s/!!//g

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


Ваша версія регексу не працює, тому що є два cs Unchecked.
Ніл

1
@Neil регекс замінює лише перший (оскільки я не використовую /gпрапор). Тестові справи мені добре виглядають (див. Посилання TryItOnline). Тож я насправді не бачу, що ти маєш на увазі ...
Дада

Вибачте, правильна причина того, що ваша версія регексу не працює, полягає в тому, що, хоча є cв Unchecked, є також і один Checked, тож, коли ви його замінюєте, ви закінчуєте CheCked.
Ніл

1
Гей, сподіваюся, ти все гаразд! Я не був тут деякий час, але я трохи пограв з ними для -2 на першому та -1 для другого
Дом Гастінгс

1
@DomHastings Гей! Дивовижне, спасибі велике! Раді бачити вас :-)
Дада

6

Scala , 39 30 байт

s=>"!"*(s.sum%2)+"isChecked()"

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

На жаль, я не зміг зробити це для виведення типу s.

Редагувати: перемістив декларацію типу в заголовок (я думаю, це дозволено, якщо ні, я поверну його назад).





3

Japt , 24 23 байти

o"!N" l u)ç'! +`‰C”×B()

Пояснення

 o"!N" l u)ç'! +`‰C”×B()
Uo"!N" l u)ç'! +`‰C”×B()`
Uo"!N"                     # Only keep "!", "n" and "N" from the input
           ç'!             # Repeat the string "!" by
       l u)                # the parity of the length of the newly formed string
               +`‰C”×B()` # and concatenate with the string "isChecked()"

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


1
Зачекайте ... Як ... Чому ... Чи не oчутливі регістри? Я цього не знав ...
ETHproductions

Я теж цього не знав, але дізнався, коли пройшов тестування з "! NU". Нижній регістр "n" у "Неперевірений" також залишився, тому я міг скинути "U"
Лука

3

PHP (5,5 - 5,6), 52 50 49 байт

<?='!'[count(spliti('!|N',$argn))%2]?>isChecked()

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

-2 Bytes by @Titus. Ty :)
-1 Byte  by @ETHproductions. Ty :)

PHP (> = 5,5), 66 65 61

for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";

Без регулярних виразів він стає трохи більш складним :) Спробуйте тут .

-4 Bytes by @Titus. Ty :)

1
error_reportingзначення за замовчуванням - E_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATED.
Тіт

1
@Titus переміг JS у виклику регулярних виразів!
Крістоф

$b^=$aДуже приємна знахідка! Ви також можете зробити це без тегів PHP однакового розміру.
Тит

1
61 байт, якщо дозволений провідний пробіл:for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";
Тит

@Titus Я мушу визнати, що це надихнуло цю відповідь .
Крістоф

3

Желе ,  16  15 байт

OSḂ⁾!iṫ⁾sCø³ṫ-7

Повна програма, яка приймає рядок як аргумент командного рядка і друкує результат

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

OSḂ⁾!iṫ-7³ṫṭ⁾sCабо OSḂ⁾!iṫ-7³ṫ⁾sC;обидва також працюватимуть за 15.

Як?

Використовує ту саму ідею, що і моя відповідь Python , але економить байти, використовуючи іншу конструкцію !isCабо isCта якусь неявну друк в Jelly ...

OSḂ⁾!iṫ⁾sCø³ṫ-7 - Main link: s
O               - cast to ordinals
 S              - sum
  Ḃ             - mod 2
   ⁾!i          - literal ['!','i']
      ṫ         - tail -> ['i'] if OSḂ was 0; ['!','i'] if OSḂ was 1
                - this is printed due to the following starting a new leading
                - constant chain. Printing smashes so either "i" or "!i" is printed.
       ⁾sC      - literal ['s','C']
                - this is printed (as "sC") due to the following niladic chain.
          ø     - start a new niladic chain
           ³    - program's first input (3rd command line argument), s
            ṫ-7 - tail from index -7 = ['h','e','c','k','e','d','(',')']
                - implicit print (of "hecked()")

попередній @ 16 байт 9 (з використанням конкатенації та сполучення з тією ж базовою ідеєю):

OSḂ⁾!iṫ;⁾sC,ṫ€-7

Ах, чорт, я подумав, що я щось надію на трюк моди 2 Потім я виявив це: PI мав це на 18 байт, можливо, це може допомогти:OS1&”!x;“isC”;ṫ-7$
Conor O'Brien


2

Сід, 36 байт

Така сама ідея, як і всі інші відповіді на пряму заміну.

:
s/Unc/NotC/
s/isNot/!is/
s/!!//
t

2

sed, 37 38 байт

:;s/is(Not|Un)/!is/;s/!!//;t;s/ch/Ch/

37 + 1 для -rвимикача:

sed -r ':;s/is(Not|Un)/!is/;s/!!//;t;s/ch/Ch/'

1
Це останнє s/c/C/спричинило проблеми для відповіді Perl 5 ...
Ніл

Так, схоже, що s/c/C/ловить друге "с" у випадках без "Уну"
Кевін

1
Крім того, ви можете зберегти байт, скинувши gі перемістивши s/!!//внутрішню петлю.
Кевін

2

Математика, 82 61 60 байт

Невелика настройка, додано ще одного оператора інфіксації:

"!"~Table~Mod[#~StringCount~{"o","n","!"},2]<>"isChecked()"&

Раніше:

"!"~Table~Mod[StringCount[#,{"o","n","!"}],2]<>"isChecked()"&

Порахуйте всі о, н і та, а потім мод 2 і поставте стільки! попереду.

Стара версія:

"!"~Table~Mod[StringCount[StringReplace[#,{{"o","n"}->"!"}],"!"],2]<>"isChecked()"&

2

Excel, 90 байт

=IF(ISODD(SEARCH("C",SUBSTITUTE(SUBSTITUTE(A1,"Un","!"),"Not","!"))),"","!")&"isChecked()"

2

Пакет Windows, 120 байт

Раніше 268 257 253 245 239 221 182 176 169 123 байт

@set a=%1
@set s=#%a:~,-2%
@set s=%s:!=N#%
@for %%a in (%s:N= %)do @set/ac+=5
@if %c:~-1%==0 cd|set/p=!
@echo isC%a:~-8%

Програми замінюють все !в N#. Тому що тепер усі знаки заперечення,! (Тепер це є N#), Notі Unмістять N, програма може підраховувати кількість появи Nта визначати, чи потрібна ведуча !.

Кожен раз, коли програма рахує лічильник N, лічильник додається на 5. Причина додавання 5 полягає в тому, що кожне чергування значень при додаванні 5 закінчується в 0 або 5. Це можна використовувати для визначення того, чи є значення непарним або парним і провідним !нас додають, якщо потрібно.

Крім того, використовується останній восьми символьний трюк xnor.


Можна було б подумати, що програмування в пакеті Windows буде неможливим ...
NieDzejkob

Звичайно ...... Пакетні сценарії абсурдні ....
stevefestl

1

Желе , 29 28 25 21 байт

f“NU!”LḂ”!x;“µịÆẹṠƊẹ»

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

f“NU!”LḂ”!x;“µịÆẹṠƊẹ»  Main link, argument is z
f“NU!”                 Filter to only keep "NU!"
      LḂ”!x            Repeat exclamation mark by the parity of the length
           ;“µịÆẹṠƊẹ»  Concatenate to "isChecked()"

-4 байти завдяки Джонатану Аллану!
-4 байти завдяки Джонатану Аллану! (за допомогою стиснених рядків)


Зберегти інтерфейс Лінн зробив тут в якості модуля (скажімо , jellyCompress.py), то це був би сформований з jellyCompress.Compress().string("is").dictionary("Checked").string("()").go(). (Якщо ви працюєте у встановленні Windows cmd та переключитесь на шрифт DejaVu Sans Mono та змініть кодову сторінку командою chcp 65001перед запуском Python, щоб символи відображалися)
Джонатан Аллан

@JonathanAllan О добре. Дякую!
HyperNeutrino

1

PHP, 55 байт

<?=preg_match_all("#!|N#i",$argn)&1?"!":""?>isChecked()

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

PHP, 58 байт

<?=preg_match_all("#[!NU]#",$argn)%2?"!":"","isChecked()";

натомість "#[!NU]#"ви можете використовувати"#[!N]#i"

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

PHP, 68 байт

Версія без Regex

for(;$c=$argn[$i++];)$d^=!trim($c,"UN!");echo"!"[!$d],"isChecked()";

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


3
<?=preg_match_all("#[!UN]#",$argn)&1?"!":""?>isChecked()-2 байти
Тіт

Був точно такий же відповідь, перш ніж я придумав count(split()): D @Titus приємна ідея!
Крістоф

1
" !"[$d&1]зберігає інший байт, якщо провідний пробіл у порядку. $d^=!trim($c,"UN!")економить 3 байти (бо &1більше не потрібно ).
Тит

1
@Titus Так, ще один приклад, що ти маєш більше знань, ніж я. Дякую і за проблему пробілу пробілів, яку я "!"[!$d]замість цього зробив
Jörg Hülsermann,

1
@Christoph ти маєш рацію, я забув про це шкода
Jörg Hülsermann,

1

Japt , 19 байт

`‰C”×B()`i'!pU¬xc u

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

Розпаковано та як це працює

`‰C”×B()`i'!pUq xc u

`‰C”×B()`   Compressed string for "isChecked()"
i     Insert the following string at the beginning...
'!p     "!" repeated the following number of times...
Uq        Split the input into chars
xc        Sum the charcodes
u         Modulo 2

Використовуючи фокус із сумою charcode-суми з рішення Python Джонатана Аллана .


1

Паскаль (FPC) , 119 байт

var s:string;j:word;c:char;begin read(s);for c in s do j:=j+ord(c);if 1=j mod 2then write('!');write('isChecked()')end.

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

Використовуючи метод, який робить майже кожна відповідь, підсумовуючи кодові точки символів на вводі, а потім перевіряючи парність суми.

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