Java arabaya halı gibi javascript


36

Başlık çalınmış esinlenerek Greg Hewgill cevabı için JavaScript ve Java arasındaki fark nedir?

Giriş

Java ve JavaScript, programcılar arasında yaygın olarak kullanılan dillerdir ve şu anda Stack Overflow'ta en popüler etiketlerdir. Ancak hepimizin bildiği gibi, benzer isimler dışında, ikisinin de ortak hiçbir yanı yok.

Programlamanın en rezil tartışmalarından birinin şerefine ve etiket arama konusundaki son sıkıntılarımdan ilham alarak aşağıdakileri öneriyorum:

Meydan okuma

Bir dizgeyi girdi olarak alan bir program yazın. carDize "Java" ile başlıyorsa ve "JavaScript" içermiyorsa geri dönün . Aksi takdirde geri dönün carpet.

Örnek Giriş ve Çıkış

araba:

java
javafx
javabeans
java-stream
java-script
java-8
java.util.scanner
java-avascript
JAVA-SCRIPTING
javacarpet

halı:

javascript
javascript-events
facebook-javascript-sdk
javajavascript
jquery
python
rx-java
java-api-for-javascript
not-java
JAVASCRIPTING

notlar

  • Giriş eşleşmesi büyük / küçük harf duyarlı olmamalıdır
  • Yalnızca çıktı için olasılıklar carveyacarpet
  • Cevabınız Java, JavaScript veya Regex kullanıyorsa hayali bonus puanları
  • Alternatif Başlık: Java jambon hamster olduğu gibi JavaScript için

2
Yeni kalıp eşleme etiketinin bir wiki'ye ihtiyacı var. Yapabiliyorsanız lütfen katkıda
Christopher

2
İşlerin yapıldığı sıraya bağlı olarak, javacarpetmevcut test durumlarının yapmadığı hataları yakalayabilir.
Ray,

17
Bunu alırsanız imaginary bonus points if your answer uses Java, Javascript, or Regex, bu tür bir çözümün bytecount karmaşık hale getirir mi? ;)
Steadybox

Alternate Title: Java is to JavaScript as ham is to hamsterAslında, "hamster" içindeki "jambon" yiyecek "jambon" ile aynıdır. Yiyecek "jambon" domuz etidir ve "hamster" tabiri ilgili hayvandan türetilmiştir, etleri hayvanların bir gemide yetiştirilmeleri daha kolay olduğu için etleri uzun deniz gezilerinde domuzların yerine geçmiştir.
dotancohen

Yanıtlar:


100

Java / JavaScript Polyglot, 108 107 106 bayt

//\u000As->s.matches("(?i)(?!.*javascript)java.*"/*
a=>/(?!.*javascript)^java/i.test(a/**/)?"car":"carpet"

Java olarak çalıştır

//\u000As->s.matches("(?i)(?!.*javascript)java.*"/*
a=>/(?!.*javascript)^java/i.test(a/**/)?"car":"carpet"

Çevrimiçi deneyin!

Not: vurguyu yanlış olduğu için güvenmeyin. Düzgün bir şekilde yorumlanan gerçek Java, aşağıdaki gibi görünüyor çünkü \u000Aderlemenin ilk adımında \n, yorum satırındaki yorum ile başlayan fiili olarak bitiyor //.

//
s->s.matches("(?i)(?!.*javascript)java.*"/*
a=>/(?!.*javascript)^java/i.test(a/**/)?"car":"carpet"

JavaScript olarak çalıştır

//\u000As->s.matches("(?i)(?!.*javascript)java.*"/*
a=>/(?!.*javascript)^java/i.test(a/**/)?"car":"carpet"

JS sürümü için @CowsQuak kredileri.

let f=

//\u000As->s.matches("(?i)(?!.*javascript)java.*"/*
a=>/(?!.*javascript)^java/i.test(a/**/)?"car":"carpet"

