Onay kutusu işaretli değil mi?


65

Kod incelemesi yaparken, bir onay kutusunun durumunu test eden aşağıdaki koda rastladım:

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

Kodun beklediği gerçek onay kutusu durumunu öğrenmek için 30 dakika boyunca beyin fırtınası yapmak zorunda kaldım. Lütfen bu aptalca ifadeleri kolaylaştıracak bir program yazınız!


Program basitleştirmek için ifadeyi temsil eden bir dize girdi olarak kabul etmelidir (örneğin:) !isNotUnchecked(). Program ya çıkışı mantıksal olarak eşdeğer basitleştirilmiş bir ifade, gerektiği isChecked()veya !isChecked().

Giriş ifadesindeki yöntem adı daima ile başlar is, 0..n içerir Notve Checked()veya ile biter Unchecked(). Yöntemin herhangi bir sayıda ön eki olabilir !.

Örnekler

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

Metin her zaman büyük / küçük harf duyarlıdır mı? Giriş olur notunischeckedmu?
stevefestl

1
@SteveFest Hayır, girişin her zaman yukarıda tanımladığım biçimde olduğunu varsayabilirsiniz. isnotuncheckedÖrneğin ele almanıza gerek yok .
Arnaud

6
Bunun gibi bir fonksiyon ismiyle, 10'a 1 oranını veririm, hatta isimlendirilmiş durumla kontrol edilen koşulu bile test etmemesi.
Caleb

2
Başka bir deyişle, denetlenmeyen kutunun ne olduğunu bilirsiniz, denetlenmeyen kutunun ne olduğunu bilirsiniz (yalnızca "işaretli" ve "işaretlenmemiş" durumun yalnızca iki durum olması durumunda kontrol edilir, aksi takdirde onay kutusu: int, sign ...) ve bu özel onay kutusu için (onay işaretli olsun veya olmasın "işaretli değil" değildir). Eğer doğruysa, onay kutusunun hiçbir şey tarafından "kontrol edilmediğinden" emin olursunuz. Yanlışsa, onay kutusunun işaretlenmemiş bir kutu olduğunu biliyorsunuzdur, ancak yalnızca iki olası durum olmadıkça (daha sonra kontrol edilir) işaretli olduğu anlamına gelmez.
J Doe,

1
@ J Doe açıklama için teşekkürler!
Arnaud

Yanıtlar:


31

Python , 51 bayt

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

Çevrimiçi deneyin!


Sen saf bir dahisin! Asla düşünmezdims[-8:]
Bay Xcoder

Elbette 'isC'+s[-8:]bir bayttan daha 'isChecked'mı uzun ?
Neil

9
ama 'isChecked ()' den daha kısa 1 bayt
Andrew Smith

Birisi ne s[-8:]olduğunu açıklayabilir mi?
ESR

1
@EdmundReed Her zaman olan girişin son 8 karakterini alır hecked().
xnor

24

Retina , 23 bayt

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

Çevrimiçi deneyin!

açıklama

Unc
!C

Çevirin Uncheckediçine !Checked.

Not
!

Hepsini Notiçine çevir !. Şimdi bir şey olsun !!!is!!!!Checked().

