Brincando com a tartaruga musical


20

Meus dois filhos gostam de brincar com o seguinte brinquedo:

Tartaruga

As áreas coloridas com as formas internas podem ser tocadas e a tartaruga ilumina a área e emite um som ou diz o nome da cor ou da forma interna. O botão do meio altera o modo. Há um modo no qual as áreas tocam notas musicais diferentes quando tocadas, com um toque: se a criança tocar três áreas consecutivas no sentido horário, uma melodia especial 1 é tocada. Se as três áreas consecutivas tocadas forem colocadas no sentido anti-horário, uma melodia especial 2 será tocada.

O desafio

Vamos simular a lógica interna do brinquedo. Dada uma sequência com três pressionamentos do garoto, retorne dois valores distintos e coerentes se os três pressionamentos forem para áreas consecutivas (sentido horário ou anti-horário) e um terceiro valor distinto, se não estiverem.

Detalhes

  • As áreas de entrada serão nomeadas com um caractere cada, que pode ser sua cor: ROYGBpara vermelho, laranja, amarelo, verde e azul; ou sua forma: HSRTCpara coração, quadrado, estrela ( R), triângulo e círculo. Caso não importa, você pode optar por trabalhar com entrada e saída apenas em maiúsculas ou minúsculas.
  • O programa receberá uma string (ou array de caracteres ou qualquer outra coisa equivalente) com três pressionamentos. Exemplos (usando as cores): RBO, GYO, BBR, YRG, YGB, ORB...
  • O programa produzirá três valores coerentes e distintos para representar os três resultados possíveis: um primeiro valor se a combinação não acionar uma melodia especial, um segundo valor se a combinação acionar a melodia especial no sentido horário e um terceiro valor se a combinação acionar o melodia especial no sentido anti-horário. Exemplo: 0para nenhuma combinação especial, 1para a melodia desencadeada por uma combinação no sentido horário e -1para a melodia desencadeada por uma combinação no sentido anti-horário.
  • Você não precisa se preocupar em lidar com entradas incorretas.

Casos de teste

Input   Output      // Input based on colors
--------------
RBO     0           // No special combination
GYO     -1          // Counterclockwise melody triggered
BBR     0           // No special combination
YRG     0           // No special combination
YGB     1           // Clockwise melody triggered
ORB     -1          // Counterclockwise melody triggered
OOO     0           // No special combination
BRO     1           // Clockwise melody triggered

Este é o , portanto, pode ganhar o código mais curto para cada idioma!


É [0,0], [1,0], [0,1]permitido como saída? Vejo a resposta do Mathematica fazendo isso e economizaria 3 bytes na resposta 05AB1E.
21718 Kevin Kurtijssen

1
@KevinCruijssen, é claro que você pode. Os valores de saída podem ser qualquer coisa, desde que sejam distintos e consistentes.
23418 Charlie

Respostas:


12

Java 8, 48 39 33 bytes

s->"ROYGBRO BGYORBG".indexOf(s)|7

-6 bytes graças a @RickHitchcock , por isso não deixe de votar também !

Toma cor maiúscula como String de entrada. Saídas -1para none, 7no sentido horário e 15no sentido anti-horário.

Experimente online.

Explicação:

s->      // Method with String parameter and integer return-type
   "ROYGBRO BGYORBG".indexOf(s)
         //  Get the index of the input in the String "ROYGBRO BGYORBG",
         //  which will result in -1 if the input is not a substring of this String
    |7   //  Then take a bitwise-OR 7 of this index, and return it as result

Resposta antiga de 39 bytes:

s->(char)"ROYGBRO BGYORBG".indexOf(s)/7

Toma cor maiúscula como String de entrada. Saídas 9362para none, 0no sentido horário e 1no sentido anti-horário.

Experimente online.

Explicação:

s->      // Method with String parameter and integer return-type
   (char)"ROYGBRO BGYORBG".indexOf(s)
         //  Get the index of the input in the String "ROYGBRO BGYORBG",
         //  which will result in -1 if the input is not a substring of this String
         //  And cast it to a char (-1 becomes character with unicode value 65535)
    /7   //  Integer-divide it by 7 (the char is implicitly converted to int doing so)

