Código de anagramas


10

Vamos tentar de novo.

O objetivo deste concurso é criar dois pedaços de código que sejam anagramas um do outro (os dois devem conter os mesmos bytes em uma ordem diferente) e executarão as seguintes tarefas:

  • É preciso testar se um número digitado é feliz ou primo e gerar saída se o número for (por exemplo, 7deve gerar happy primee 4produzir sad non-prime).

  • O outro deve produzir seu tamanho de código em bytes como uma palavra (um programa de 60 bytes seria produzido sixty, um programa de 39 bytes thirty-nine).

Se for necessário algum esclarecimento sobre as regras, não hesite em me dizer.

Esta é uma competição de golfe com código, e o programa mais curto vence!


O que impede que alguém faça /*program1*/program2e depois program1/*program2*/? Eu acho que você deve proibir comentários.
— William Barbosa

@WilliamBarbosa Por quê? Isso dificilmente será uma solução ideal.
— Martin Ender

Mas você também pode compartilhar algumas peças e não compartilham os outros, o que torna muito mais fácil
— haskeller orgulhoso

11
@proudhaskeller A proibição de comentários não resolve isso. Você sempre pode inserir caracteres em cadeias, nomes de variáveis ​​ou partes do código que não são executadas por outros motivos.
— Martin Ender

11
FWIW, acho que você não deveria ter excluído seu próprio envio. OP ou não, foi uma resposta interessante.
— Dennis

Respostas:


6

CJam, 80 49 48 caracteres

UPDATE : Inspirado na implementação de Dennis para calcular a soma dos quadrados dos dígitos, aqui está uma versão mais curta

Feliz / Triste Prime / Não Prime:

ri:T{Ab2f#:+}G*X="happy""sad"?STmp4*"non-prime">

Como funciona:

ri:T                                "Read input as integer and store it in T"
    {       }G*                     "Run this code block 16 times"
     Ab                             "Convert the number into base 10"
       2f#                          "Calculate square of each digit"
          :+                        "Sum all the squared digits and put the sum on stack"
X=                                  "Compare the sum after 16th iteration to 1"
  "happy""sad"?                     "If sum is 1, put `happy` to stack, otherwise `sad`"
               ST                   "Put space on stack then put the value of T on stack"
                 mp4*               "Put 4 to stack if input is prime, otherwise 0"
                     "non-prime">   "Put `non-prime` to stack and slice out first four characters if the input number is prime"

quarenta e oito

""A"forTy-eiGhT""ri:{b2#:+}*X=appsadSmp4*nnpm>"?

Como isso funciona:

""                                  "Push empty string to stack"
  A                                 "Push 10 to stack"
   "forTy-eiGhT"                    "Push `forTy-eiGhT` to stack"
                "ri:....pm>"        "Push this string to stack too"
                            ?       "Keep `forTy-eiGhT` on stack and pop the other string"

Experimente online

O primeiro programa lê o número de STDIN


Minha solução original de 80 caracteres

Feliz / Triste Prime / Não Prime:

r:N{1/~]{i_*T+:T;}/T_s\1=:H!X):XK<&0:T;}g;H"happy""sad"?SNimp"prime"_"non-"\+?:Y

oitenta

"eigHTY""r:N{1/~]{i_*T+:T}/_s\1=:H!X):XK<&0:T}happysad?SNmp";"prim_";"non-\?:+";

4

CJam, 50 49 bytes

Teste de felicidade e primalidade

li_{Ab2f#:+}30*(T="happy""sad"?S@mp4*"non-prime">

Lê um número de STDIN. Ambos os testes funcionam apenas para números inteiros de 64 bits.

Experimente online.

Comprimento próprio

A"forTy-nine""l_{b2#:+}30*(=happsadS@mp4*pim>"?""

Imprime para os nove e nove .


+1 para a melhoria de 31 bytes e "forTy-nine".
— Josiah Winslow

3

Golfscript - 81

Este programa testa se um número é feliz e / ou primo.

~.:a;0.{).a\%!@+\}a*;2="""non-"if"prime"@ {`0\{48-.*+}/}9*("sad ""happy "if@@#get

Este programa, um anagrama do último, gera "oitenta e um" (seu tamanho de bytes como uma palavra).

;"eighty-one"#   !""""""""%()***++-..../002489:;=@@@@\\\`aaaaadffiimnppprs{{{}}}~

Isso deve servir como um exemplo.


2
Hum, fornecer uma implementação de referência para um desafio de código de golfe no GolfScript pode não ser a melhor idéia. Eu acredito que este é bastante difícil de vencer e, portanto, um pouco desanimador para os participantes.
— Martin Ender

Vejo que as pessoas não estão percebendo que você escreveu a pergunta e votaram em você ... Eu concordo totalmente com o Martin.
— proud haskeller

@proudhaskeller Não há absolutamente nada de errado com a resposta automática.
— Justin justin

Eu digo que não há nada errado em responder a mim mesmo ou comentar o código.
— Josiah Winslow

2
@JosiahWinslow Não há nada errado com isso. Só estou dizendo que você pode perder algumas respostas mais interessantes se postar uma solução muito boa imediatamente.
— Martin Ender

1

J - 87 char

Uma tentativa ingênua disso em J. Nenhum uso da biblioteca padrão, embora eu duvide que seria mais curto usando isso.

((sad`happy{~1 e.(,[:+/@:*:,.&.":@{:)^:(1-{:e.}:)^:_);@,' ';'gtv]non-prime'}.~4+4*1&p:)
'((ad`app{~1 .(,[:+/@:*:,.&.":@{:)^:(1-{:.}:)^:_);@, ;onprm}.~4+4*1&p:)']'eighty-seven'
('(ad`app{~1 .(,[:+/@:*:,.&.:@{:)^:(1-{:.}:)^:);@, ;onprm}.~4+4*1&p:']'eighty-seven'"_)

A linha no topo é um verbo pegando um número inteiro e diagnosticando sua felicidade e primalidade como uma sequência de saída. A segunda linha é uma expressão retornando a string eighty-seven, enquanto a terceira é uma função constante fazendo o mesmo. Incluí os dois porque ambos são possíveis e porque não sei qual será a decisão sobre as respostas das funções em oposição às respostas dos programas, e J não possui funções sem argumentos - você apenas atribui uma função a argumento fictício.

Perdemos a maioria dos caracteres procurando por felicidade. (,[:+/@:*:,.&.":@{:)é o corpo principal que soma os quadrados dos dígitos de um número e (1-{:e.}:)é o teste para determinar se esse número já ocorreu. sad`happy{~1 e.transforma isso em um resultado de palavra e o anexamos à frente da string non-prime, potencialmente cortando quatro caracteres se o número era realmente primo.

No anagrama, apenas escondemos todos os bits que não estão 'eighty-seven'em uma string que ignoramos. Eu poderia fazer melhor se J tivesse mais cartas para reutilizar, mas não, então tudo bem.


Essa é uma boa solução.
— Josiah Winslow
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.