Boliche com código rearranjável

14

Code-Bowling Challenge

Escreva um programa ou função que produza a mesma saída, não importa como você reorganiza o código-fonte. (A saída não pode ser um erro)


Pontuação do Pangram

  • Sua pontuação é a quantidade de caracteres únicos no seu código-fonte.

    Um programa com código fonte AJBteria uma pontuação de 3
    Um programa com código fonte AAJteria uma pontuação de 2
    Um programa com código fonte 111teria uma pontuação de1

  • Esta é uma variante do . O programa com a maior pontuação vence!

(Para sua conveniência, uma ferramenta de pontuação automatizada foi criada aqui )


Regras do Desafio

  1. Entrada
    O programa / função pode receber uma entrada, embora seja totalmente opcional.

  2. Saída
    Essa saída pode ser o que você quiser, mas deve ser nula, nula, vazia e sem erro. (Portanto, a saída deve ter pelo menos 1 byte)

  3. Reorganização
    Não importa como o código-fonte é reorganizado, a saída deve ser a mesma.

    Exemplo:
       Programa: ABJsaídas hello world, assim como programas: [ AJB, JAB, JBA, etc.]

Esta é uma variante do . O programa com o maior número de caracteres vence!

Albert Renshaw
fonte
1
Sem nenhuma tarefa específica a ser alcançada, esse desafio é muito amplo na minha opinião.
Dennis
2
O que significa non-nil?
Dennis18
2
Embora sua pontuação no pangram seja uma tentativa de fazer o boliche de código funcionar, não tenho certeza se esses desafios realmente devem ser marcados como boliche de código . O mecanismo de pontuação é bem diferente do que deveria ser o boliche de código, então eu diria que use desafio de código ou crie uma nova tag.
Martin Ender
1
Eu tenho que concordar com Martin. Por exemplo, esse desafio não é um código de golfe. Assim que você pontua por qualquer coisa além do número total de caracteres (ou bytes), não é mais um desafio para o boliche de código #
Nathan Merrill
3
O programa / função precisa terminar? (por exemplo, eu posso imprimir 0para sempre?)
MildlyMilquetoast

Respostas:

18

Língua, 1.112.064 pontos se UTF-8

Meu programa consiste em todos os caracteres UTF-8 possíveis. Ele imprime "Hello world" e usa 1,75 * 1076 yottabytes de espaço.

(Para gerar o programa, basta criar um arquivo com 17498005810995570277424757300680353162371620393379153004301136096632219477184361459647073663110750484 caracteres, garantindo que cada caractere UTF-8 possível esteja no arquivo)

Nathan Merrill
fonte
2
Senhor, você é um gênio. E espere, por que meu computador está quebrando? : 'P
HyperNeutrino 18/03/19
Eu pensei que Unicode tinha 1114112 caracteres?
precisa
14

Muitas línguas, 2 pontos

0.

Produz 0.0como 0.ou .0. Requer análise de número liberal que esteja OK com um ponto decimal no início ou no final, assumindo 0 para a parte integral ou decimal ausente. 0000000.daria a mesma pontuação.

Isso também funciona nos seguintes idiomas (em alguns casos, com uma saída diferente, conforme indicado):

  • Python REPL
  • Javascript REPL
  • MATLAB (produz ans = 0)
  • Oitava (produz ans = 0)
  • MATL (produz 0)
  • CJam
  • Retina (produz 0)
  • Empilhados (produz 0)

Para Python, acho que essa é a única maneira de obter uma pontuação acima de 1, pois as possibilidades podem ser esgotadas.

  • Qualquer operador binário ou unário falhará como o último caractere
  • Qualquer [](){}um exige uma partida e falhará se a final vier primeiro
  • As guias ou o espaço não podem iniciar uma linha. Novas linhas não podem ser usadas no REPL.
  • A , não pode ser o primeiro caractere
  • Um #colocado em primeiro lugar comentaria tudo e não produziria saída
  • Uma partida \é uma continuação de linha inválida
  • Os backticks (Python 2) devem ser emparelhados e os que não envolvem nada são um erro
  • $, !, ?, E @não pode ser usado sem outros caracteres inutilizáveis

Isso deixa letras, dígitos _, .e citações.

  • Entre aspas, qualquer não-string fora delas gera um erro.
  • Letras com possíveis dígitos e _cria nomes de variáveis, dos quais sempre existe alguma permutação.

Os dígitos das folhas e .. A permissão de dígitos diferentes fornece um número diferente, a menos que todos os dígitos sejam 0. Então, acho que zera e .é a única maneira de obter uma pontuação acima 1. Mas, eu não conheço bem o lexer do Python, então poderia estar faltando alguma coisa.

