A caixa de seleção não está desmarcada?


65

Ao revisar o código, deparei-me com o código a seguir, que testa o status de uma caixa de seleção:

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

Eu tive que pensar por 30 minutos para descobrir qual o status real da caixa de seleção que o código estava esperando. Por favor, escreva-me um programa que possa simplificar essas expressões tolas!


O programa deve aceitar como entrada uma string representando a expressão para simplificar (por exemplo !isNotUnchecked():). O programa deve gerar uma expressão simplificada logicamente equivalente, isChecked()ou !isChecked().

O nome do método na expressão de entrada sempre começa com is, contém 0..n Note termina com Checked()ou Unchecked(). O método pode ser prefixado por qualquer número de !.

Exemplos

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

O texto sempre diferencia maiúsculas de minúsculas? A entrada seria notunischecked?
— Stevefestl

11
@SteveFest Não, você pode assumir que a entrada está sempre no formato que eu descrevi acima. Você não precisa lidar com, isnotuncheckedpor exemplo.
— Arnaud

6
Com um nome de função como esse, eu daria 10 a 1 de chances de nem sequer testar a condição verificada de acordo com a nomeação.
— Caleb

2
Em outras palavras, você sabe o que é uma caixa desmarcada, o que é uma caixa não desmarcada (está marcada, se e somente se "marcada" e "desmarcada" são os dois únicos estados possíveis, caso contrário, pode haver algo em a caixa de seleção: int, assinar ...) e, para essa caixa de seleção específica, não é (não está "marcada", seja com uma marca de seleção ou algo assim). Se for verdade, então, você tem certeza de que a caixa de seleção não está "marcada" por nada. Se falso, bem, você sabe que a caixa de seleção é uma caixa não desmarcada, mas isso não significa necessariamente que está marcada, a menos que haja apenas dois estados possíveis (então está marcada).
— J Doe

11
@J Doe obrigado pelo esclarecimento!
— Arnaud

Respostas:


31

Python , 51 bytes

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

Experimente online!


Você é um gênio puro! Nunca teria pensado ems[-8:]
— Sr. Xcoder

Certamente 'isC'+s[-8:]um byte é maior que 'isChecked'?
— Neil

9
mas 1 byte menor que 'isChecked ()'
— Andrew Smith

Alguém pode explicar o que s[-8:]é / faz?
— ESR

11
@EdmundReed Leva os últimos 8 caracteres da entrada, que são sempre hecked().
— Xnor

24

Retina , 23 bytes

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

Experimente online!

Explicação

Unc
!C

Transformar Uncheckedem !Checked.

Not
!

Transforme todos os Nots em !. Agora temos algo parecido !!!is!!!!Checked().

O`is|!

Classifique todas as correspondências de isou !. Como ! < isisso move tudo !para o início da string, o exemplo acima se tornaria !!!!!!!isChecked().

!!

Remova os pares de !para cancelar a negação repetida.



13

Python , 43 bytes

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

Uma função sem nome que pega a string se retorna uma string.

Experimente online!

Não há necessidade de verificar a existência de caracteres quando !, Note Untodos têm exatamente um ordinal estranho (e ce Csão ambos ímpar), então apenas resumir os ordinais e usar o valor do módulo 2 de decidir se queremos uma !ou não.

Fora isso, o formulário é o mesmo da resposta do xnor , pois não encontrei nada melhor. O seguinte também é 43:

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

10

JavaScript (ES6), 51 50 bytes

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

Funciona através da procura !, Ne npersonagens, que inverter o estado verificado. splitretorna um comprimento de matriz ímpar por padrão, então adicionamos !quando o splitcomprimento é par. Editar: salvou 1 byte graças a @ETHproductions. Versão alternativa, também para 50 bytes:

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

Agora eu volto e olho para as outras respostas, todos estão fazendo isso.
— Neil

Você deve poder soltar o sinalizador global do RegEx para salvar um byte.
— Shaggy

@ Shaggy Na verdade, o meu comprimento está correto, mas não consegui remover o gna edição mais recente.
— 1111 Neil

11
Eu acho que você pode salvar um byte com/!|N/i
— ETHproductions

@ETHproductions Eu acho que você quis dizer /!|N/, sem o imodificador
— SplittyDev


7

Java 7, 100 77 bytes

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

Expansão:

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

Código do teste:

Experimente aqui.

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()"));
  }
}

Resultado:

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

7

Aceto , 49 bytes

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

yadda yadda Curva de Hilbert.

Primeiro, colocamos os três caracteres importantes na pilha:

!'
'N'U

Em seguida, definimos uma marca de captura e começamos lendo um único caractere. Nós o dduplicamos e o negamos, e se o resultado for verdadeiro (por isso, se a string estiver vazia; a entrada terminou), pularemos para o final:

;`
d!
,@