var a=["java","javafx","javabeans","java-stream","java-script","java-8","java.util.scanner","javascript","java-avascript","javascript-events","facebook-javascript-sdk","javajavascript","jquery","python","rx-java","java-api-for-javascript","not-java"];

for(var s of a) console.log(s.padStart(a.reduce((x,y)=>x.length>y.length?x:y).length) + "=>" + f(s));

Bu cevap için kaç tane hayali bonus puanı?

Java cevabındaki @Nevay sayesinde -1 bayt .


1
Bu, JavaScript veya Java’da rekabetçi değildir. Bunun, tüm gönderimler için bir gereklilik olan ciddi bir rakip olduğu konusunda ikna olmadım.
Dennis,

10
@Dennis Bilgileriniz için teşekkür ederiz. Ancak ben bunu bir polyglot girişi olarak görüyorum. Açıkça istenmediklerinde polyglot girişlerine karşı herhangi bir kural var mı? Bunu olabildiğince golf oynamaya çalıştım. Örneğin, her iki regex'i bir araya getirmeye çalıştım, ancak bundan daha kısa hiçbir şey elde edemedim (iki farklı regex ve sınırlayıcıları nedeniyle). Aynı değişken tanımına sahip olmak da imkansızdır, çünkü JavaScript ave arasında yeni bir satıra izin vermez =>. Golf havasında kalmaya çalıştım. Yanlış bir şey yaptıysam lütfen söyle?
Olivier Grégoire

24
@Dennis IMHO "Java / JavaScript polyglot" kendi dili olarak sayılıyor, bu durumda bu çok rekabetçi.
ETHproductions

1
@ OlivierGrégoire Bunun çok iyi bir poliglot gönderimi olmadığını söylemiyorum, ancak poliglot olmayan gönderilere karşı poliglot gönderimlerinin olması gerektiği tartışmalı. Onlar ciddi yarışmacıların sorduğundan daha fazlasını yapabileceği bir şey olarak geldiler mi? Tartışma, ancak bu konu hakkında net bir fikir birliği olduğunu sanmıyorum. Şahsen ben lehine değilim.
Dennis,

3
@Dennis Anlayışınız için teşekkür ederim, şimdi ne demek istediğinizi anlıyorum. Bu cevap size göre "rekabetçi olmayan" olarak mı işaretlenmeli? Öte yandan, tüm polyglot cevaplarından bahsetmiyorum bile (bu benim birincisi), bu sorunun hem Java hem de JavaScript hakkında konuşmasının ve "hayali bonus puanlarının" açıkça verildiğini belirten özel bir anlamı var. Java için JavaScript ve regex cevapları bu cevabı yazmadan önce. Java ve regex birleştirilebilir, JavaScript ve regex birleştirilebilir, neden hepsi bir arada değil? Her neyse, bunu rekabete aykırı olarak işaretlemeyi umursamıyorum.
Olivier Grégoire

17

JavaScript, 50 49 bayt

Regex yeniden düzenleyerek @ValueInk sayesinde 1 bayt kaydedildi

a=>/javascript|^(?!java)/i.test(a)?"car":"carpet"

Test pasajı

let f=

a=>/javascript|^(?!java)/i.test(a)?"carpet":"car"

var a=["java","javafx","javabeans","java-stream","java-script","java-8","java.util.scanner","java-avascript","javascript","javascript-events","facebook-javascript-sdk","javajavascript","jquery","python","rx-java","java-api-for-javascript","not-java"];

for(var s of a) console.log(s.padStart(a.reduce((x,y)=>x.length>y.length?x:y).length) + "=>" + f(s));



Şimdi sadece bir java cevabına ihtiyacımız var.
DJMcMayhem

Bir Java cevabımız var ama ... kabaca aynı regex'e geldim ...
Olivier Grégoire

alternatif olarak:/^java(?!script)/i
Andrea

1
@ OlivierGrégoire ah, kahretsin, bu haksız görünüyor
Andrea


11

C (yalnızca arama yapan koyarlar), 131 bayt