O`is|!

isVeya ile eşleşmenin tüm sıralamalarını sıralayın !. Bu ! < is, !dizenin başlangıcına kadar hareket ettiğinden, yukarıdaki örnek olur !!!!!!!isChecked().

!!

!Tekrarlanan olumsuzlamayı iptal etmek için çiftlerini kaldırın .



13

Python , 43 bayt

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

Dizgeyi alan ve dizgeyi sdöndüren adsız bir işlev .

Çevrimiçi deneyin!

Gerek zaman karakterlerin varlığını denetlemek için !, Notve Untam olarak bir tek ordinal var (ve tüm cve Cher ikisi de garip), bu yüzden sadece sıra sayılarını Özetle ve bir karar vermek için, değer modulo 2 kullanmayın !ya da değil.

Bunun dışında form daha iyi bir şey bulamadığım için xnor'ın cevabıyla aynı . Aşağıdakiler 43:

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

10

JavaScript (ES6), 51 50 bayt

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

Bakarak Works !, Nve ndenetlenen durumu tersine çevirmek karakterler. splitvarsayılan olarak tek bir dizi uzunluğu döndürür, bu yüzden uzunluk !ne kadarsa o zaman ekleriz split. Düzenleme: @ETHproductions sayesinde 1 bayt kaydedildi. 50 bayt için alternatif versiyon:

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

Huh, şimdi geri dönüp diğer cevaplara bakıyorum, hepsi bunu yapıyor.
Neil

Bir baytı kurtarmak için genel bayrağını RegEx'ten bırakabilmelisiniz.
Shaggy

@Shaggy Aslında benim boyum doğru, sadece gson düzenlemede kaldırılamadı .
Neil

1
Sanırım bir bayt kurtarabilirsin/!|N/i
ETHproductions

@ETHproductions Ben değiştirici /!|N/olmadan demek istediğini düşünüyorumi
SplittyDev


7

Java 7, 100 77 bayt

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

bunların açıklaması:

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

Test kodu:

Burada dene.

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

Çıktı:

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

7

Aseto , 49 bayt

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

yadda yadda Hilbert eğrisi.

Her şeyden önce, yığındaki üç önemli karakteri itiyoruz:

!'
'N'U

Sonra bir yakalama işareti belirledik ve tek bir karakter okuyarak başlayalım. Onu dçoğaltırız ve reddederiz ve eğer bunun sonucu doğruysa (eğer dizge boşsa; giriş biterse), sonuna atlarız:

;`
d!
,@

Giriş karakterinin kalan kopyasıyla, yığının geri kalan kısmında yer alıp almadığını kontrol ederiz (yani eğer!, N, U ise). Olmazsa, bir hata daha yaratırız, bizi başka bir karakter okuduğumuz yerdeki yakalama işaretine geri atarız:

&c
`!

Aksi takdirde, hızlı depolama alanını yükleriz (temelde boş bir dize olan bir kayıt; sahtedir), dikkate almaz ve hızlı depolamaya geri göndeririz, sonra hatayı da yükseltiriz (okuma karakterlerine geri dönersek):

&M
L!

Giriş durduğunda, sonuna kadar gönderilir. Burada, yönü tersine çevirir, ünlem işareti iter ve hızlı depolamayı yükler ve olumsuzlarız. Eğer bu gerçek değilse (yani çok sayıda olumsuzlama olayı yaşadık), ittiğimiz ünlem işaretini yazdırırız:

p !'
`!Lu

Son olarak, ipi iki parçaya iter ve yazdırırız (yerden tasarruf için):