xnor
fonte
11

CJam , pontuação 15

T U
V	LMOQR[]0q

Experimente online!

Sempre imprime 0000:

  • 0 apenas empurra um zero.
  • T, U, VSão variáveis que são pré-inicializados a zero.
  • L, M, O, Q, RSão variáveis que são pré-inicializados para uma lista vazia, para que eles não aparecem na saída.
  • [e ]pode ou não agrupar as coisas em uma lista, mas elas não precisam ser correspondidas corretamente e a saída é nivelada para impressão de qualquer maneira.
  • q lê a entrada que está vazia e, portanto, também não aparece na saída.
  • avanço de linha, espaço e tabulação são ignorados pelo analisador.
Martin Ender
fonte
Esta é uma ótima resposta para um idioma como o CJam! Agradável
Albert Renshaw
Uma minúscula poderia rser adicionada realizando algo semelhante à minúscula q?
Albert Renshaw
1
@AlbertRenshaw, você não pode ter os dois, porque um erro ocorrerá no EOF.
Martin Ender
9

MATL , 3 5 6 pontos

A idéia de adicionar espaço em branco foi retirada da resposta de Bijan .

lv
 T1

O código, ou qualquer permutação do mesmo, gera três separados por novas linhas.

Experimente online!

Explicação

  • A função lpor padrão empurra o número um para a pilha.
  • Literal 1faz o mesmo.
  • Literais Timpulsos true, que é exibido como um número.
  • Espaço e nova linha são separadores, e aqui nada fazem.
  • vconcatena toda a pilha até agora em um vetor de coluna. Assim, por exemplo, vdepois Tconcatenaria os dois primeiros números em uma coluna (e o próximo número seria pressionado). Uma inicial vproduziria uma matriz vazia.

No final do código, a pilha é exibida implicitamente, com as seguintes regras:

  • Cada elemento ou matriz na pilha é exibida em uma linha diferente.
  • Os vetores de coluna são exibidos com cada elemento em uma linha diferente.
  • A matriz vazia não causa saída.

Portanto, qualquer permutação dos caracteres de entrada produz 1três vezes em linhas diferentes.

Luis Mendo
fonte
Explicação? Estou curioso sobre como isso funciona.
Camarada SparklePony
@Sparkle Adicionada uma explicação
Luis Mendo
Agradável! Também gostaria de observar que eu tinha esse texto no desafio Removing any part of the source code however should cause that specific output to not be produced.no momento em que você postou, não queria adicioná-lo e foi removido. Talvez isso irá ajudá-lo a aumentar a pontuação um pouco, possivelmente
Albert Renshaw
1
@AlbertRenshaw Obrigado pelo alerta! Mais dois pontos
Luis Mendo
Estou acusando você de roubar minha ideia. Não é um problema embora.
Bijan
6

Geléia , pontuação 53 101

¶ ¤$¥&+ABDFHNPQSUVX^_aborv|®²×ȧȯḄḅḌḞḢḤḷṀṂṚṛṠṢṪẠạị«»()kquƁƇƊƑƘⱮƝƤƬƲȤɓɗƒɦƙɱɲƥʠɼʂƭʋȥẸẈẒẎŻẹḥḳṇọụṿẉỵẓḋėġṅẏ

Usando apenas personagens que fazem parte do Jelly's página códigos .

Jelly tem entrada implícita de 0 e a primeira metade (até e inclusive ạị«») da cadeia de código acima consiste principalmente em átomos monádicos (maiúsculos) e diádicos (minúsculos e símbolos) que, quando recebem um zero ou uma lista contendo apenas um zero ( ou duas dessas entradas no caso de díades) retornam um zero ou uma lista contendo apenas um zero.

As exceções são:

  • O espaço: é ignorado (mesmo que esteja na página de código).

  • O pilcrow, separa links (assim como um feed de linha - mas esse é realmente o mesmo byte), mas nenhum outro bytes fará referência ao código antes mesmo.

  • o escaravelho, ¤ instrui o analisador a tratar tudo à sua esquerda, começando em uma nilada (ou constante) como uma constante (e funciona como um primeiro átomo).

  • o dólar, $ instrua o analisador a tratar os dois links à esquerda como mônada (e, de maneira surpreendente, funciona como um primeiro átomo)

  • o iene, da ¥mesma forma instrui o analisador a tratar os dois links à esquerda como díade.

  • O recomendado, ®lembra o valor do registro, inicialmente 0(seus direitos autorais equivalentes ©, quebram quando usado como o primeiro átomo, pois é uma aridade, é encontrado na aridade do link à esquerda, que ainda não está definido).