f(int*s){char r[]="carpet";~*s&'AVAJ'||(r[3]=0);for(;*s&255;*(int*)&s+=1)~*s&'AVAJ'||~s[1]&'IRCS'||~s[2]&'TP'||(r[3]='p');puts(r);}

Sorunları var ama verilen tüm testlerden geçiyor :)

g(int* s)
{
  char r[] = "carpet";
  ~*s&'AVAJ' || (r[3]=0);
  for(;*s & 255; *(int*)&s +=1)
    ~*s&'AVAJ' || ~s[1]&'IRCS' || ~s[2]&'TP' || (r[3]='p');
  puts(r);
}

Cevabınız Java, Javascript veya Regex kullanıyorsa hayali bonus puanları

iyi ... hayır, teşekkürler



8

Python 2,68 bayt

k=input().lower();print'car'+'pet'*(k[:4]!='java'or'javascript'in k)

Çevrimiçi deneyin!

-Jagan olmayanlar için 11 byte
- Dennis sayesinde 2-byte




@ Justin Bu da. Güzel.
HyperNeutrino,

Python 2'ye geçerseniz, tam bir programla 2 bayt kaydedebilirsiniz.
Dennis,

1
@LukeSawczak Oh: Bunun farkında bile değildim: PI bundan hemen önce Java kullanıyordu ve Java'da ;gerekliydi, bu yüzden onu kullanmak zorunda olduğum için newline gerekli değildi: P Bu yüzden kullandım.
HyperNeutrino

4

C #, 80 78 bayt

s=>(s=s.ToLower()).StartsWith("java")&!s.Contains("javascript")?"car":"carpet"

1
Bence en okunaklı dil C #
sepehr 14:17

2
@sepehr C # ile keskin gördüğünüzü kastediyorsunuz. (Salak yorumlarınız için ikramiye alır mıyım)
Ray

4

EXCEL Google Sayfaları, 89 86 Bayt

Taylor Scott sayesinde 3 bayt kurtardı