"pp"
)(de
  Che"
  sick
   "

Daha sonra, program hala orijinal başlangıcına geri döner, ancak komutların hiçbiri herhangi bir şey çıkarmaz veya döngüsel bir davranışa sahip olmadığından önemli değildir. Aslında, ulaştığımız ilk nonpop komutu, kodun çoğunluğunu atlayarak bir istisna yaratır, çünkü catch işaretine atlarız, yani Aceto'nun o kısımda gördüğü:

&



!' @
'N'U

Yana Uartık tek tırnak karakteri tarafından preceeded değildir ve bu nedenle değişmez bir karakter olarak görmedim, bir komut olarak yorumlanır alır: Uyığın tüm unsurları tersine çevirir (şimdi öyle !, N, U, üstten) ve 'Nve '!daha zorlarsan karakterler, yığınla bittiğimiz anlamına gelir [U, N, !, N, !].

Not: Bu, Aceto'nun yeni editörünün yardımıyla (kısmen) yazılmış ilk Aceto programıdır .


6

C, 78 70 68 Bayt

Teşekkürler Christoph!

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

Çevrimiçi deneyin

Çıktı:

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'u çevirmek için kullanmak c2 bayttan tasarruf sağlar.
Christoph

6

Perl 5 , 31 bayt

@Dom Hastings sayesinde -2 bayt .

30 bayt kodu + -pbayrak.

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

Çevrimiçi deneyin!

y/UN!//yineleme sayısını sayar Un, Notve !. Sonuç, birçok !modülo 2'yi takip ediyor isChecked().


38 bayt için regex'e dayalı başka bir girişimde (Dom Hastings buna 1 bayt kazandırdı):

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

Çevrimiçi deneyin!


İki tane vardır, çünkü düzenli ifade sürümü çalışmıyor cs Unchecked.
Neil

1
@Neil regex yalnızca ilkini değiştirir ( /gbayrak kullanmıyorum çünkü ). Test davaları bana iyi geliyor (TryItOnline bağlantısına bakınız). Yani ne demek istediğini gerçekten anlamadım ...
Dada

Maalesef, regex sürümünüzün çalışmamasının doğru nedeni, ciçinde Uncheckedde bir tane olmasına rağmen, içinde bir tane olmasına rağmen, Checkedonu değiştirdiğinizde CheCked.
Neil

1
Hey, umarım iyisindir! Bir süredir burada değildim, ancak bunlardan ilkinde -2, ikincisinde -1
Dom Hastings

1
@DomHastings Hey! Müthiş, çok teşekkürler! Sizi tekrar gördüğüme sevindim :-)
Dada

6

Scala , 39 30 bayt

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

Çevrimiçi deneyin!

Ne yazık ki s türünü belirlemek için bulamadım.

Düzenleme: Tür bildirimini başlığa getirdi (geri almazsam izin verildiğini düşünüyorum).





3

Japt , 24 23 bayt

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

açıklama

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

Çevrimiçi deneyin!


1
Bekle ... Nasıl ... Neden ... Büyük / oküçük harfe duyarsız? Bilmiyordum ...
ETHProductions

Ben de bilmiyordum ama "! NU" ile test ettiğimde öğrendim. "İşaretlenmemiş" içindeki küçük harf "n" de kaldı, ben de "U"
Luke

3

PHP (5.5 - 5.6), 52 50 49 Bayt

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

Burada dene .

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

Regex olmadan biraz daha compex alır :) Burada deneyin .

-4 Bytes by @Titus. Ty :)

1
error_reportingvarsayılan değer E_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATED.
Titus

1
@Titus, bir regex mücadelesinde JS'yi yeniyor!
Christoph

$b^=$aÇok güzel bulmak! Bunu, aynı boyutta PHP etiketleri olmadan da yapabilirsiniz.
Titus

1
Önde gelen boşluklara izin verilirse 61 bayt:for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";
Titus

@Titus, bu cevaptan ilham aldığını itiraf etmeliyim .
Christoph

3

Jöle ,  16  15 bayt

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

Dizeyi komut satırı argümanı olarak alan ve sonucu basan tam bir program

Çevrimiçi deneyin!

OSḂ⁾!iṫ-7³ṫṭ⁾sCya OSḂ⁾!iṫ-7³ṫ⁾sC;da her ikisi de 15 için çalışacaktı.

Nasıl?

Python cevabımla aynı fikri kullanıyor, ancak Jelly’de farklı bir !isCveya veya isCbazı basılmış baskılar kullanarak baytları kurtarıyor ...

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

önceki @ 16 bayt 9 (birleştirme ve aynı temel fikirle eşleştirme kullanarak):

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

Ah, kahretsin, mod 2 hilesiyle bir şey yaptığımı sanıyordum. Sonra şunu buldum: PI 18 byte için vardı, belki yardımcı olabilir:OS1&”!x;“isC”;ṫ-7$
Conor O'Brien


2

Sed, 36 Bayt

Diğer tüm doğrudan ikame cevaplarıyla aynı fikir.

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

