Extensão do jogo dos setes


8

Introdução

Produza todos os números em uma base específica que apareceriam em uma versão adaptada do jogo dos sete.

Desafio

Sua tarefa é produzir todos os números em uma determinada base em um determinado intervalo, ignorando os que correspondem a determinadas condições.

Você receberá quatro entradas: base elim starte end. Os papéis das quatro variáveis ​​são os seguintes:

  • baseespecifica qual base estamos usando para as outras três variáveis ​​e também para saída. Uma maneira de expressá-lo é usar um único caractere que seja '8', '9' ou uma letra maiúscula de 'A' a 'Z', usando 'A' para o sistema decimal e 'G' para o sistema hexadecimal. As bases que devem ser apoiadas são de 8 a 35 (inclusive). Esta é apenas a minha maneira sugerida de expressar o basee vou usá-lo na seção Exemplo de entrada e saída , mas também é bom usar o seu próprio modo de expressá-lo. Por exemplo, você pode optar por formatar basecomo sua representação decimal usual.

  • starte endsão duas cadeias que especificam o intervalo de números a serem emitidos, expresso no dado base. Se baseé Ge starté 10e endé 1F, você precisa produzir 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F, mas também precisa eliminá-los com base no que elimé, a ser explicado em breve.

  • elimé um caractere único e deve ser um dígito válido no dado base. Todos os números que contêm o dígito elimou múltiplos de elimdevem ser eliminados da lista para gerar a saída final.

No caso acima, se elimfor 7, 17precisará ser eliminado porque contém o dígito 7. 15e 1Ctambém precisam ser eliminados porque são múltiplos de 7. Portanto, a saída final seria10 11 12 13 14 16 18 19 1A 1B 1D 1E 1F

Casos de teste

Input -> Output

G,7,10,1F -> 10 11 12 13 14 16 18 19 1A 1B 1D 1E 1F
A,3,1,100 -> 1 2 4 5 7 8 10 11 14 16 17 19 20 22 25 26 28 29 40 41 44 46 47 49 50 52 55 56 58 59 61 62 64 65 67 68 70 71 74 76 77 79 80 82 85 86 88 89 91 92 94 95 97 98 100
G,A,96,C0 -> 97 98 99 9B 9C 9D 9E 9F B0 B1 B2 B3 B5 B6 B7 B8 B9 BB BC BD BF C0

O terceiro caso de teste é adicionado após a postagem original. Todas as respostas postadas antes da edição foram testadas e passaram no terceiro teste.

Especificações

  • A entrada sempre será válida, portanto, não se preocupe com o tratamento de exceções.

  • Isso é , o menor número de bytes vence.

  • Você pode receber e fornecer saída através de qualquer formulário padrão e pode escolher o formato.

  • Como sempre, as brechas padrão se aplicam aqui.

  • Isso é baseado na versão real do jogo dos setes .

  • Eu preciso baseter pelo menos 8 anos devido ao gosto pessoal. Só não quero ver o número de dígitos na sequência crescer muito rápido.

Placar

Snippet retirado desta pergunta . Execute o trecho para obter o placar.


11
Bem-vindo ao PPCG! Este é um bom primeiro post, mas tenho algumas recomendações: Evite formatos de entrada / saída muito estritos ( base,elim,start,end, 'A' para sistema decimal , 'G' para sistema hexadecimal ), tente formatar seus casos de teste de uma maneira fácil de use e considere usar o Sandbox para receber feedback antes de postar no site principal. No geral, este é um bom primeiro desafio!
Sr. Xcoder

1
@WeijunZhou Claro, vou tentar dar uma olhada mais tarde. Também sinta-se à vontade para entrar em contato conosco no bate-papo, se você tiver dificuldades ao editar e / ou quiser dicas.
Sr. Xcoder

1
@ Mr.Xcoder Eu terminei a edição. Você também pode editar diretamente a pergunta para torná-la melhor e tentarei aprender com sua edição.
Weijun Zhou 26/01

1
@WeijunZhou Eu também sugerem fazendo os formatos de entrada para start, ende elimmais branda.
Erik the Outgolfer