O código dos parênteses, (e assim por )diante, são pontos de código não utilizados no momento, todos são analisados ​​e cada um causa uma nova cadeia (assim como uma nova linha, embora eles não tenham o efeito de criar links que podem ser chamados como uma nova linha, mas aqui não há problema, pois nada tenta fazê-lo).

Jonathan Allan
fonte
1
Você pode adicionar todos os caracteres fora da página de códigos gratuitamente, pois o intérprete os exclui antes de processar o código. Ainda não sei o que não significa nada.
Dennis
1
Eu acho que o espírito do desafio é provavelmente que os personagens estejam na página. Perguntei sobre nada e a resposta foi especificar uma saída mínima de 1 byte.
Jonathan Allan
@ Dennis alguma idéia sobre a terminologia correta para o que acontece com a análise entre parênteses?
Jonathan Allan
Todos os caracteres não utilizados iniciam um novo link, assim como uma nova linha.
Dennis
1
Vamos chamá-los de comportamento indefinido. : P
Dennis
4

TI-Basic (série 83), 93 pontos (99 em uma TI-84 Plus)

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZθnπeiAnsrandgetKeyZXsclZYsclXsclYsclXminXmaxYminYmaxTminTmaxθminθmaxZXminZXmaxZYminZYmaxZθminZθmaxZTminZTmaxTblStartPlotStartZPlotStartnMaxZnMaxnMinZnMinΔTblTstepθstepZTstepZθstepΔXΔYXFactYFactTblInputNI%PVPMTFVP/YC/YPlotStepZPlotStepXresZXresTraceStep

Todos os dígitos, todas as variáveis de um byte (incluindo θ e n , as variáveis independentes para gráficos polares e sequencial), as constantes de pi, e , e i , alguns não muito variáveis ( Ans, rand, e getKey), e 59 diferente variáveis ​​de janela (todas com garantia de definição).

A multiplicação implícita garante que o resultado será 0 quando o recebermos em qualquer ordem. Se isso estiver sendo executado em uma calculadora nova, todas as variáveis ​​serão 0; mesmo se não, getKeyserá 0 porque não há tempo para pressionar uma tecla antes que o programa retorne um valor.

Em uma TI-84 Plus ou superior, podemos obter mais 6 pontos, adicionando os tokens getDate, getTime, startTmr, getDtFmt, getTmFmt, isClockOn. O resultado agora sempre será {0 0 0}porque getDatee as getTimelistas de retorno de comprimento 3 e a multiplicação implícita são distribuídas pelos elementos.

Eu acho que esses são todos os tokens possíveis de usar: qualquer comando real é prefixo, infixo ou postfix (o que significa que não funcionará no início ou no final do programa) e outras variáveis ​​podem ser indefinidas (e causar um erro quando usava).

Misha Lavrov
fonte
Isso é inteligente. Não é particularmente impressionante, haha, mas realmente inteligente! 1
Albert Renshaw
3

(não concorrente) Brainf-ck, 63 bytes

Bem, eu não sei se isso é considerado trapaça, mas ...

.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789

O ponto imprime o caractere atual (0x00) e o restante dos caracteres não faz nada. Tecnicamente, isso pode ser expandido infinitamente; portanto, deixe-me saber se isso é considerado trapaça.

brianush1
fonte
Eu considero que uma saída nula
Albert Renshaw
Ah, devo excluir minha resposta ou marcá-la como não concorrente?
brianush1
1
Há 97 personagens tipáveis, 7 dos quais você não pode usar (8-1), então eu diria que 90.
Bijan
@ brianush1, você pode deixá-lo como não competitivo para que outros possam ver. Vou editar questão um pouco mais para explicar a saída deve ser de pelo menos 1 byte
Albert Renshaw
15
@AlbertRenshaw (sorry para todos estes comentários) Se a saída deve ser 1 byte, então o personagem NULL deve contar, pois é um byte, embora um com um valor de 0.
brianush1
3

Haskell, 3 pontos

+ 1

Não importa quão reorganizado esse código sempre retorne a função que incrementa a entrada. Exemplos de uso em repl:

>(+ 1) 1
2
>(1+ ) 1  
2
>( +1) 1
2
Antistenos
fonte
2

√ å ı ¥ ® Ï Ø ¿ , 128.234 (?) Pontos

