Escreva um programa que produz uma lista do número de ocorrências de cada caractere exclusivo em seu código-fonte.
Por exemplo, este programa hipotético {Source_Print_1};
deve produzir esta saída:
; 1
P 1
S 1
_ 2
c 1
e 1
i 1
n 1
o 1
p 1
r 2
t 1
u 1
{ 1
} 1
A formatação deve corresponder a este exemplo. Nenhum espaço em branco estranho é permitido, exceto uma nova linha final opcional.
Seu programa pode não ler seu próprio código fonte no arquivo fonte.
Os caracteres listados devem estar em um de dois pedidos. A ordem dos valores dos caracteres na codificação de caracteres usada pelo seu idioma (provavelmente ASCII) ou a ordem em que os caracteres aparecem na sua fonte.
Esta pergunta foi inspirada neste comentário de Jan Dvorak .
Respostas:
CJam, 14 bytes
Experimente aqui .
A saída está na ordem em que aparecem pela primeira vez:
Ele simplesmente anexa
<SP>2<NL>
a cada caractere em{S2N`/}
.fonte
/// , 12 bytes
Um grande obrigado a @ user23013, que sugeriu essa melhoria no meu código CJam, superando sua própria resposta de maior pontuação no processo.
Os caracteres são classificados por aparência. Este código funciona em qualquer linguagem que apenas imprima seu próprio código-fonte nas circunstâncias especificadas (PHP, ASP, etc.).
CJam, 20 bytes
Essa abordagem não usa nenhuma contagem de caracteres interna.
Experimente on-line no intérprete CJam .
Como funciona
fonte
CJam, 20 bytes
Como funciona
Começamos com um dos quine padrão no CJam
que coloca o primeiro bloco na pilha, copia e executa a cópia, o que faz com que ela imprima o próprio código-fonte finalmente.
Em seguida, adicionamos a lógica para calcular a contagem de caracteres a partir do código fonte:
Experimente online aqui
fonte
Python 3.5.0b1 ,
10773 bytesEm vez da substituição usual de seqüência de caracteres, que exige que você escreva tudo duas vezes, aqui está um
exec
resumo.fonte
Mathematica, 101 bytes
Infelizmente, não posso usar nenhum dos truques normais de golfe, como remover espaços em branco,
<>
paraStringJoin
, em#
vez de#1
,@
para chamadas de função de prefixo ou em@@@
vez deApply[...,{1}]
, porqueToString[...,InputForm]
acha que precisa imprimir tudo ...Isso imprime os caracteres na ordem em que aparecem pela primeira vez no código. Se eu puder assumir que isso não é executado em um ambiente REPL (o que é bastante incomum para o Mathematica), posso salvar dois bytes, omitindo os dois
;
.fonte
InputForm
é chato ...OutputForm
é melhor, mas não cita seqüências de caracteres.Haskell, 178 bytes
Nada chique. Todos os caracteres do programa estão em uma lista literal (String). O mesmo acontece com as frequências. Feche as duas listas e imprima. Resultado:
fonte
Dardo -
214127Uma versão direta:
O "4" é apenas um fator delicado para somar os números. Veja / execute no DartPad .
Original: tática padrão para quine, e os nomes das funções de Dart são um pouco longos para um bom jogo de golfe.
Veja / execute-o no DartPad .
fonte
Haskell , 146 bytes
Experimente online!
Resultado:
(Mais uma nova linha)
Explicação:
O código é
onde
"<code>"
é uma sequência do código do programa sem o"
.a
passa pelos caracteres ascii começando com um espaço.sum[2|b<-show"<code>",a==b]
conta com que frequência o caractere aparece na string, com cada ocorrência contada duas vezes.a:" "++show s
cria uma cadeia de caracteres atual, um espaço e a contagem de caracteres. Finalmente,mapM putStrLn
imprime cada sequência da lista com uma nova linha à direita.A parte mais difícil foi acertar as contas
"
. Usar apenasb<-"<code>"
contaria aspas zero porque não há nenhuma na sequência. Usarshow"<code>"
adiciona"
a à frente e final à sequência, resultando em uma contagem de quatro. Então eu tive que colocar duas aspas adicionais no código, então, em vez das (mais curtas) quea:' ':show s
eu useia:" "++show s
.fonte