5
Para a "G,7,10,1F"entrada, uma abordagem totalmente flexível permitiria, por exemplo, [16,7,16,31]como entrada e [[1,0],[1,1],[1,2],[1,3],[1,4],[1,6],[1,8],[1,9],[1,10],[1,11],[1,13],[1,14],[1,15]]saída. (Observe que a primeira resposta assumiu que parte disso já havia sido permitida, já que é bastante padrão - mas depende totalmente de você).
Jonathan Allan

Respostas:


10

Emojicode , 141 116 bytes

graças a @NieDzejkob por 25 bytes!

🍇a🚂b🚂c🚂d🚂🔂i⏩c➕1d🍇🍊🎊❎😛0🚮i b☁️🔍🔡i a🔡b a🍇😀🔡i a🍉🍉🍉

Experimente online!

🍇				
  a🚂 b🚂 c🚂 d🚂		👴 4 arguments of type 🚂 (integer)
  🔂 i  ⏩ c  ➕ 1 d 🍇		👴 for i in range(c, d+1)
    🍊 🎊 			👴   if cond_a and cond_b
      ❎ 😛 0  🚮 i b		👴     cond_a: i%b != 0
      ☁️ 🔍 🔡 i a  🔡 b a	👴     cond_b: i in base-a doesnt have b in base-a
    🍇				👴   then
      😀 🔡 i a			👴     print i in base-a
    🍉
  🍉
🍉


3
-1 para a escolha do idioma Rod_ಠ
Rod

3
Você pode apenas postar um fechamento, que é o equivalente emojicode de um lambda. Isso deve economizar alguns bytes.
NieDzejkob 26/01

5

Geléia ,  12  11 bytes

-1 graças a Erik the Outgolfer (uso de "order" no lugar de divisível com argumentos trocados ḍ@)

r/ọÐḟ⁵bċÐḟ⁵

Um programa completo que recebe três entradas como argumentos de linha de comando, todas empregando notação decimal - uma lista [start, end]e dois números basee elim- que imprime a representação Jelly de uma lista de listas, onde cada uma representa os dígitos de um número basee cada dígito é um número decimal (por exemplo, 1043 na base 20 seria [2,12,3], ou seja, 2 × 20 2 + 12 × 20 1 + 3 × 20 0 ).

Experimente online!

Uma pequena observação: isso não funciona para intervalos que incluem valores negativos, mas o desafio vinculado começa em 1 e conta.

Quão?

r/ọÐḟ⁵bċÐḟ⁵ - Main link: list, [start, end]; number, base
 /          - reduce [start, end] with:
r           - inclusive range => [start, start+1, ..., end]
   Ðḟ       - filter discard if:
     ⁵      -   program's 5th argument (the 3rd input), elim
  ọ         -   order (how many times the element is divisible by elim, or 0 if not)
      b     - convert to base "base"
        Ðḟ  - filter discard if:
          ⁵ -   program's 5th argument (the 3rd input), elim
       ċ    -   count (0 if elim is not a digit)

ḍ@pode ser ;) (btw eu teria postado rọÐḟ⁶b⁵ċÐḟ⁶...)
Erik the Outgolfer

Ah sim, nunca usei o sexto argumento!
Jonathan Allan

1
Como sempre, você se importaria de expandi-lo e elaborar como ele funciona?
Weijun Zhou 26/01

Uma alternativa para ọÐḟpoderia ser%Ðf
Sr. Xcoder

2

Julia 0.6 , 69 bytes

f(b,e,r,g=filter)=g(z->!contains(z,base(b,e)),base.(b,g(x->x%e>0,r)))

As entradas são base, elim, start:end onde start:endestá a UnitRange. como base 10 inteiros. Produz uma lista de seqüências de caracteres dos números na base fornecida. Filtros para divisibilidade em forma inteira, usabase. para converter elementos em cadeias de elementos e, em seguida, filtra na contenção de dígitos. Exemplo chamado:f(10,3,1:100)

Experimente online!


1
Eu não tinha pensado em usar padrões em uma assinatura para sub-rotinas de alias, vou ter que lembrar disso para futuras postagens do Perl 6.
Brad Gilbert b2gills

1

Python 2 , 102 94 bytes

lambda b,e,l,u:[i for i in range(l,u+1)if i%e*x(i,b,e)]
x=lambda n,b,e:n<1or(e-n%b)*x(n/b,b,e)

Experimente online!

A entrada e a saída estão na base 10.


1