Cheguei a 128.234 com a ajuda de @DestructibleLemon. Este programa usa todos os caracteres Unicode (128.237) o, exceto Oeł . Curiosamente, dois desses são comandos de saída.

Certamente, porém, nenhuma linguagem poderia usar todos esses caracteres, certo? Bem, essa linguagem simplesmente ignora os comandos que não reconhece. Problema resolvido.

Esse idioma, por padrão, gera o seguinte:

===== OUTPUT =====



==================

que é nulo, nulo, não vazio e sem erro.

Nota: se isso violar alguma regra não escrita, notifique-me nos comentários e eu alterarei isso. Se você conhece minha pontuação (supondo que isso seja permitido), também poste nos comentários.

caird coinheringaahing
fonte
Que conjunto de caracteres ele usa? utf 8? utf-16? Ele usa todo o unicode?
Destructible Lemon
@DestructibleLemon Olhando na página do github, parece usar "CP-1252" para a codificação.
brianush1
@DestructibleLemon Os comandos estão todos na CP-1252 (Windows-1252), mas ele vai aceitar qualquer caractere Unicode como sintaxe válida
caird coinheringaahing
Aparentemente, existem 128.237 caracteres unicode, então você teria 128.234? en.wikipedia.org/wiki/Unicode#cite_note-24
Destructible Lemon
De acordo com outras respostas, aparentemente, existem 1.112.064 unicode, então eu realmente não estou certo mais
Destrutível Lemon
1

J, 3 bytes

 1

Os caracteres 1, espaço e nova linha sempre imprimirão 1.

Bijan
fonte
1

/// , 1 2 pontos

\_

Experimente online!

Não tenho idéia de como fazê-lo em qualquer outro idioma completo de Turing. Claro, existe o HQ9, mas isso parece barato.

1 byte graças a @Martin Ender.

Camarada SparklePony
fonte
esta deve ser dois pontos não bytes
Destrutível Lemon
@DestructibleLemon Desculpe, formatação TIO.
Camarada SparklePony
1

Pontos , 1.114.111 caracteres (se estiver usando unicode).

<87 dots here> Every Unicode character except NUL and . here

Explicação:

1                                           leading binary number
1010                                        010 increments the value under the pointer
1010111                                     111 prints out chr(1)

Portanto, a sequência binária resultante é 1010111 , que convertida em decimal é 87, então precisamos de 87 pontos.

Como qualquer outro caractere é um comentário, usamos todos os caracteres, exceto um NUL, porque o Python3 para de ler o arquivo e um ponto, porque os pontos não são comentários.

MilkyWay90
fonte
0

Prelúdio , pontuação 1.112.051

(Ao considerar apenas o ASCII imprimível [\t\n -~], a pontuação é 84. Se considerarmos todos os pontos de código Unicode , a pontuação é 1.112.051 .)

!
" #$    %&'+,-./0:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

(adicione todos os caracteres [\u{7f}-\u{10ffff}] depois dele.)

Sempre imprima 0.


Prelude é uma linguagem paralela baseada em pilha, onde a pilha é pré-preenchida com números infinitos de 0s.

  • +: Coloque dois valores (sempre 0), adicione-os (0) e empurre para empilhar.
  • -: Coloque dois valores (sempre 0), subtraia-os (0) e pressione para empilhar.
  • #: Coloque um valor e descarte-o.
  • !: Exibe um valor e o gera como um número (sempre 0) (a especificação diz "caractere", mas o intérprete diz "número"; em ambos os casos, um byte é impresso)
  • 0: Empurra 0.
  • ^, v, V: Empurra o valor superior dos próximos programas anteriores / paralelas ( "vozes"), mas as pilhas de todas as "vozes" são preenchidos com 0, para que eles sempre empurrar 0.
  • outros caracteres: no-op.

Portanto, existem apenas 13 caracteres que precisamos evitar:

  • (, ): Parênteses não emparelhados causarão erro
  • 1-9 : queremos apenas produzir 0.
  • ?: Não queremos inserir nada.
  • *: Causa uma verificação de consistência muito complicada do código antes e depois de uma linha que consiste em um único *. Então, precisamos remover a nova linha ou remover o *. A implementação de referência usa Python 2 .readline()que uma "nova linha" pode significar \rou \n. Portanto, é melhor apenas remover o *.
kennytm
fonte
0

Peixe morto , pontuação 86

o.ABCDEFGHIJKLMNOPQRSTUVWXYZabcefghjklmnpqrtuvwxyz?!|[]_-();'"*&^$#@!1234567890+=<>,/\:

Se isso é ilegal, também há

o

(pontuação 1)

snorepion
fonte