Java é para JavaScript como Car é para Carpet

36

Título roubado inspirado na resposta de Greg Hewgill para Qual é a diferença entre JavaScript e Java?

Introdução

Java e JavaScript são linguagens comumente usadas entre programadores e atualmente são as tags mais populares no Stack Overflow. No entanto, como todos sabemos, além de nomes semelhantes, os dois não têm quase nada em comum.

Em homenagem a um dos debates mais infames da programação, e inspirado pelas minhas recentes frustrações na busca de tags , proponho o seguinte:

Desafio

Escreva um programa que aceite uma string como entrada. Retorne carse a sequência começar com "Java" e não incluir "JavaScript". Caso contrário, retorne carpet.

Exemplo de entrada e saída

carro:

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

tapete:

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

Notas

  • A correspondência de entrada não diferencia maiúsculas de minúsculas
  • Somente as possibilidades de saída devem ser caroucarpet
  • Pontos de bônus imaginários se sua resposta usar Java, JavaScript ou Regex
  • Título alternativo: Java é para JavaScript como ham é para hamster
Stevoisiak
fonte
2
A nova tag de correspondência de padrões precisa de um wiki. Por favor, colabore, se puder
Christopher
2
Dependendo da ordem em que as coisas são feitas, javacarpetpode haver erros que os casos de teste existentes não conseguem.
Raio
17
Se você conseguir imaginary bonus points if your answer uses Java, Javascript, or Regex, isso torna complexo o bytecount dessa solução? ;)
Steadybox
Alternate Title: Java is to JavaScript as ham is to hamsterNa verdade, o "presunto" no "hamster" é conhecido pelo alimento "presunto". O alimento "presunto" é carne de porco, e o termo "hamster" é derivado do animal relacionado, o porquinho-da-índia, cuja carne substituiu a carne de porco em longas viagens marítimas, pois era mais fácil criar animais em um navio.
dotancohen

Respostas:

100

Poliglota Java / JavaScript, 108 107 106 bytes

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

Executar como Java

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

Experimente online!

Nota: não confie no destaque, pois está incorreto. O Java real, corretamente interpretado, se parece com o abaixo, porque \u000Aé interpretado na primeira etapa da compilação como \n, de fato, encerrando o comentário iniciado com a linha comment ( //).

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

Executar como JavaScript

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

Créditos para @CowsQuak para a versão JS.

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

Quantos pontos de bônus imaginários para esta resposta?

-1 byte graças a @Nevay na resposta Java.

Olivier Grégoire
fonte
11
Isso não é competitivo em JavaScript ou Java. Nem estou convencido de que seja um candidato sério, que é um requisito para todos os envios.
Dennis
10
@ Dennis Obrigado por suas informações. No entanto, considero isso uma entrada poliglota. Existe alguma regra contra entradas poliglotas quando elas não são solicitadas explicitamente? Tentei jogar golfe o máximo possível. Por exemplo, tentei juntar as duas expressões regulares, mas não consegui nada mais curto que isso (por causa das duas expressões diferentes, embora semelhantes, e do delimitador). Também é impossível ter a mesma definição de variável porque o JavaScript não permite uma nova linha entre ae =>. Eu tentei ficar no espírito do golfe. Se eu fiz algo errado, por favor me diga?
Olivier Grégoire
24
@Dennis IMHO "Poliglota Java / JavaScript" conta como sua própria linguagem; nesse caso, isso é muito competitivo.
ETHproductions
11
@ OlivierGrégoire Eu não estou dizendo que isso não é uma submissão poliglota muito bem-sucedida, mas é discutível se deve haver submissões poliglotas para desafios que não sejam poliglotas em primeiro lugar. Eles surgiram como parte dos desafios sérios para os competidores, mais do que o desafio exige? discussão, mas acho que não há um consenso claro sobre esse tópico em particular. Pessoalmente, não sou a favor.
Dennis
3
@ Dennis Obrigado por suas idéias, agora entendo o que você quis dizer. Esta resposta deve ser marcada como "não competitiva", de acordo com você? Por outro lado, enquanto não estou falando de todas as respostas poliglotas (esta é a minha primeira vez), esta tem o significado especial de que o desafio fala sobre Java e JavaScript e que os "pontos de bônus imaginários" foram concedidos explicitamente para respostas Java, JavaScript e regex antes de escrever essa resposta. Java e regex podem ser combinados, JavaScript e regex podem ser combinados, por que não todos juntos? De qualquer forma, não me importo de marcar isso como não competitivo.
Olivier Grégoire
17

JavaScript, 50 49 bytes

Economize 1 byte graças a @ValueInk reorganizando a regex

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

Snippet de teste

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

Kritixi Lithos
fonte
Eu estava indo para roubar sua regex, mas que teria feito a minha resposta mais longa: o resposta agradável embora
HyperNeutrino
Agora só precisamos de uma resposta java.
DJMcMayhem
Temos uma resposta Java, mas ... Eu vim para os cerca mesma regex ...
Olivier Grégoire
alternativamente:/^java(?!script)/i
Andrea
11
@ OlivierGrégoire ah, droga, isso parece injusto #
Andrea
15

Java (OpenJDK 8) , 92 82 72 58 57 bytes

s->s.matches("(?i)(?!.*javascript)java.*")?"car":"carpet"

Experimente online!

1 byte salvo graças ao @Nevay !

Olivier Grégoire
fonte
11
Você pode omitir o sinal de intercalação, pois a sequência de caracteres # corresponde às tentativas de corresponder à sequência inteira.
Nevay
11

C (apenas chamadas a serem colocadas), 131 bytes

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

Ele tem seus problemas, mas passa em todos os casos de teste fornecidos :)

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