Com a cópia restante do caractere de entrada, verificamos se ele está contido no restante da pilha (ou seja, se é um de!, N, U). Caso contrário, apresentamos um erro, lançando-nos de volta à nossa marca de captura, onde lemos outro personagem:

&c
`!

Caso contrário, carregamos o que está no armazenamento rápido (essencialmente um registro que é inicialmente uma string vazia; falsy), negamos e o enviamos de volta ao armazenamento rápido, e também aumentamos o erro (voltando à leitura dos caracteres):

&M
L!

Quando a entrada parou, somos enviados para o fim. Lá, invertemos a direção, pressionamos um ponto de exclamação, carregamos um armazenamento rápido e o negamos. Se isso é verdade (ou seja, tivemos um número ímpar de coisas de negação), imprimimos o ponto de exclamação que pressionamos:

p !'
`!Lu

Por fim, empurramos a sequência em duas partes e as imprimimos (por motivos de economia de espaço):

"pp"
)(de
  Che"
  sick
   "

Posteriormente, o programa ainda volta ao início original, mas como nenhum dos comandos gera nada ou possui comportamento em loop, isso não importa. Na verdade, o primeiro comando non-nopping que alcançamos gera uma exceção, pulando a maior parte do código porque saltamos para a marca de captura, o que significa que tudo o que Aceto vê nessa parte é:

&



!' @
'N'U

Desde Uagora não é precedido por um caractere de aspas simples e, portanto, não é visto como um caractere literal, ele é interpretado como um comando: Uinverte todos os elementos na pilha (agora é !, N, U, a partir do topo), e 'Ne '!empurrar mais caracteres, o que significa que terminamos com a pilha [U, N, !, N, !].

Nota lateral: Este é o primeiro programa do Aceto escrito (em parte) com a ajuda do novo editor do Aceto .


6

C, 78 70 68 bytes

Obrigado Christoph!

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

Experimente online

Resultado:

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

11
c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}usar xor para inverter ceconomiza 2 bytes.
— Christoph

6

Perl 5 , 31 bytes

-2 bytes graças a @Dom Hastings .

30 bytes de código + -psinalizador.

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

Experimente online!

y/UN!//conta o número de ocorrências de Un, Note !. O resultado é que muitos !módulos 2, seguidos por isChecked().


Outra tentativa, com base no regex, de 38 bytes (Dom Hastings salvou 1 byte nesse):

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

Experimente online!


Sua versão regex não funciona porque existem dois cs Unchecked.
— 1111 Neil

11
@ Neil, o regex substitui apenas o primeiro (já que não estou usando /gflag). Os casos de teste parecem bons para mim (consulte o link TryItOnline). Então, eu realmente não vejo o que quer dizer ...
— Dada

Desculpe, o motivo correto que a sua versão regex não funciona é que, embora haja um cem Uncheckedhá também um em Checked, então quando você subsitute que você acabar com CheCked.
— Neil

11
Ei, espero que você esteja bem! Eu não estive aqui em um tempo, mas eu tive um pouco de jogar com estes para -2 no primeiro e -1 no segundo
— Dom Hastings

11
@DomHastings Hey! Impressionante, muito obrigado! Feliz em vê-lo de volta :-)
— Dada

6

Scala , 39 30 bytes

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

Experimente online!

Infelizmente não consegui deduzir o tipo de s.

Edit: Moveu a declaração de tipo para o cabeçalho (acho que isso é permitido, se não, vou colocá-lo de volta).




3

05AB1E , 16 bytes

ÇOÉ'!×…isCyR8£RJ

Experimente online!

Usa o truque de somar os ordinais da resposta em python de Jonathan Allan .

Explicação

 ÇO                # sum of ascii values of input
   É               # is odd
    '!×            # repeat "!" that many times
       …isC        # push the string "isC"
           IR8£R   # push the last 8 chars of input
                J  # join everything to string

3

Japonês , 24 23 bytes

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

Explicação

 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()"

Experimente online!


11
Espere ... Como ... Por que ... Não odiferencia maiúsculas de minúsculas? Eu não sabia o que ... #
— 511 ETHproductions

Também não sabia, mas descobri quando testei com "! NU". A letra minúscula "n" em "Unchecked" também permaneceu, para que eu pudesse largar o "U"
— :)

3

PHP (5.5 - 5.6), 52 50 49 bytes

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

Experimente aqui .

-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()";

Sem regex, fica um pouco mais compex :) Experimente aqui .

-4 Bytes by @Titus. Ty :)

11
error_reportingvalor padrão é E_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATED.
— Titus

11
@Titus batendo JS em um desafio regex yay!
— Christoph

$b^=$aVery nice find! Você também pode fazer isso sem as tags PHP do mesmo tamanho.
— Titus

11
61 bytes se o espaço em branco à esquerda for permitido:for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";
— Titus

@Titus Eu tenho que admitir que foi inspirado por esta resposta .
— Christoph

3

Geléia ,  16  15 bytes

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

Um programa completo que usa a string como argumento de linha de comando e imprime o resultado

