Faça números sábios


18

O Wise é uma linguagem bit a bit simples que projetei há um tempo. É baseado nas operações bit a bit do Python . Possui várias operações, a maioria delas é igual ou muito semelhante ao símbolo equivalente no Python.

  • : Duplique a parte superior da pilha

  • ? Gire a parte superior da pilha para baixo

  • ! Gire a parte inferior da pilha para o topo

  • [ ] enquanto o topo da pilha não é zero

  • ~não é o topo da pilha ( -(n+1))

  • -negar o topo da pilha ( -n)

  • >mova a parte superior da pilha uma vez para a direita ( n//2)

  • <deslocar o topo da pilha uma vez para a esquerda ( n*2)

  • ^xou os dois principais itens da pilha (o mesmo que Python )

  • |ou os dois principais itens da pilha (o mesmo que Python )

  • &e os dois principais itens da pilha (o mesmo que Python )


Criar um número inteiro no Wise é bastante simples: você pode zerar ::^e incrementá-lo ~-para que você faça zero e aumente várias vezes. No entanto, se removermos as -coisas se tornam um pouco mais interessantes.

Ainda podemos fazer todos os números usando as operações restantes. Por exemplo, aqui está 3

~<<~

TIO

Isso funciona porque ~transforma zero, uma sequência infinita de 0bits, em negativo, uma sequência infinita de 1bits, cada <um acrescenta um 0pouco ao final; quando terminamos, o que faz com ~que cada um seja uma sequência de 0s seguida por dois 1s ou como a maioria das pessoas chama 3


Tarefa

Escreva um programa que, quando determinado um número inteiro positivo, produzirá um programa Wise que criará o número nsem nenhum -em sua fonte (a fonte da saída, você pode usar -em sua própria fonte). Você pode assumir que já existe um zero no topo da pilha.

Como não , você deve tentar minimizar o código-fonte de geração e não necessariamente a saída.

Saídas de exemplo

Esta lista não é exaustiva, são simplesmente saídas possíveis

1  -> ~<~
2  -> ~<~<
3  -> ~<<~
4  -> ~<~<<
5  -> ~<~:<<|
6  -> ~<<~<
7  -> ~<<<~
8  -> ~<~<<<
9  -> ~<~:<<<|
10 -> ~<~:<<|<
11 -> ~<<~:><<<|
12 -> ~<<~<<
13 -> ~<<~:<<<|>
14 -> ~<<<~<
15 -> ~<<<<~
16 -> ~<~<<<<

é 0 incluído empositive integers
colsw

4
Não, 0 não está incluído em números inteiros positivos.
Zacharý

Aparentemente :aplicado em uma pilha vazia, empurra a 0. Eu acho que isso deve ser especificado, já que não é óbvio que a duplicação de uma pilha vazia deve dar0
Luis Mendo

Outros caracteres são erros de sintaxe ou são ignorados?
Xnor

@Luismendo você não sabe o conteúdo da pilha que não seja aquele que também se a pilha é um zero
Assistente de trigo

Respostas:


8

Japonês , 10 bytes

¤d0'<1"~<~

Experimente online!

Ideia básica: pegue a representação binária do número e mapeie 0para <e 1para ~<~. Saídas para 1-10:

 1: ~<~
 2: ~<~<
 3: ~<~~<~
 4: ~<~<<
 5: ~<~<~<~
 6: ~<~~<~<
 7: ~<~~<~~<~
 8: ~<~<<<
 9: ~<~<<~<~
10: ~<~<~<~<

Metagolfar isso também seria fácil. Apenas tira pares de~~
Draco18s

7

JavaScript (ES6), 34 33 bytes

f=n=>n?f(n&1?~n:n/2)+'<~'[n&1]:''
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

Funciona para qualquer número inteiro de 32 bits.


Ok, eu descobri isso. Legal! bom trabalho.
Assistente de trigo

7

Haskell , 38 bytes

Eu sinto que o PPCG está realmente melhorando meu Haskell. Acaricia o gato branco.

f n=mapM(["<","~<~"]<$f)[1..n]!!n>>=id

fpega um Inte retorna um String.

Experimente online!

(A <$fpropósito, estou me referindo a isso . Ele salva um personagem \_->.)

No Functorexemplo, para (->) a(funções de tipo a), temos: x <$ f = fmap (const x) f = const x . f = const x. A única limitação é essa fe a final const xdeve usar o mesmo tipo de fonte a. A instância é completamente preguiçosa, portanto isso nunca é avaliado f.

Como alternativa, o mesmo comprimento, mas menos maligno ( (l!!)é uma função anônima):

(l!!)
l=(++)<$>"":tail l<*>["<","~<~"]

Experimente online!

Ambos usam a mesma representação que a resposta Japt da @ETHproductions, embora especialmente o primeiro possa fornecer algumas redundantes < s no início.

O primeiro calcula todas as combinações de n "<"e"~<~" strings e depois indexa a lista resultante.

O segundo calcula recursivamente uma lista infinita formada iniciando ""e construindo novos elementos anexando "<"e "~<~"strings a cada elemento que já está na lista (na verdade, era um pouco menor para permitir que as coisas ""se transformassem "<").


1
Como diabos isso <$ffunciona? Alguma instância estranha do functor?
Xnor

@xnor Mwahahaha Acho que devo adicionar uma explicação então.
Ørjan Johansen

3

Ruby , 118 116 109 107 105 91 bytes

Guardado 2 bytes graças a cyoce!

->n{o={0=>""}
o.dup.map{|c,k|["~~c","<c*2"].map{|t|o[eval t[1..9]]=k+t[0]}}until o[n]
o[n]}

Experimente online!

Esta é uma função que recebe o número inteiro como entrada e retorna a string que representa esse número inteiro no Wise. Você pode encontrar uma versão não destruída aqui , que testa este programa em todos os números inteiros de 1 em diante.

A idéia básica é registrar um "conjunto" de constantes. Em seguida, com cada "etapa", as constantes são adicionadas ao pool para cada função possível. Eu escolhi as funções ~, <e >, que, creio, são suficientes para representar cada número. (Pelo menos, todo número abaixo de 10.000.)


Você pode usar dupem vez de cloneIIRC
Cyoce

Você precisa mesmo dup? mapnão modifica seu receptor.
Cyoce

@Cyoce eu acho que sim
Conor O'Brien

Oh, eu vejo agora. Ruby não gosta de modificar enquanto itera.
Cyoce

3

Python2, 54 52 51 bytes.

lambda x:'<'.join('>~<~'*int(i)for i in bin(x)[2:])

Agradecimentos ao Assistente de Trigo por salvar 2 bytes e Ørjan Johansen por um byte! Isso usa a mesma idéia que a resposta Japt da ETHproduction, mas com cadeias de substituição diferentes (ou seja, usando a representação binária)


Você não precisa [ ]do gerador dentro do join. joinpode usar um gerador como argumento.
Wheat Wizard

Eu acho '>~<~'*int(i)que você pode economizar um byte.
Ørjan Johansen

Acredito que a pontuação mais recente deve estar listada por último, para o benefício de snippets de placar automatizados e similares.
Ørjan Johansen

Lá, desculpe por me atrasar nisso.
Zacharý

2

05AB1E , 11 bytes

bS'<…~<~‚èJ

Experimente online!

Semelhante à resposta japonesa da ETHproductions.

Guardado 4 bytes graças a @Adnan!


Hey nice! Na verdade, você não precisa converter os números em cadeias, pois são iguais 'tipos' em 05AB1E. O mesmo para os literais numéricos (você pode fazer sem o '). Você também pode usar a indexação, que deve fornecer 11 bytes :).
Adnan

@Adnan Muito obrigado!
Camarada SparklePony

@ Adnan Apenas uma pergunta rápida, como é que funciona aqui?
Camarada SparklePony

Primeiro, ele troca os argumentos, pois seria executado uma exceção se fosse avaliado normalmente. Após a troca, ele mapeia 0para o elemento zeroth e 1para o primeiro elemento (porque vetoriza automaticamente). Aqui está um exemplo mais claro de como funciona.
Adnan

1

Python 2 , 123 110 bytes

def w(x):a=map(int,bin(x)[2:]);return x%2*("~<~:<"+"<".join(":"*e for e in a[-2::-1])+"|"*sum(a))or w(x/2)+"<"

Experimente online!

Também como lambda

w=lambda x:x%2*("~<~:<"+"<".join(":"*int(e)for e in bin(x)[-2:2:-1])+"|"*sum(map(int,bin(x)[2:])))or w(x/2)+"<"

Experimente online!

Poderia ser mais curto, mas aqui está a minha solução. Ele pega a representação binária e a transforma no código.



0

Geléia, 11 10 bytes

Bị“~<~“<”F

Esta é uma versão portada da resposta Japt da ETHproductions. Por falar em produtos ETH, eles me salvaram um byte!


Você poderia trocar as strings e fingir que a indexação é baseada em 0?
ETHproductions

O que você quer dizer? Estou me referindo ao fato de que tenho que incrementar a representação binária do número para obter índices utilizáveis.
Zacharý


Não funcionar, 1 produz <, que em Wise produz 0
Zachary

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.