2

sed, 37 38 bayt

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

-rAnahtar için 37 + 1 :

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

1
Bu son s/c/C/Perl 5 cevabı için sorunlara neden oldu ...
Neil

Evet, s/c/C/"Un" olmayan durumlarda ikinci "c" yi yakalamak gibi görünüyor
Kevin

1
Ayrıca, bırakarak gve s/!!//döngü içinde hareket ettirerek bir bayt kaydedebilirsiniz .
Kevin

2

Mathematica, 82 61 60 Bayt

Küçük ince ayar, bir tane daha ekli işleç eklendi:

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

Önceden:

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

O, N's ve! S sonra mod 2 sayın ve o kadar koy! önünde.

Eski versiyon:

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

2

Excel, 90 bayt

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

2

Windows Toplu İş, 120 bayt

Daha önce 268 257 253 245 239 221 182 176 169 123 bayt

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

Programların tüm değiştirir !INTO N#. Şimdi tüm olumsuzluk işaretleri Çünkü! (Şimdi öyle N#,) Notve Uniçerdiği Nprogramı can görünümü sayar, Nve bir lider belirler !gereklidir.

Program her saydığında bir Nsayaç 5 eklenir. 5 eklemenin nedeni 5 eklerken her alternatif değerin ya 0 ya da 5 ile bitmesidir. Bu değerin tek mi yoksa çift mi olduğunu belirlemek için kullanılabilir. !gerekirse bize ekledi.

Ek olarak, xnor'ın son sekiz karakter numarası kullanılmıştır.


Biri Windows toplu
işinde

Elbette ...... Toplu komut dosyası saçma ....
stevefestl

1

Jelly , 29 28 25 21 bayt

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

Çevrimiçi deneyin!

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

Jonathan Allan sayesinde -4 bayt!
Jonathan Allan sayesinde -4 bayt! (sıkıştırılmış dizeleri kullanarak)


Lynn burada bir modül olarak yapılan arayüzü (say jellyCompress.py), sonra bu ile oluşturulacaktı kaydedin jellyCompress.Compress().string("is").dictionary("Checked").string("()").go(). (Windows cmd kurulumunda çalışıyorsanız ve DejaVu Sans Mono yazı tipine geçin chcp 65001ve karakterleri görüntülemek için Python'u başlatmadan önce kod sayfasını komutla değiştirin )
Jonathan Allan

@JonathanAllan Oh tamam. Teşekkürler!
HyperNeutrino

1

PHP, 55 Bayt

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

Çevrimiçi deneyin!

PHP, 58 Bayt

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

bunun yerine "#[!NU]#"kullanabilirsiniz"#[!N]#i"

Çevrimiçi deneyin!

PHP, 68 Bayt

Regex'siz Sürüm

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

Çevrimiçi deneyin!


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

Ben gelmeden önce tam olarak aynı cevabı verdim count(split()): D @Titus nice idea!
Christoph

1
" !"[$d&1]Önde gelen boşluk tamamsa, başka bir bayt kaydeder. $d^=!trim($c,"UN!")3 bayt kaydeder (çünkü &1artık gerek yok).
Titus

1
@Titus Evet, kendimden daha fazla bilgiye sahip olduğunuzdan bir örnek daha. Teşekkür ve sondaki boşluk sorunu için ben yapmak zorunda "!"[!$d]yerine
Jörg Hülsermann


1

Japt , 19 bayt

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

Çevrimiçi deneyin!

Ambalajsız ve Nasıl Çalışır?

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

Jonathan Allan'ın Python çözümünden elde edilen rakam toplamı hilesini kullanarak .


1

Pascal (FPC) , 119 bayt

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.

Çevrimiçi deneyin!

Neredeyse her cevabın yaptığı yöntemi kullanmak, girdideki karakterlerin kod noktalarını toplamak, ardından toplamın paritesini kontrol etmek.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.