2
Eu acho que 9632 é o melhor valor distinto e consistente que eu vi nestas respostas até agora :)
Misha Lavrov

@MishaLavrov Também poderia ser 10922(divisão inteira por /6) ou 8191(divisão inteira por /8), mas eu escolho /7porque é o índice do espaço na String. :)
Kevin Cruijssen

1
@RickHitchcock Thanks! Eu pensei que eu tinha tentado algumas operações bit a bit, mas aparentemente não devidamente suficiente ..
Kevin Cruijssen

6

JavaScript (ES6), 41 bytes

Toma as iniciais coloridas como entrada. Retorna 2para none, trueno sentido horário ou falseno sentido anti-horário.

s=>~(x='ROYGBRO_ORBGYOR'.search(s))?x<5:2

Experimente online!


3
Pelo menos uma resposta de Arnauld eu posso entender! :)
Charlie

3
@ Charlie Eu acho que Arnauld está doente ou algo assim .. Não é apenas a resposta dele legível e fácil de entender, é ainda mais do que a minha resposta Java! o.Ô Algo está claramente errado aqui. ; p
Kevin Cruijssen

s=>('ROYGBRO_ORBGYOR'.search(s)+8)/8|0
L4m2 23/10/19

1
Você até royg, mano?
Quentin

6

Python 2 , 36 bytes

lambda i:'ROYGBRO ORBGYOR'.find(i)/7

-1- Nenhuma
0- No sentido horário
1- No sentido anti-horário

Experimente online!


Heh, grandes mentes (ou alguma coisa) ... codegolf.stackexchange.com/a/174635/53748 (se eu tinha visto isso antes de tentar coisas eu mesmo, eu tinha acabado de ter-lhe dado o byte save: p)
Jonathan Allan

@ JonathanAllan Não se preocupe, as coisas acontecem: D Eu votei na sua resposta, pois não posso gostar dela!
Dead Possum

5

Excel, 29 bytes

=FIND(A1,"ROYGBRO_RBGYORB")<6

Cores maiúsculas como entrada.

Retorna #VALUE!para nenhum padrão, TRUEno sentido horário, no sentido FALSEanti-horário.

Pode quebrar IFERROR( ,0)para +11 byteslidar com exceção e retornar '0' para casos sem padrão.


5

05AB1E , 15 11 bytes

Economizou 4 bytes graças a Kevin Cruijssen e Magic Octopus Urn .

Usa formas.
Saída [0, 0]para nenhuma , [1, 0]para a direita e [0, 1]para a esquerda

‚.•ÌöJη•så

Experimente online! ou como um conjunto de testes

Explicação

‚            # pair the input with its reverse
  .•ÌöJη•     # push the string "hsrtchs"
         så   # check if the input or its reverse is in this string

1
Muito semelhante como a minha resposta de 15 bytes que eu estava prestes a mensagem: .•1´₃éC•Â‚εXå}¥resultando em [0], [1]ou [-1], então um de mim. Btw, eu acho que (não tenho certeza), você pode salvar três bytes, removendo os últimos três, saída [0, 0], [1, 0]e [0, 1]como valores distintos. Vejo que a resposta do Mathematica faz o mesmo. Solicitará à OP a verificação.
21718 Kevin Kurtijssen

Apenas perguntei ao OP e, de fato, você tem permissão para descartar os últimos três bytes. Desde que as três saídas sejam consistentes e distintas, tudo bem, seja o que for.
Kevin Cruijssen

2
‚.•ÌöJη•såé de 11 bytes se [1,0], [0,1] and [0,0]for considerado único (a menos que eu esteja perdendo algo óbvio aqui, a adição ƶOao final desse 11 byter ainda é 13 para a mesma resposta 0, 1, 2 que você tem agora). Casos de teste . Casos de teste 2 . A inversão de pedidos elimina a necessidade do loop.
Magic Octopus Urn

De acordo com o comentário no tópico original, o 11-byter deve ser bom, pois usa 3 valores distintos, você pode vencer o Jelly com esse :).
Magic Octopus Urn

@KevinCruijssen Thank you! Eu sempre parecem pensar da única como "um dígito" sem motivo :)
Emigna

4

