21, 21, 23, 20, 5, 25, 31, 24,?
Inspirado neste quebra-cabeça , dado um número inteiro , imprima a sequência a seguir até chegar a um número não inteiro (spoiler, caso você queira resolver o quebra-cabeça primeiro)
ou mais intuitivamente: * 1, +2, -3, / 4, * 5, +6, -7, / 8, ...
Casos de teste:
1: 1, 1, 3, 0, 0, 0, 6, -1
2: 2, 2, 4, 1
3: 3, 3, 5, 2
4: 4, 4, 6, 3
5: 5, 5 , 7, 4, 1, 5, 11, 4
6: 6, 6, 8, 5
9: 9, 9, 11, 8, 2, 10, 16, 9
21: 21, 21, 23, 20, 5, 25, 31, 24, 3, 27, 37, 26
A entrada e a saída podem ser feitas em qualquer formato razoável; as brechas padrão são proibidas como de costume.
No espírito do código-golfe , a resposta mais curta em bytes ganha!
Sandbox: https://codegolf.meta.stackexchange.com/a/18142/59642
Respostas:
05AB1E (herdado) ,
1817 bytesExperimente online ou verifique todos os casos de teste .
Explicação:
Estou usando a versão herdada do 05AB1E aqui e também primeiro calcule o próximo número antes de imprimi-lo, porque o loop é baseado em 0 e fará uma
/0
na primeira iteração. Isso salvou um byte em comparação com o anteriorN>
e"*+-/"
. Isso só funciona, porque na versão herdada, um número dividido por 0 permanece o mesmo; considerando que na nova versão se tornaria 0; e na matemática real daria uma divisão por erro zero.fonte
Scratch 3.0 39 blocos / 323 bytes
Experimente na
linhazero!Como alternativa, como sintaxe SB:
Olhe para vocês, se divertindo com suas
eval
declarações chiques ! Bem, eu não! Não ... Scratch não tem avaliações, então eu tive que fazer as coisas da maneira mais difícil ... se declarações.Pelo menos não é
goto
s ...fonte
goto
um loop de subtração para verificar se podemos dividir, em uma linguagem baseada em pilha . ; p (Com toda a seriedade, boa resposta, +1 de mim! Eu simplesmente não resisti a citar você na minha resposta acabada de espaço em branco .)Espaço em branco ,
251227202 bytesLetras
S
(espaço),T
(tabulação) eN
(nova linha) adicionadas apenas como destaque.[..._some_action]
adicionado apenas como explicação.Experimente online (apenas com espaços brutos, guias e novas linhas).
-24 bytes após um comentário da sugestão @JoKing
n%i > 0
. Embora apenasif(x < 0)
eif(x == 0)
estejam disponíveis no espaço em branco, a simples verificaçãoif(x*-1 < 0)
é basicamente a mesma queif(x > 0)
.-25 bytes adicionais graças a @JoKing .
Explicação:
Citação da resposta do zero :
Alguém disse
goto
? Espaço em branco não tem mais dogoto
que criar loops e instruções if. xD Além disso, é uma linguagem baseada em pilha, então eu tenho que trocar / descartar / copiar com bastante frequência. E ainda por cima: o espaço em branco nem mesmo tem pontos flutuantes e apenas divisão de números inteiros, então usein % i * -1 < 0
para sair do programa se o número inteiro não puder dividir o número atual.Pseudo-código:
fonte
if(n == 0)
ou estáif(n < 0)
disponível. Infelizmente nãoif(n > 0)
ouif(n != 0)
. Mas tenho certeza de que alguns aspectos podem ser simplificados. Essa solução atual foi uma tentativa e erro de depuração, mas talvez eu deva dar um passo atrás e repensar uma abordagem mais curta. Quando eu tiver tempo novamente. E consertou o pseudo-código, você estava certo de que eu mudeii
/n
na maioria dos lugares ..m = n%i; n = n/i; if (m == 0) jump to LOOP; exit program
?swap top two, copy second item
loop geral em vez de copiá-lo para cada seção?Haskell ,
75 7473 bytes-1 byte graças a Will Ness -1 byte graças a nimi
Experimente online!
Evita o uso de ints fracionários para economizar em bytes
fonte
JavaScript (V8) , 52 bytes
Imprime grupos de 4 termos. Inspirado pela resposta Ruby da GB .
Experimente online!
JavaScript (V8) , 54 bytes
Imprime os termos da sequência.
Experimente online!
JavaScript (ES6),
5958 bytesRetorna uma matriz.
Experimente online!
fonte
Perl 6 , 44 bytes
Experimente online!
Bloco de código anônimo que pega um número e retorna uma sequência. Se pudéssemos pular o primeiro elemento (que é sempre o mesmo que o segundo elemento), poderíamos salvar 3 bytes removendo o
$_,
fonte
Python 3 , 60 bytes
Experimente online!
fonte
Piet ,
297190144 codels (432 bytes)Tentei uma nova abordagem usando um
pointer
comando como switch (k mod 4) para unificar o código de saída, resultando em uma imagem de código 10x19 mais densa. Depois, joguei isso em 1 linha e 2 colunas para 8x18.Aqui está um rastreamento, para ver como funciona:
A primeira linha empurra um 0 na pilha como índice inicial (já que podemos apenas
push
números naturais, pressionamos 2 e subtraímos) e, em seguida, lê a entrada como número.A coluna mais à esquerda tem o código compartilhado de duplicar o número e inserir um na saída, movendo o índice no topo da pilha, incrementando-o e duplicando-o três vezes. Em seguida, inserimos o bloco vermelho pastel em forma de r através do codel ciano escuro para um
pointer
comando que nos fornece caminhos diferentes para o restante do nosso índice mod 4.Mod 1, saímos pelo topo para multiplicar. Primeiro, embaralhamos uma cópia do nosso índice para mais tarde e, em seguida, executamos a multiplicação. Depois de passar pelo branco para um noop, inserimos a coluna acima para corrigir a paridade cc (ela precisa ser invertida um número par de vezes para manter o loop estável), seguida por a
pointer (1)
de entrar na barra magenta: pegue nossos quatro caminhos e envie-nos de volta ao circuito.Mod 2, saímos para trás para somar. A forma do bloco de código pastel significa que saímos de uma linha acima de onde entramos e usamos os 3 que empurramos para a pilha, saindo pelo codel vermelho para
pointer (3)
nós mesmos para cima. Essas colunas têm o espaço em branco antes da aritmética e uma ordem ligeiramente diferente de pressionar e alternar cc, porque, de outro modo, teríamos sobreposição de cores com codelos com valor inteiro na coluna vizinha.O Mod 3 nos envia para baixo para subtração. O mesmo negócio que multiplicação, exceto que cruzamos o caminho da divisão no caminho para cima (como o cc tem paridade diferente ao entrar na barra verde pastel, as duas execuções saem dessa barra em extremidades diferentes). Ao fazer isso, captamos um
duplicate
comando indesejado e , empop
seguida, recuamos com o codel verde escuro antes de entrar na barra de correção e coleção de cc.Mod 4, vamos em frente para dividir. Aqui, primeiro temos que reorganizar a pilha mais severamente para obter dois pares de n e a para executar operações, porque precisamos testar se é inteiro. Fazemos isso fazendo
mod
no primeiro par, depoisnot
no resultado e depois o usamos para umpointer
- se não é divisível, continuamos em frente, o que nos envia com doispointer
comandos no canto oposto no bloco inevitável e, assim, termina o programa. Caso contrário, viramos à direita e recebemos umdivide
comando de entrar na barra magenta.Versão antiga
Código muito simples: envia um 1 e a entrada na pilha e percorre as quatro operações: Embaralhando o índice na parte superior da pilha, incrementando-o em 1, duplicando-o, reproduzindo uma cópia novamente, executando a operação aritmética, duplicar o número e colocar um na saída.
Para a divisão, que é a única onde a sequência pode terminar, ela cria uma pilha mais complicada para verificar primeiro se n mod index == 0; caso contrário, entra no codel inevitável e termina. Caso contrário, ele usa sua segunda cópia de ie para executar a divisão.
fonte
push (1) pointer
ou para uma célula preta em cima de uma colorida.C # (compilador interativo do Visual C #) ,
72,70, 69 bytesExperimente online!
fonte
Ruby ,
56 5452 bytesExperimente online!
Depois de alguma tentativa (falha)
eval
, descobri que a solução mais feliz é construir a matriz com 4 elementos ao mesmo tempo, pelo menos em rubi.Agradecimentos a Arnauld por -2 bytes.
fonte
R ,
90 bytes ,73 bytes87 bytes85 bytes80 bytes74Uma implementação clara das regras:
Experimente online!
com o
T<13
seguinte de uma análise mais profunda do quebra-cabeça. De fato, existem apenas três tipos de sequências: aquelas de comprimento 4, quando a⁰ não é congruente com 1 módulo 8; os de comprimento 12 quando a1 é congruente com o módulo 32; e os de comprimento 8 para os demais casos.Um código alternativo que evita loops acaba sendo mais longo com 87 bytes:
Experimente online!
fonte
{}
bytes de -2.length
.Haskell ,
1048685 bytesExperimente online!
o
h=
pode ser omitido, pois é usado apenas para teste.Ah, código golf, onde um aumento quadrático na complexidade do tempo vale a pena pela redução de um caractere.
104 bytes
Experimente online!
Eu gosto mais desta resposta, mas infelizmente é mais longa.
fonte
Japonês ,
2524 bytesOutra adaptação da solução Ruby da GB .
Tente
O principal truque aqui está na sobrecarga do
c
método para matrizes. Passe outra matriz como argumento e concatene-a com a matriz original. Passe um número como argumento, como acontece na última chamada recursiva, e nivelará a matriz original em muitos níveis -1
neste caso, após o arredondamento. Mas, como o array tem apenas um nível de profundidade, o nivelamento não tem efeito.fonte
Java 8, 84 bytes
Experimente online.
A criação de uma matriz com todos os quatro valores é inspirada na resposta Ruby do @GB , embora agora note que o uso de uma declaração if ternária é a mesma quantidade de bytes:
Experimente online.
fonte
Perl 5 , 53 bytes
Experimente online!
fonte
Vermelho , 102 bytes
Experimente online!
fonte
AWK , 57 bytes
Experimente online!
fonte
Rutger , 310 bytes
Experimente online!
Já era hora de eu usar Rutger novamente. Infelizmente, pode não ser o melhor idioma para a tarefa, pois não possui forma de
eval
, me forçando a usar quatro declarações ifComo funciona
Como o Rutger funciona
Um breve prefácio sobre como a linguagem funciona: tudo é uma atribuição ou uma função, e toda função requer exatamente um argumento. Para operações que requerem mais de um argumento (por exemplo, multiplicação), a primeira chamada retorna uma função parcial que, quando chamada novamente com o segundo argumento, retorna o resultado esperado. Por exemplo:
imprimirá 30: Experimente online!. Embora geralmente seja mais longo do que a alternativa usual, às vezes é possível salvar bytes, se uma função for chamada repetidamente com um argumento constante e um argumento alterado, por exemplo, ao imprimir tabelas de tempos.
Essa regra de um argumento se aplica a tudo que não é uma constante ou uma variável, incluindo loops e condicionais. No entanto, loops e condicionais (
For
,Each
,While
,DoWhile
,If
eIfElse
) são factível , o que significa que, a fim de realmente executá-los, aDo
função deve ser chamada (ver a última linha na resposta). Novamente, isso pode economizar bytes ao executar repetidamente o mesmo loop ou permitir que você execute código arbitrário entre a definição e a execução de loops.Finalmente, existem três maneiras de se referir a variáveis, todas usadas neste programa. O primeiro é a referência direta , onde o nome da variável é prefixado com um
$
símbolo. Isso acessa o valor da variável diretamente e a retorna. O segundo é a referência funcional , que não possui um caractere de prefixo. Isso permite que o código faça a distinção entre funções (potencialmente parciais) atribuídas a variáveis e variáveis reais que contêm um valor específico. Finalmente, a referência indireta , prefixada com um@
símbolo, cria uma variável (se ela ainda não existe) e retorna o objeto variável dentro de um determinado escopo. Isso permite que você crie uma variável de loop (por exemplo,i
infor i in range(...)
).Como a solução real funciona
Aqui está o código não destruído:
Experimente online!
Como você pode ver, ele começa atribuindo as três variáveis
n
,e
ea
, que representam a entrada, o elemento de mudança na seqüência, eo número de modificação para cada novo elemento respectivamente. Em seguida, criamos um loop while:As chaves (1 1 como seu segundo argumento, retornando 0 0 para números inteiros e um número inteiro diferente de zero para flutuadores. Em seguida, calculamos o não lógico disso, mapeando0 → 1 e n → 0 , n ≠ 0 .
{
e}
) definem um bloco de código, em que a instrução final no bloco é a condição para o loop while. Nesse caso, começamos definindo uma função de módulo parcial, que receberá um segundo argumentom
e retornaráe % m
. Em seguida, chamamos essa função parcial comEm seguida, chegamos à monstruosidade absoluta que consiste no corpo do loop while:
A parte principal desse loop é um loop for, que itera4 vezes cada iteração do loop while, tem uma variável de iteração
x
e consiste em:A primeira instrução imprime cada iteração da sequência antes de modificá-la. Em seguida, criamos uma função parcial para verificar a igualdade com a variável loop
x
e encontramos quatro instruções if. Cada instrução verifica sex
é igual a 1, 2, 3 ou 4, respectivamente, e depois atribuik
a cada função*
,+
,-
e/
, em seguida, faz-lo em uma função parcial come
como argumento. Por fim, atribuímose
ak
execuçãoa
como segundo argumento e incrementoa
.fonte
Ruby , 52 bytes
Experimente online!
fonte
i=0
e use um flutuador como argumento para a função.C (clang) , 80 bytes
Experimente online!
Graças a muitas melhorias no @ceilingcat.
fonte
dzaima / APL,
3433 bytesExperimente online!
-1 graças a ngn
fonte
TI83 / 84 BASIC, 69 bytes
Montamos um contador em A e limpamos L1 para que possamos usá-lo para rastrear a sequência. Em seguida, repetimos até que a etapa de divisão cause uma fração. Dentro do loop, primeiro armazenamos N na lista. Armazenar em um elemento após o final de uma lista ou em uma lista vazia cria esse elemento; portanto, esse armazenamento adiciona o resultado da divisão quando não causa uma fração e inicializa a lista durante a primeira passagem. Em seguida, usamos aumentada para acrescentar os próximos 3 termos da sequência. A matemática elabora alguns bytes menores calculando o termo A4k + 3 na variável O e baseando A4k + 2 e A4k + 4 em O. Em seguida, fazemos a divisão separadamente para redefinir N para a verificação repetida e adicionar 4 a A.
Coloquei um Disp L1 no final, mas não tenho certeza de quão ideal é, pois não há uma boa maneira de ajustar todos os termos na tela. Realisticamente, o usuário executaria L1 após o programa ser executado manualmente para rolar pelos resultados.
fonte
Carvão , 29 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Insira o valor inicial.
Repita até que o valor não seja mais um número inteiro.
Imprima o valor em sua própria linha.
Calcule as quatro operações aritméticas disponíveis e selecione a correta, dependendo do número da linha de saída atual.
fonte
Python 3 ,
7876 bytesExperimente online!
Recebe a entrada como uma lista de 1 item e acrescenta recursivamente o próximo item da sequência até que não seja um número inteiro.
Caso a entrada de entrada como lista não seja permitida, aqui está uma versão muito rapidamente corrigida, que recebe entrada como int.
Entrada como um inteiro, 102 bytes
Experimente online!
+2 bytes graças a me esquecer de nomear a função recursiva ...
-4 bytes graças ao Jitse
fonte
f=
no seu código principal. No entanto, você também pode salvar 4 bytesn[-1]
elen(n)
não precisa estar entre chaves. Experimente online!n[:-(n[-1]%1>0)]or f...
salvaria um byteGalho , 164 bytes
Ok, isso foi realmente horrível de escrever.
Limitações:
returns
! Você produz ou não produzwhile
loops. Você deve usar recursão ou nadaset
tagbreak
,continue
,goto
ou similar. Isso impossibilita o uso de um loop.for ... in ....
e ele percorre todos os elementos em uma matriz, sem nenhuma maneira de parar.Todos aqueles fizeram o código enorme!
Ei, eu até fiz isso mais do que a resposta Java!
É contanto que a resposta JavaScript de @ Arnauld ! ... Com todas as 3 alternativas combinadas.
Aqui está o código:
Você pode experimentá-lo em https://twigfiddle.com/zw5zls
Como usar:
Simplesmente importe o arquivo e chame a primeira macro.
Para ter uma matriz utilizável, você pode fazer
a.a(21)|split(',')
.Ungolfed:
Deve ser fácil de ler.
Esta resposta não-golpeada NÃO fornecerá a saída correta, pois gerará espaços em branco aleatórios.
Existe apenas para ser humanamente legível.
fonte