Defino o n-ésimo ternário como um ternário que retorna n e tem a forma:
1 ? 2 ? 3 ? n - 1 ? n : 0 : 0 : 0 # n - 1 zeroes
Escreva uma função ou programa completo que, dado uma entrada n, produza ou retorne o n-ésimo ternário. Código-Golf.
Casos de teste
0 #=> undefined behaviour
1 #=> 1
2 #=> 1 ? 2 : 0
3 #=> 1 ? 2 ? 3 : 0 : 0
10 #=> 1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 ? 8 ? 9 ? 10 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0
Na 1000ª ternária , acho que há algum tipo de harmonia zen nela.
Respostas:
Pitão -
191817 bytesOs espaços estão me matando, pensando em uma maneira melhor de lidar com eles.
Apenas junta os números com a
" ? "
e concatena a segunda parte.Experimente online aqui .
fonte
CJam,
1818 bytesExperimente online .
Explicação
fonte
:)
.Ruby, 31 bytes
Teste:
fonte
array * string
==array.join string
... interessantef[0]
?irb(main):007:0> f[0] ArgumentError: negative argument from (irb):6:in * from (irb):6:in block in irb_binding from (irb):7:in [] from (irb):7 from /usr/bin/irb:11:in <main>
CJam, 19 bytes
Apenas um começo ...
Como funciona
Experimente online aqui
fonte
Brainfuck, 305
(Sem o número de entrada de STDIN, veja editar na parte inferior)
Eu usei esse adorável algoritmo para imprimir um número, que ocupa 155 bytes de todo o programa.
Ele funciona para entradas de até 32768 (limitação de 16 bits do algoritmo). Ele não produz espaços à direita e funciona
1
como entrada :Passo a passo rápido:
Instalação (97 bytes)
Primeira parte (181 bytes)
Segunda parte (27 bytes)
Se fosse permitido mapear os 8 comandos do Brainfuck para 3 bits, esse programa ocuparia 114 bytes e outros 3 bits
Unário, ~ 4,08 * 10 ^ 275 bytes
Seria muito longo para aqui, mas é apenas 408452257862560239329948606295286361112603208650130608525040044700379331457759667646985586658469601803889628246410788572492437928714867190270708935427798983714797786123292750743771225096145575210320040188155473030775033228313350778616384531426430459309802833775612506568528463 zeros e funciona da mesma forma como o programa Brainfuck.
EDIT : Eu errei, este programa não aceita realmente a entrada do usuário, apenas usa o valor atual do ponteiro como entrada. Para poder analisar um número, seria necessário muito mais e não posso me incomodar em fazer isso.
Portanto, ele funciona com um valor inserido diretamente no programa (acrescentando n vezes "+" antes do programa), mas não com STDIN
fonte
JavaScript (ES6),
4239 bytesA função externa
f
pega o valor de entrada e, em seguida, chama a função internag
recursivamente para criar a sequência do meio para fora, usando o valor de entrada como máximo para testar o caso base.Ungolfed:
fonte
Python
5655fonte
C # - 76
fonte
Haskell, 53 bytes
Como funciona: construa a string de dentro para fora, iniciando com uma string vazia e fazendo um loop de
n
baixo para baixo2
com o prefixo do número atual e a?
e anexando a: 0
. Finalmente, coloque um1
na frente de todos.Uma abordagem diferente (graças a @Mauris agora 9 bytes mais curto):
Haskell,
6051 bytesComo funciona: a literal
1
seguido por? <x>
para cada<x>
em[2..n]
seguida por uma constante: 0
para cada<x>
no[2..n]
.fonte
g n='1':((=<<[2..n])=<<[(" ? "++).show,\x->" : 0"])
(\_->" : 0")=<<[2..n]
com[2..n]>>" : 0"
Pitão, 17 bytes
Demonstração.
fonte
Julia,
4431 bytesIsso cria uma função sem nome que aceita um número inteiro como entrada e retorna uma string. Para chamá-lo, dê um nome, por exemplo
f=n->...
.Primeiro, juntamos os números inteiros 1 a n , separando cada um com
?
e espaços em uma única sequência. Em seguida, anexamos a isso a sequência" : 0"
repetida n -1 vezes.Exemplos:
fonte
JavaScript ES7, 62 bytes
Não sei se posso jogar mais isso. Mas é uma solução bastante direta
Apenas Firefox:
Equivalente a ES5:
fonte
CoffeeScript, 52 bytes
Explicação
fonte
SWI-Prolog, 90 bytes
Definitivamente não vai ganhar, mas a
\+ (between(1,TopBound,N),\+do_something(N))
construção é bastante interessante para repetir algo em uma sequência de números inteiros.fonte
Swift 145 (135 sem espaço em branco)
Você pode acreditar que a parte da substring é realmente mais longa que a parte para produzir a expressão.
fonte
str[1]
oustr[0...5]
. Claro que você pode fazer uma pequena extensão, mas eu desejo que a biblioteca padrão habilitado estaPerl, 36 bytes
35
caracteres+1
para-n
.Correr com:
fonte
Java, 71
Não pude evitar depois de comentar a resposta da RCB . Então aqui está outro Java (71 como uau, quando Java não é o mais longo!)
fonte
Java,
12588 bytesOriginal
Com formatação melhor e nomes de variáveis:
Melhorado - Graças aos comentários de Jack Ammo abaixo:
fonte
e+=" : 0";
. Você pode salvar 1 byte pós-incrementando i quando usado em vez de na linha de forloopfor(int i=1;i<n;){s+=i+++" ? ";
Sua declaração de retorno não precisará mais do espaço adicionado após nreturn s+n+e;
. Você também pode salvar 1 byte usandoe=s
. Além disso, a instrução if no início é desnecessária, pois a lógica do loop for garantirá o resultado de qualquer maneira.JavaScript (ES6), 59 bytes
A mesma abordagem da minha resposta do CoffeeScript, usando a ajuda de strings de modelo.
String.prototype.repeat
custa muitos caracteres.Demo
Firefox apenas por enquanto, como é o ES6.
fonte
K, 36 bytes
fonte
Python 2,
63605856Experimente aqui
Solução fácil: (63)
Edit : Eu realmente queria tentar uma função recursiva. Aqui está: (56)
Edit : Alguém sabe por que isso não está funcionando? Tentei uma lista com um índice de
c<n
, mas isso não funcionou devido a um erro de estouro de pilha. O mesmo com isso:fonte
0*
isso.rs , 77 bytes
Demonstração ao vivo e casos de teste.
Explicação:
Expanda o número em uma série de N sublinhados.
Crie repetidamente um intervalo de sublinhados, separados por espaços. eg Este giraria
___
em_ __ ___
.Anexe ao último conjunto de sublinhados (de comprimento N) instâncias N-1 de
: 0
.Substitua cada grupo de sublinhados por seu comprimento, precedido por
?
, EXCETO para o primeiro.Substitua o primeiro pelo número 1.
Por causa do formato, isso também lida
0
bem: apenas imprime a string vazia.fonte
Rápido,
7975 bytesf
é declarado implicitamente como uma função com umInt
parâmetro que retorna umString
Funciona com
n >= 1
e trava no tempo de execução quandon == 0
. Não há espaços em branco à direitaEditar: conseguiu remover 2 * 2 caracteres, porque a interpolação de cadeia nem sempre é a mais curta
Nota para editar: Esse código leva uma eternidade (não para) para compilar, mas definitivamente o faria se o compilador fosse capaz de lidar com isso. Dê uma olhada na versão anterior a esta edição para obter uma que compile
fonte
> <> , 32 + 3 = 35 bytes
Observe que há um espaço à direita na segunda linha. O +3 é para a
-v
bandeira, por exemplo, execute comoTomando a entrada como um ponto de código como
tem 34 bytes, mas eu prefiro a versão acima, pois é mais fácil de testar e, de qualquer maneira, não ganha.
Explicação
Há muita pseudo-recursão e abuso acontecendo, então vamos dar uma olhada.
A primeira linha imprime a
"1 ? 2 ? ... n-1 ? "
peça. A pilha começa apenas com a entradan
, graças à-v
flag, e fazemos o seguinte:> <> é toroidal, portanto, o acima é executado em um loop até que a pilha consista
n
no topo comn-1
zeros abaixo; nesse ponto, ela se move para a segunda linha.Na primeira vez que a segunda linha é executada, a
n
instrução é executada, imprimindo an
parte superior da pilha. Isso deixa apenas osn-1
zeros e fazemos o seguinte, também em um loop:fonte
" ? "ooo
Imprimir o reverso de "?" (Mas ei, palíndromos) está imprimindo o inverso mais curto do que imprimir a sequência real?Scala,
78715250 bytesfonte
Objective-C, 346 bytes
Colocando
0
peloint
ou negativo nada levanta umaNSRangeException
devido aoutString
contendonil
. Isso deve ser executado no iOS 2.0 e posterior e em muitas das versões mais recentes do Mac OS X.Um detalhamento do código:
Declaração de função padrão em Objective-C.
Cria uma string para a saída,
outString
, e a torna mutável. (Em outras palavras, pode ser lido e gravado em.Adiciona a primeira parte da cadeia de caracteres à saída.
Limpa o início da string para garantir que ela
? 1
seja substituída por1
. Nota: se0
foi dado, é aqui que oNSRangeException
ocorreria, devido à inexistência de um índice1
.Adiciona a segunda parte da string à string.
Cospe a corda de volta usando
NSLog
e fecha a função.Resultado:
A entrada
0
fornece esse log de falha:1
dá o seguinte:2
dá o seguinte:7
dá o seguinte:200
dá o seguinte:fonte
C,
8478 bytesC, mesmo que não seja o menor, como uma função:
Em nome de golfe, o
int
especificador de tipo for deixada de fora dei
,f
en
porque é o padrão.i
pode ser não inicializado porque é uma variável global e o padrão é zero.f
não retorna um valor, mas isso apenas causa um aviso.printf
não é#include
'd. Para executar, aqui está uma versão completa do programa:fonte
for(printf(...);--i;)
.C, 63 bytes
Função reutilizável, leva n como argumento.
Ungolfed e comentou (bastante direto):
fonte
Lisp comum, 84
Primeiro,
(loop for i from 1 to (read) collect i)
gera uma lista de números inteiros de 1 para o que for inserido, que é usado como o único argumento para a função. Mas a verdadeira mágica disso está na cadeia de controle que se parece com o ruído da linha."~{~A ? ~}"
itera sobre a lista inteira armazenada no primeiro argumento, produzindo cada número com o?
da primeira metade.~@*
redefine a lista de argumentos para o primeiro argumento.~{~[~;~:;0~^ ? ~]~}
reitera sobre a lista, produzindo0 ?
para cada argumento consumido, mas não produzindo nada se o argumento for 0 ou 1.fonte