JavaScript (ES6), 32 bytes

s=>'ROYGBRO_ORBGYOR'.search(s)|7

Retorna -1 se não houver combinação, 15 se for no sentido anti-horário, 7 se for no sentido horário.


4

Wolfram Language (Mathematica) , 42 36 bytes

{"ROYGBRO","ORBGYOR"}~StringCount~#&

Experimente online!

Conta o número de vezes que a entrada aparece em ambos "ROYGBRO"e "ORBGYOR". Retorna {1,0}no sentido horário, {0,1}no sentido anti-horário e {0,0}sem combinação especial.

Com o custo de apenas mais um byte, podemos obter resultados de 0graça, 1no sentido horário e 2no sentido anti-horário "ROYGBRO.ORBGYORBGYOR"~StringCount~#&.


4

código de máquina x86, 39 36 bytes

00000000: f30f 6f11 b800 0000 0066 0f3a 6310 0c89  ..o......f.:c...
00000010: c883 c807 c352 4f59 4742 524f 2042 4759  .....ROYGBRO BGY
00000020: 4f52 4247                                ORBG

Montagem:

section .text
	global func
func:					;the function uses fastcall conventions
					;no stack setup needed because we don't need to use stack
	movdqu xmm2,[ecx]		;Move DQword (16 bytes) from 1st arg to func(ecx) to SSE reg
	mov eax, msg			;Load address of constant str 'msg' into eax
	PcmpIstrI xmm2, [eax], 1100b	;Packed Compare String Return Index, get idx of [eax] in xmm2
	mov eax, ecx			;Move returned result into reg eax
	or eax, 7			;Bitwise OR eax with 7 to get consistent values
	ret				;return to caller, eax is the return register
section .data
	msg db 'ROYGBRO BGYORBG'

Experimente online!

A saída é 23para none, 7no sentido horário e 15no sentido anti-horário. Com base na resposta de @RickHitchcock.

Salva 3 bytes usando uma instrução de comparação de cadeias SSE em vez de usar libc.


1
Você pode contar os bytes do código da máquina aqui, já que esses bytes dependem do plafement de strstr no binário? Você não pode simplesmente pegar esses mesmos bytes em outro contexto e esperar que eles funcionem da mesma forma.
Robert Fraser

Existem substituições de código de máquina puros que dont contar com a biblioteca padrão strchr.com/strcmp_and_strlen_using_sse_4.2
Robert Fraser

@RobertFraser O posicionamento da função é resolvido durante o vínculo, a contagem de bytes sempre será a mesma porque o endereço da função strstrsempre será um endereço de 32 bits (4 bytes). O código da máquina na minha postagem está desvinculado.
Logern

1
Eu acho que é uma espécie de área cinzenta. A função depende de dados no arquivo de objeto (mapa do vinculador) antes de poder ser usado. Mas você pode argumentar que não é diferente de um lambda Java que precisa de uma declaração de tipo.
Robert Fraser

Observe que, para ser totalmente compatível com a ABI, é necessário usar xmm5 ou xmm6, que são registros salvos por chamadores, em vez de xmm2, que é salvo por chamada (mas que não deve custar bytes).
Robert Fraser


3

APL (Dyalog), 22 18 bytes

+/(⍷-⍷∘⌽)∘'ROYGBRO'

-4 bytes graças a @ngn

Toma uma sequência de iniciais de cores. Saídas 0 para nenhum padrão especial, -1 no sentido anti-horário, 1 no sentido horário.

Experimente online!


3

Python 2 , 45 43 bytes

lambda i,a='ROYGBRO':(i in a)-(i[::-1]in a)

Experimente online!

Com idéias e crédito sério para @DeadPossum

-2 com agradecimentos a @JoKing. Agora gera -1 = no sentido anti-horário, 0 = nenhum, 1 = no sentido horário.

Meu esforço original está abaixo para fins históricos.

Python 2 , 52 51 bytes

lambda i,a='ROYGBRO':((0,1)[i[::-1]in a],2)[i in a]

Experimente online!

0 = nenhum, 1 = no sentido anti-horário, 2 = no sentido horário



@DeadPossum Isso é muito legal e diferente do meu para você postar como sua própria resposta. Eu vou votar.
ElPedro 23/10