=LEFT("carpet",6-3*ISERR(SEARCH("javascript",A1))+3*ISERR(IF(SEARCH("java",A1)=1,1,1/0

A1'de bir girdi alır

açıklama

=LEFT("carpet",6-3*ISERR(SEARCH("javascript",A1))+3*ISERR(IF(SEARCH("java",A1)=1,1,1/0)))

 SEARCH("javascript",A1)        #Case-Insensitive Find, returns error if not found  
 ISERR(                         #Returns string true if error, False if not
 3*ISERR(                       #Forces TRUE/False as integer, multiplies by 3
 IF(SEARCH("java",A1)=1,1,1/0)  #If java found, returns integer. if 1, java begins string
                                #so returns 1, which will be turned into 0 by iserr.
                                #Else returns 1/0, which will be turned into 1 by iserr.
 LEFT(                          #Returns digits from the left, based upon count.

Ben değiştirmek inanıyoruz Searchile es Findiçin -2 bayt s ve o başka bir google yaprak formülü için -3 çevrilmiş olabileceğini bayt son üç parens kapatarak vermeyerek
Taylor Scott

1
Bul büyük / küçük harfe duyarlıdır, arama büyük / küçük harfe duyarsızdır. Ama bu son 3 byte iyi bir fikir!
Mark,

Neden Excel’den Google e-tablolarına geçilir?
Stevoisiak

2
Son 3 parenin çıkarılması 3 bayttan tasarruf sağlar. Excel bir hata atar ve onları zaten sizin için kullanır.
Mark

3

vim, 58 bayt

gUU:s/.*JAVASCRIPT.*/Q/g
:s/^JAVA.*/car
:s/[A-Z].*/carpet

Çevrimiçi deneyin!


Bence gkomutu kullanmak biraz daha kısa olabilir :g/\cjavascript/d :g!/^\cjava/d icarpet␛:s/pet..*.
Neil,




3

Ortak Lisp, 131 125 bayt

(lambda(s)(format()"car~@[pet~]"(or(<(length s)4)(not(#1=string-equal"java"(subseq s 0 4)))(search"javascript"s :test'#1#))))

Çevrimiçi deneyin!

Common Lisp'in # n = “numarası” sayesinde boyut küçültülmüş .

açıklama

(lambda (s)                 ; anonymous function
  (format                   ; use of format string to produce the result
    ()                      ; the result is a string
    "car~@[pet~]"           ; print "car", then print "pet" when:
    (or (< (length s) 4)    ; the string is less then 4 characters or
        (not (string-equal "java" (subseq s 0 4)))     ; does not start with java or
        (search "javascript" s :test 'string-equal)))) ; contains javascript

2

C (tcc), 144 136 bayt

a;f(s){char*t=s;for(;*t;a=!strncmp(s,"java",4))*t=tolower(*t++);for(t=s;*t;)s=strncmp(t++,"javascript",10)&&s;puts(a*s?"car":"carpet");}

Çevrimiçi deneyin!

unrolled:

a;
f(s)
{
    char *t = s;
    for (; *t; a = !strncmp(s, "java", 4))
        *t = tolower(*t++);
    for (t=s; *t;)
        s = strncmp(t++, "javascript", 10) && s;
    puts(a*s ? "car"  :"carpet");
}

1

Excel, 84 bayt

="car"&IF(AND(ISERR(SEARCH("javascript",A1)),IFERROR(SEARCH("java",A1),2)=1),,"pet")

1

Excel VBA, 76 Bayt

Menzilde girdi [A1]ve çıktı alan anonim VBE acil pencere işlevi VBE acil durum penceresine car/ carpetdurumudur

RegExp kullanmaz

?"car"IIf(InStr(1,[A1],"Java",1)*(InStr(1,[A1],"JavaScript",1)=0),"","pet")

1
Vba güzel kullanımı! Bir makronun daha kısa olacağını düşündüm. Şimdi elimde kanıt var.
Mark

1

Python 3 , 95 bayt

g=lambda s:(lambda r:'car' if r[:4]=='java' and 'javascript' not in r else 'carpet')(s.lower())

Çevrimiçi deneyin!

Evet, daha kısa olabilirdi ama iç içe lambda kullanmayı denemek istedim!


Deneme Her zaman iyi :) operatörleri gibi etrafında bayt kurtarabilir Not and, or, if,else
Luke Sawczak

1

Perl , 42 bayt

Stevieb'in cevabının yanlış çıktı olduğuna inanıyorum (kendim denedim - o 'javajavascript' için arabayı döndürür). Bu çalışmalı:

say/^java/i&&!/javascript/i?'car':'carpet'

0

Mathematica, 82 bayt

regex

If[#~StringMatchQ~RegularExpression@"(?i)(?!.*javascript)^java.*","Car","Carpet"]&

0

JAISBaL , 36 bayt

℠℘(?!.*javascript)^java.*}͵Ucar½Upet

Ayrıntılı / açıklama:

# \# enable verbose parsing #\
tolower                           \# [0] convert the top value of the stack to lowercase #\
split (?!.*javascript)^java.*}    \# [1] split the top value of the stack by (?!.*javascript)^java.*} #\
arraylength                       \# [2] push the length of the array onto the stack #\
print3 car                        \# [3] print car #\
!if                               \# [4] if the top value on the stack is falsy, skip the next statement #\
print3 pet                        \# [5] print pet #\

JAISBaL bir golf dili tasarlamadaki ilk girişimdi, bu yüzden oldukça ilginç ... eşleşme veya içerik yok, regex veya başka bir şey var, bu yüzden sonuçta elde edilen dizi uzunluğunu bölmek ve kontrol etmek zorundayız ... -regex ... ama başka regex desteği yok .... çünkü sebepler.

Regex çalınan @Cows Quack'in cevabından ödünç alındı .



0

Perl , 36 bayt

say/^java(?!script)/i?"car":"carpet"

Gibi çalıştırın:

perl -nE 'say/^java(?!script)/i?"car":"carpet"' java.txt

0

Toplu iş, 91 bayt

@set/ps=
@set t=%s:~0,4%
@if "%t:java=%%s:javascript=%"=="%s%" (echo car)else echo carpet

STDIN'de girişi ele alır. Toplu büyük / küçük harf duyarlı bir karşılaştırma işlecine sahip değildir, ancak büyük küçük harf duyarsız dize değiştirme özelliğine sahiptir, böylece ilk dört karaktere geçici olarak atayabilirim ve sonra boş dize ile sonuçlanacak şekilde java'yı duyarsız biçimde değiştirebilirim. Bu arada, orijinal dizgede javascript'i duyarsızca değiştiriyorum, bu da değişmeden bırakmalı.



0

Perl, 98 84 62 Bayt

sub a{"car".($_[0]=~/javascript/i||$_[0]!~/^java/i?'pet':'');}

Çevrimiçi deneyin!

Bytepusher sayesinde


Siteye Hoşgeldiniz! Perl bilmiyorum, fakat kaldırabileceğiniz çok fazla boşluk var gibi görünüyor. Ayrıca, kısaltmak için daha fazla yol arıyorsanız, burada bir sürü ipucu var .
DJMcMayhem

@DJMcMayhem Teşekkürler, sanırım bütün mantığın daha da kısalması için değiştirilebileceğini düşünüyorum, ancak çözemedim
Burgan

1
Sadece (çok fazla çözümünüzü değiştirmeden) bazı ipuçları: Sen yerini alabilir return $b;sadece birlikte $b;. Perl her zaman en son değerlendirilen ifadeyi döndürür. Uyarıları önemsemediğimiz için, ';' için $b}. Eğer etrafında parantez gerekmez. ||Bunun yerine kullanırsanız or, regex'ten sonra bir boşluk bırakabilirsiniz.
bytepusher

1
İlk lc'nin etrafındaki () işaretini de çıkarabilirsiniz, ancak sonra da bir boşluk gerekir. İkinci koşul !~yerine kullanırsanız ! =~olabilir lc$_[0]!~. `-> sub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}. Üçlü sub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}
op'ları

1
Unutulmaması gereken - regex varken durum anahtarını yoksaydığınızda, lc'ye gerek yok, başka 2 :) $_[0] =~//i||$_[0]!~//i. Ve nihayet, neden bir değişken? sub a{"car".($_[0]=~/javascript/i||$_[0]!~/^java/i?'pet':'');}iyi yapmalı :). Ve şimdi: perl güzel olacak ve belirtmeksizin $ _ [0] kullanmanıza izin verecek (olmasa da !~): sub a{"car".(/javascript/i||!/^java/i?'pet':'')}-> 48 :)
bytepusher 16:17

0

Dart VM, 104 bayt 102 bayt

main(p){p=p[0].toLowerCase();print("car${p.indexOf('java')==0&&p.indexOf('javascript')<0?'':'pet'}");}

Açıklama :

Degolfed:

main(p)
{
    p = p[0].toLowerCase();
    print("car${p.indexOf('java') == 0 && p.indexOf('javascript') < 0 ? '' : 'pet'}");
}

Her zamanki ana işleve sahibiz

Biz değiştirmek pile p[0].toLowerCase();yeni bir değişken bildirmek zorunda kalmamak için ( varartı bir boşluk 4 ekstra bayt olacaktır)

Daha sonra gerçek baskı işlemine devam ediyoruz

carKoşulsuz yazdırıyoruz ve petsonrasında yazdırılıp yazdırılmayacağını kontrol etmek için satır içi ifadeler kullanıyoruz . 0 dizininde 'java' dizesi varsa ve içinde 'javascript' yoksa, hiçbir şey yapmayız (aslında boş bir dize ekleriz, ancak herhangi bir etkisi yoktur) ve aksi takdirde ekleriz pet.


0

Pas, 97 bayt

let s=if Regex::new(r"^javascript|^!java$").unwrap().is_match("javascript"){"carpet"}else{"car"};

Daha kısa bir çözüm olduğuna eminim ama bu benim ilk denemem :)


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.