Perl 6 ,  94  57 bytes

->\a,$b,\c,\d {grep {!/$b/},grep({$_%$b.parse-base(a)},[...] (c,d)».parse-base(a))».base(a)}

Teste (94)

Desde que as regras mudaram:

->\b,$e,\r{grep {!/"$e.base(b)"/},grep(*%$e,r)».base(b)}

Testá-lo (Int, Int, Range) A
saída é uma lista de strings na base

Expandido

->
  \b,  # base  (Int)
  $e,  # elim  (Int)
  \r   # range (Int Range)
{
  grep
    {!/"$e.base(b)"/},  # remove the values that contain the character

    grep(
      * % $e,           # remove values that are divisible by elim
      r                 # the input Range

    )».base(b)          # convert each into base 「b」
}

Obrigado pelo seu interesse e esforço, também por escrever um teste. Aprendeu muito.
Weijun Zhou 27/01

1

JavaScript, 82 bytes

Uma rapidinha antes de eu bater na bebida! Toma entrada na base 10 no fim base, elim, start& ende emite uma cadeia delimitada espaço de base 10 números com um espaço simples.

(b,l,s,e)=>(g=o=>++s>e?o:g(s%l&&!~s[t=`toString`](b).search(l[t](b))?o+s+` `:o))``

Experimente online


Este tem o problema como o japonês. Você se importaria de modificá-lo um pouco?
Weijun Zhou 27/01

@WeijunZhou: Atualizado.
Salsicha

Muito obrigado. Você pode atualizar a parte "explicação" da outra resposta sempre que quiser. Sem pressa.
Weijun Zhou 28/01

@WeijunZhou: Suponho que você queira dizer com a minha solução Japt, em vez desta? Estarei atualizando quando voltar ao meu computador amanhã.
Salsicha

Sim, meu mal. Eu editei o comentário imediatamente, mas você ainda viu o original ... Desculpe.
Weijun Zhou 28/01

1

Japonês , 16 bytes

Reescrito rapidamente depois que a especificação foi alterada para permitir a entrada decimal, portanto provavelmente pode ser aprimorada.

Toma entrada na ordem start, end, base, elime produz um conjunto de números na base de dados.

òV kvX msW køXsW

Tente


Explicação

                   :Implicit input of integers U=start, V=end, W=base & X=elim
òV                 :[U,V]
   k               :Remove
    vX             :  elements divisible by X
       m           :Map
        sW         :  Convert to base-W string
           kø      :Remove elements containing
             XsW   :  X converted to a base-W string
                   :Implicit output of resulting array

Para valores de elim maiores que 10, mas menores que a base, isso falhará ao remover os elementos que contêm o dígito. Por exemplo, para 0,35,12,11, a saída contém erroneamente 23 = (1,11) base12
gggg

@gggg, parece que as especificações foram alteradas desde que eu publiquei isso; originalmente, elimfoi especificado para ser um único dígito (ou seja 0-9) , em vez de um único caractere na base de entrada.
Salsicha

Justo, achei a especificação super confusa.
Gggg

Por "dígito único", quero dizer um dígito na base correspondente. Portanto, "A" (ou se você preferir expressá-lo como 10) é um dígito em uma base hexadecimal. Desculpe a confusão.
Weijun Zhou 27/01

1
@WeijunZhou: Done
Shaggy

0

Java 8, 92 bytes

(b,k,s,e)->{String r="",t;for(;s<=e;r+=t.contains(k)?"":t+" ")t=b.toString(s++,b);return r;}

Entrada como Integer (base), String (elem), int (start), int (end).

Explicação:

Experimente online.

(b,k,s,e)->{              // Method with the four parameters, and String return-type
  String r="",            //  Result-String, starting empty
         t;               //  Temp-String
  for(;s<=e;              //  Loop from start to end (inclusive)
      r+=                 //    After every iteration: append the result-String with:
         t.contains(k)?   //     If the temp-String contains the elem we exclude
          ""              //      Don't append anything to the result-String
         :                //     Else:
          t+" ")          //      Append the temp-String + a space
    t=b.toString(s++,b);  //   Convert the number to the given base and set the temp-String
  return r;}              //  Return the result-String

Os três casos de teste são inseridos assim:

16,"7",16,31
10,"3",1,100
16,"A",151,192
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.