3

Python 2 ,  35  36 bytes

+1 - por algum motivo, pensei que todos os botões fossem distintos> _ <

Desenvolvido independentemente do que eu acabei de ver (e agora votado) por Dead Possum

lambda s:'ORBGYO.BROYGBR'.find(s)/7

Experimente online!


Eu acho que você precisa separar as seqüências de caracteres. Isso retorna 0 (no sentido anti-horário) para "RBR", que não está na sua lista de combinações.
21718 Rick Stallone /

@ RickHitchcock ah, eu tinha assumido 3 impressoras diferentes, o que certamente está incorreto. Isso tornará isso efetivamente exatamente o mesmo que o Dead Possum!
Jonathan Allan

Não é possível excluir do celular ... excluirá ou endereçará mais tarde #
Jonathan Allan

Sim, pode ser ambíguo, mas um dos casos de teste ("OOO") mostra que eles podem se repetir.
21718 Rick

@ RickHitchcock sim, foi o que vi depois do seu comentário - obrigado!
Jonathan Allan

2

Stax , 14 13 bytes

ù♀e▌d─█£F'♦O▬

Execute e depure

A saída é

  • 1 para nenhuma combinação especial
  • 2 para melodia no sentido anti-horário
  • 3 para melodia no sentido horário

2

Pip , 19 bytes

Y"ROYGBRO"OaNyaNRVy

Saídas 10para sentido horário, sentido 01anti-horário, 00para nenhum dos dois. Experimente online!

Explicação

                     a is 1st cmdline argument
Y"ROYGBRO"           Yank that string into y variable
           aNy       Count of occurrences of a in y
          O          Output without newline
                RVy  y reversed
              aN     Count of occurrences of a in that string
                     Print (implicit)

2

J , 21 bytes

-&(OR@E.&'ROYGBRO')|.

Experimente online!

Como funciona

-&(OR@E.&'ROYGBRO')|.  Monadic 2-verb hook. Input: a string.

                   |.  Map over [input string, input string reversed]:
      E.&'ROYGBRO'     Find exact matches of input in 'ROYGBRO'
  (OR@            )    Reduce with OR; is it a substring of 'ROYGBRO'?
-&                     Reduce with -; result is 1 for CW, -1 for CCW, 0 otherwise

Atinge a quantidade máxima de reutilização de função.



1

R , 38 bytes

grep(scan(,''),c('ROYGBRO','ORBGYOR'))

Experimente online!

Devoluções:

  • Nenhuma combinação especial: integer(0)
  • Melodia no sentido anti-horário acionada: 2
  • Melodia no sentido horário acionada: 1

1

Carvão , 18 bytes

≔ROYGBROηI⁻№ηθ№⮌ηθ

Experimente online! Link é a versão detalhada do código. Explicação:

 ROYGBRO            Literal string
≔       η           Assign to variable
            η   η   Value of variable
               ⮌    Reversed
             θ   θ  Input string
           №  №     Count matches
          ⁻         Subtract
         I          Cast to string
                    Implicitly print


1

Limpo , 63 bytes

import StdEnv,Text
$s=map((>)0o indexOf s)["ROYGBRO","BGYORBG"]

Experimente online!

[True, True]sem ruídos especiais, [True, False]no sentido anti-horário, [False, True]no sentido horário.


0

Japonês, 17 14 bytes

Pega as cores como entrada, em minúsculas. Retorna 0no sentido horário, 1no sentido anti-horário ou -1se não houver combinação.

`ygß`ê qÔbøU

Tente


Expanação

`...`            :Compressed string "roygbrow"
     ê           :Palindromise
       qÔ        :Split on "w"
         b       :Index of the first element
          ø      : That contains
           U     :  The input string

0

Ruby , 53 36 bytes

->n{"\a\fDch+".index(""<<n%111)&./3}

Experimente online!

Entrada: um número inteiro de 3 dígitos, em que os dígitos representam cores:

  • 1 - vermelho
  • 2 - laranja
  • 3 - amarelo
  • 4 - verde
  • 5 - azul

Saída: 0 no sentido horário, 1 no sentido anti-horário, nilcaso contrário.


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.