Experimente online!

OSḂ⁾!iṫ-7³ṫṭ⁾sCou OSḂ⁾!iṫ-7³ṫ⁾sC;ambos também trabalhariam para 15.

Quão?

Utiliza a mesma ideia da minha resposta Python , mas salva bytes usando uma construção diferente de !isCou isCe alguma impressão implícita no 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()")

previous @ 16 bytes 9 (usando concatenação e emparelhamento com a mesma ideia subjacente):

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

Ah, caramba, eu pensei em algo com o truque mod 2. Então eu encontrei este: PI teve isso por 18 bytes, talvez ele poderia ajudar:OS1&”!x;“isC”;ṫ-7$
— Conor O'Brien

2

Perl 6 ,  35  31 bytes

{'!'x m:g/<[!NU]>/%2~'isChecked()'}

Tente

{'!'x tr/!NU//%2~'isChecked()'}

Experimente
(requer uma sequência de entrada mutável que será mutilada)

Expandido:

{
  #(
    '!'
  x               # string repeat

    # m:g/<[!NU]>/
    tr/!NU//      # find the number of negatives
      % 2         # modulus 2
  #)

  ~                # string concat

    'isChecked()'
}

2

Sed, 36 bytes

A mesma idéia que todas as outras respostas de substituição direta.

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

2

sed, 37 38 bytes

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

37 + 1 para o -rcomutador:

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

11
Essa última s/c/C/problemas causados pela resposta Perl 5 ...
— Neil

Sim, parece que o s/c/C/é pegar o segundo "c" em casos sem "Un"
— Kevin

11
Além disso, você pode salvar um byte, soltando ge movendo o s/!!//interior do loop.
— 11557 Kevin

2

Mathematica, 82 61 60 Bytes

Pequenos ajustes, adicionado mais um operador de infix:

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

Anteriormente:

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

Contar todos os o's, n's e! 'S então mod 2 e colocar tantos! em frente.

Versão antiga:

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

2

Excel, 90 bytes

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

2

Lote do Windows, 120 bytes

Anteriormente, 268 257 253 245 239 221 182 176 169 123 bytes

@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%

Os programas substituem todo o !conteúdo N#. Como agora todos os sinais de negação,! (Agora é N#), Note Uncontém N, o programa pode contar o número de aparências Ne determinar se uma liderança !é necessária.

Cada vez que o programa conta um N, o contador é adicionado por 5. O motivo da adição de 5 é porque cada valor alternativo ao adicionar 5 termina em 0 ou 5. Isso pode ser usado para determinar se o valor é ímpar ou par e o principal !adicionado se necessário.

Além disso, o truque dos últimos oito caracteres do xnor é utilizado.


Alguém poderia pensar programação em janelas lote seria impossível ...
— NieDzejkob

É claro ...... Batch scripting é um absurdo ....
— stevefestl

1

Geléia , 29 28 25 21 bytes

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

Experimente online!

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 bytes graças a Jonathan Allan!
-4 bytes graças a Jonathan Allan! (usando cadeias compactadas)


Salve a interface que Lynn criou aqui como um módulo (por exemplo, jellyCompress.py), para que isso fosse formado jellyCompress.Compress().string("is").dictionary("Checked").string("()").go(). (Se você estiver executando em um Windows cmd instalar e mudar para a fonte DejaVu Sans Mono e alterar a página de código com o comando chcp 65001antes de lançar Python para obter os caracteres para exibir)
— Jonathan Allan

@JonathanAllan Oh okay. Obrigado!
— HyperNeutrino

1

PHP, 55 bytes

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

Experimente online!

PHP, 58 bytes

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

em vez disso, "#[!NU]#"você pode usar"#[!N]#i"

Experimente online!

PHP, 68 bytes

Versão sem Regex

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

Experimente online!


3
<?=preg_match_all("#[!UN]#",$argn)&1?"!":""?>isChecked()-2 bytes
— Titus

Tinha exatamente a mesma resposta antes de me apresentar count(split()): D @Titus boa ideia!
— Christoph

11
" !"[$d&1]salva outro byte se o espaço em branco à esquerda estiver ok. $d^=!trim($c,"UN!")economiza 3 bytes (porque você não precisa &1mais).
— Titus

11
@ Titus Sim, um exemplo a mais que você tem mais conhecimento do que eu. Obrigado e para o problema de espaço em branco à direita eu tenho fazer "!"[!$d]em vez
— Jörg Hülsermann

11
@ Christoph você está certo eu tenho esquecê-lo muito por isso
— Jörg Hülsermann

1

Japonês , 19 bytes

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

Experimente online!

Descompactado e como funciona

`‰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

Usando o truque de soma de código de código da solução Python de Jonathan Allan .


1

Pascal (FPC) , 119 bytes

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.

Experimente online!

Usando o método que quase todas as respostas fazem, somando pontos de código de caracteres na entrada e verificando a paridade da soma.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.