Pontos de bônus imaginários se sua resposta usar Java, Javascript ou Regex

bem ... não, obrigado

michi7x7
fonte
8

05AB1E , 21 bytes

lD'¦‚å≠sη'îáå*„¾„ƒ´#è

Experimente online!

Erik, o Outgolfer
fonte
2
lD“¦‚“åi“¾„“ë“îá“åi…carë 3 bytes a mais e 1 hora de atraso :(. Bom trabalho.
Magic Octopus Urn
8

Python 2 , 68 bytes

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

Experimente online!

-11 bytes graças a notjagan
-2 bytes graças a Dennis

HyperNeutrino
fonte
@ Justin Isso também. Agradável.
HyperNeutrino
Se você mudar para Python 2, poderá salvar 2 bytes com um programa completo.
Dennis
11
@LukeSawczak Ah, eu nem percebi isso: o PI estava usando Java antes disso e em Java ;é necessário, então, como eu tenho que usá-lo de qualquer maneira, a nova linha é desnecessária: P É por isso que o usei.
HyperNeutrino
4

C #, 80 78 bytes

s=>(s=s.ToLower()).StartsWith("java")&!s.Contains("javascript")?"car":"carpet"
TheLethalCoder
fonte
11
Eu acho que a língua mais legível aqui é C #
sepehr
2
@sepehr Você quer dizer que vê nitidamente com C #. (Faço para obter um bônus para comentários idiotas)
Ray
4

EXCEL Planilhas Google, 89 86 bytes

Economizou 3 bytes graças a Taylor Scott

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

Recebe uma entrada em A1

Explicação

=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.
Marca
fonte
Eu acredito que você pode substituir as Searches com Finds para -2 bytes e que isso poderia ser ainda traduzida para uma fórmula planilha do Google para -3 bytes por não fechar os últimos três parens
Taylor Scott
11
A localização diferencia maiúsculas de minúsculas, a pesquisa não diferencia maiúsculas de minúsculas. Mas esses últimos 3 bytes são uma boa ideia!
Mark
Por que a troca do Excel para o Planilhas Google?
Stevoisiak
2
A remoção dos últimos 3 parênteses salva 3 bytes. O Excel lançaria apenas um erro e os colocaria para você de qualquer maneira.
Mark
3

vim, 58 bytes

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

Experimente online!

Raio
fonte
Eu acho que usar o gcomando pode ser um pouco mais curto, algo assim :g/\cjavascript/d :g!/^\cjava/d icarpet␛:s/pet..*.
21417 Neil
3

Gelatina , 27 bytes

,“Ẋṣ“®Ẓȷ»ŒlwЀ/Ḅn2‘×3“¢Ẹị»ḣ

Experimente online!

Dennis
fonte
3

Retina ,  44  37 bytes

Ai`^(?!.*javascript)java
.+
pet
^
car

Obrigado a @MartinEnder por jogar fora 7 bytes!

Experimente online!

Dennis
fonte
3

Lisp comum, 131 125 bytes

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

Experimente online!

Tamanho reduzido graças ao # n = "truque" do Common Lisp.

Explicação

(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
Renzo
fonte
2

C (tcc), 144 136 bytes

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

Experimente online!

Desenrolado:

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");
}
Steadybox
fonte
1

Excel, 84 bytes

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

Excel VBA, 76 bytes

A função de janela imediata anônima do VBE que leva a entrada do intervalo [A1]e das saídas é car/ carpetstatus para a janela imediata do VBE

Não usa RegExp

?"car"IIf(InStr(1,[A1],"Java",1)*(InStr(1,[A1],"JavaScript",1)=0),"","pet")
Taylor Scott
fonte
11
Bom uso de vba! Eu pensei que uma macro teria sido mais curta. Agora eu tenho provas.
Mark
1

Python 3 , 95 bytes

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

Experimente online!

Sim, poderia ser mais curto, mas eu queria tentar usar uma lambda aninhada!

Kavi
fonte
Sempre bom experimentar :) Note que você pode salvar bytes em torno de operadores como and, or, if,else
Lucas Sawczak
1

Perl , 42 bytes

Eu acredito que a resposta por stevieb tem uma saída incorreta (tentei isso sozinho - ele retorna carro para 'javajavascript'). Isso deve funcionar:

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

Mathematica, 82 bytes

regex

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

JAISBaL , 36 bytes

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

Detalhado / explicação:

# \# 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 foi minha primeira tentativa de projetar uma linguagem de golfe, por isso é bastante peculiar ... não há correspondências ou contém, regex ou outra coisa; portanto, temos que dividir e verificar o comprimento do array resultante ... porque JAISBaL tem uma divisão por -regex ... mas nenhum outro suporte a regex .... por razões.

O Regex roubou emprestado da resposta do @Cows Quack .

Phoenix socrático
fonte
0

Python 2 , 69 bytes

f=input().lower().find
print'car'+'pet'*(f('java')!=~f('javascript'))

Atualmente, 1 byte a mais que a solução mais curta do Python 2.

Experimente online!

Dennis
fonte
0

Perl , 36 bytes

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

Execute-o da seguinte maneira:

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

Lote, 91 bytes

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

Recebe entrada em STDIN. O lote não possui um operador de comparação sem distinção entre maiúsculas e minúsculas, mas possui substituição de sequência sem distinção entre maiúsculas e minúsculas, para que eu possa atribuir um temporário aos quatro primeiros caracteres e depois substituir sem maiúsculas e minúsculas java, o que resultará na sequência vazia. Enquanto isso, caso insensível, substitua o javascript na string original, o que deve mantê-lo inalterado.

Neil
fonte
0

Lua, 96 bytes

function(x)return x:lower():match"^java"and not x:lower():match"javascript"and"car"or"carpet"end
IllidanS4 quer Monica de volta
fonte
0

Perl, 98 84 62 bytes

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

Experimente online!

Graças a bytepusher

Burgan
fonte
Bem vindo ao site! Não conheço nenhum perl, mas parece que há muito espaço em branco que você pode remover. Além disso, se você estiver procurando mais maneiras de reduzi-lo, há várias dicas aqui .
DJMcMayhem
@DJMcMayhem Obrigado, eu acho que toda a lógica pode ser alterado para torná-lo ainda mais curto, mas eu não percebi isso
Burgan
11
Apenas algumas dicas (sem alterar muito a sua solução): você pode substituir return $b;por apenas $b;. Perl sempre retorna a última instrução avaliada. Como não nos importamos com avisos, você pode até soltar o ';' para $b}. Você não precisa dos colchetes em torno do if. Se você usar em ||vez de or, poderá salvar um espaço em branco após a regex.
Bytepusher
11
Você também pode remover o () ao redor do primeiro lc, mas precisará de um espaço depois disso. Se você usar em !~vez da ! =~segunda condição pode ser lc$_[0]!~. `-> sub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}. Usando os ops ternários traz-lo para baixo mais umasub a{$b="car";$b.="pet"if lc$_[0]=~/javascript/||lc$_[0]!~/^java/;$b}
bytepusher
11
Para não esquecer - não há necessidade de lc quando você tiver o regex ignore case switch, desça mais 2 :) $_[0] =~//i||$_[0]!~//i. E, finalmente, por que uma variável? sub a{"car".($_[0]=~/javascript/i||$_[0]!~/^java/i?'pet':'');}deve fazer bem :). E agora: perl será agradável e permitem que você use $ _ [0] w / o especificá-lo (embora não com !~): sub a{"car".(/javascript/i||!/^java/i?'pet':'')}-> 48 :)
bytepusher
0

VM de dardo, 104 bytes 102 bytes

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

Explicação :

Degolfado:

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

Temos nossa função principal usual

Substituímos ppor p[0].toLowerCase();para não precisarmos declarar uma nova variável ( varmais um espaço seria de 4 bytes extras)

Em seguida, procedemos à impressão real

Imprimimos carincondicionalmente e usamos instruções em linha para verificar se é para imprimir petdepois ou não. Se tiver a string 'java' no índice 0 e não tiver 'javascript', não faremos nada (na verdade acrescentamos uma string vazia, mas não tem nenhum efeito) e, caso contrário, acrescentamos pet.

Floco de gelo
fonte
0

Ferrugem, 97 bytes

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

Tenho certeza de que existe uma solução mais curta, mas é a minha primeira tentativa :)

f4bi4n
fonte