Nesse desafio, os usuários se revezam na conclusão de três tarefas de codificação bastante simples em linguagens de programação que podem ser progressivamente mais antigas.
A primeira resposta deve usar uma linguagem de programação que foi feita no ano de 2015. Quando houver pelo menos uma resposta de uma linguagem de 2015, as respostas poderão usar linguagens de programação que foram feitas em 2014. Da mesma forma, respostas que usam linguagens de 2013 não são permitidas até que haja pelo menos uma resposta de 2014.
Em geral, o uso de uma linguagem de programação do ano Y não é permitido até que uma resposta usando uma linguagem do ano Y + 1 seja enviada. A única exceção é Y = 2015.
Encontrando o ano do seu idioma
Para responder a essa pergunta, você deve saber o ano em que sua linguagem de programação foi "criada". É claro que este é um termo subjetivo; alguns idiomas foram desenvolvidos ao longo de vários anos e muitos idiomas ainda estão sendo atualizados a cada ano. Que o ano em que um idioma foi "criado" seja o primeiro ano em que uma implementação desse idioma apareceu no público em geral.
Por exemplo, o Python foi "fabricado" em 1991 , embora seu desenvolvimento estivesse em andamento desde 1989, e a versão 1.0 não foi lançada até 1994.
Se este ano ainda for subjetivo, use seu bom senso para escolher o ano mais apropriado. Não fique atolado em pequenas divergências sobre as escolhas de ano. Forneça um link para uma fonte que diz quando seu idioma foi criado.
Versões ou padrões diferentes de uma linguagem de programação (por exemplo, Python 1, 2, 3) são contados como a mesma linguagem no mesmo ano inicial.
Portanto, a menos que o ano do seu idioma seja 2015, você só poderá enviar sua resposta depois que uma resposta for enviada, cujo ano do idioma é o ano imediatamente anterior ao seu.
Se uma resposta válida com o mesmo ano que a sua já existir, você poderá responder. Não importa se o seu idioma foi desenvolvido no início ou no final do ano.
Tarefas
Você deve concluir as tarefas de 1 a 3. A tarefa 0 é opcional.
Essas tarefas foram mais ou menos escolhidas para corresponder a três aspectos importantes da programação: fornecer saída (tarefa 1), loop (tarefa 2) e recursão (tarefa 3).
Tarefa 0 - Histórico do idioma (opcional)
Escreva pelo menos um parágrafo explicando o histórico da sua linguagem de programação escolhida: quem a desenvolveu, por que, como, etc. Isso é especialmente encorajado se você estiver por perto quando a linguagem surgiu, e talvez até tenha participado de seu desenvolvimento. Sinta-se à vontade para contar histórias pessoais sobre o efeito que o idioma teve sobre você ou seu trabalho ou algo assim.
Se você é jovem demais para saber muito sobre o histórico do seu idioma sem muita pesquisa, considere deixar um recado para os usuários mais velhos, informando que eles podem editar sua postagem e adicionar um histórico em primeira mão.
Tarefa 1 - "Olá, mundo!" Variante
Escreva um programa que imprima
[language name] was made in [year made]!
para a área de saída padrão do seu idioma (stdout para os idiomas mais recentes).
Por exemplo, se a linguagem fosse Python, a saída seria:
Python was made in 1991!
Tarefa 2 - ASCII Art N
Escreva um programa que permita ao usuário digitar um número inteiro positivo ímpar (você pode assumir que a entrada é sempre válida) e imprima uma letra de arte ASCII N feita com o caractere N
.
Se a entrada for 1, a saída é:
N
Se a entrada for 3, a saída é:
N N
NNN
N N
Se a entrada for 5, a saída é:
N N
NN N
N N N
N NN
N N
Se a entrada for 7, a saída é:
N N
NN N
N N N
N N N
N N N
N NN
N N
O padrão continua assim. A saída pode conter espaços à direita.
Tarefa 3 - GCD
Escreva um programa que permita ao usuário digitar dois números inteiros positivos (você pode assumir que a entrada é sempre válida) e imprima seu maior divisor comum . Isso é definido como o maior número inteiro positivo que divide os dois números sem deixar resto. Pode ser facilmente calculado usando o algoritmo euclidiano .
Exemplos:
8
, 12
→ 4
12
, 8
→ 4
3
, 30
→ 3
5689
, 2
→ 1
234
, 876
→6
Você pode usar uma função interna, mas tente descobrir se ela estava lá na primeira versão do seu idioma. Caso contrário, tente não usá-lo.
Regras
- Você pode responder várias vezes, mas cada nova resposta deve usar um idioma criado pelo menos 5 anos antes do idioma em sua última resposta. Portanto, se você respondeu com um idioma de 2015, não poderá responder novamente até que 2010 sejam permitidos. Se você começar com uma resposta de 2010, não poderá fazer da resposta de 2015 sua segunda resposta, porque 2015 não é anterior a 2010.
- Se possível, escreva seu código para que ele funcione na primeira versão do seu idioma (ou na versão mais antiga possível). (Isso não é um requisito, pois pode ser difícil encontrar compiladores / intérpretes antigos para alguns idiomas.)
- Evite postar um idioma que já tenha sido publicado, a menos que a resposta publicada tenha erros significativos ou você tenha uma maneira muito diferente de concluir as tarefas.
- Jogar golfe com seu código é bom, mas não obrigatório.
- Uma nova linha à direita na saída de qualquer programa é boa.
- Para as tarefas 2 e 3, todos os valores de entrada abaixo de um máximo razoável, como 2 16, devem funcionar (256 no mínimo).
- Seu idioma deve ter existido antes que esta pergunta fosse publicada.
- Linguagens de programação muito antigas podem ter diferentes formas de entrada e saída do que pensamos hoje. Isto é bom. Complete as tarefas da melhor maneira possível no contexto do seu idioma.
Pontuação
A pontuação do seu envio é:
upvotes - downvotes + (2015 - languageYear) / 2
Assim, 0,5 é adicionado à contagem de votos para cada ano antes de 2015, dando a vantagem para os idiomas mais antigos. A finalização com a pontuação mais alta vence.
Lista de respostas
O snippet de pilha abaixo lista todas as respostas válidas de acordo com o ano do idioma.
Você deve iniciar sua postagem com esta linha de Markdown para garantir que ela esteja listada corretamente:
#[year] - [language name]
Por exemplo:
#1991 - Python
O nome do idioma pode estar em um link (será o mesmo link na lista de respostas):
#1991 - [Python](https://www.python.org/)
As respostas que não seguem esse formato, ou têm um ano que ainda não é permitido, ou são de um usuário que já respondeu nos últimos 5 anos são marcadas como inválidas.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><script>$(function(){function e(e,r){var a="https://api.stackexchange.com/2.2/questions/48476/answers?page="+e.toString()+"&pagesize=100&order=asc&sort=creation&site=codegolf&filter=!YOKGPOBC5Yad160RQxGLP0r4rL";$.get(a,r)}function r(e){if(e.items.forEach(function(e){var r=e.link,a=e.owner.display_name,i=e.body.match(/<h1\b[^>]*>(\d{4}) - (.*?)<\/h1>/);if(i&&i.length>=3)var h=parseInt(i[1]),u=i[2];h&&u&&n>=h&&h>=t&&(!d.hasOwnProperty(e.owner.user_id)||d[e.owner.user_id]-h>=p)?(d[e.owner.user_id]=h,h==t&&--t,o.hasOwnProperty(h)||(o[h]=[]),o[h].push({language:u,user:a,link:r,score:e.score+(n-h)/2})):s.push(' <a href="'+r+'">'+a+"</a>")}),e.has_more)runQuery(++a,r);else{for(var i=n,h=[];o.hasOwnProperty(i);){for(var u=$("<tr>").append($("<td>").text(i.toString())),l=$("<td>"),c=$("<td>"),g=$("<td>"),f=0;f<o[i].length;f++){var v=o[i][f];l.append(v.language),c.append($("<a>").html(v.user).attr("href",v.link)),g.append(v.score),f+1<o[i].length&&(l.append("<br><br>"),c.append("<br><br>"),g.append("<br><br>"))}u.append(l).append(c).append(g),h.push(u),--i}$("#answers").find("tbody").append(h),s.length>0?$("#invalid").append(s):$("#invalid").remove()}}var a=1,n=2015,t=n-1,p=5,o={},s=[],d={};e(1,r)})</script><style>html *{font-family: Helvetica, Arial, sans-serif;}table{border: 4px solid #a4a; border-collapse: collapse;}th{background-color: #a4a; color: white; padding: 8px;}td{border: 1px solid #a4a; padding: 8px;}div{font-size: 75%;}</style><table id='answers'> <tr> <th>Year</th> <th>Language</th> <th>User (answer link)</th> <th>Score</th> </tr></table><div id='invalid'><br>Invalid Answers:</div>
fonte
Respostas:
2013 - Dogescript
Dogescript é uma linguagem criada em 2013 por Zach Bruggeman. Nada mais é do que uma substituição de sintaxe para o Javascript fazê-lo ler como os monólogos internos do memético Shiba Inus.
Hello doge
Arte ASCII
GCD
fonte
s[i]
pouco também!2015 - Retina
O Retina é uma linguagem de programação baseada em regex, que escrevi para poder competir nos desafios do PPCG com respostas somente regex, sem a sobrecarga desnecessária de chamar o regex em alguma linguagem host. Retina é Turing-completa. Para provar isso, implementei um solucionador de sistema de 2 marcas e a Regra 110 . É escrito em C #, portanto, suporta o sabor .NET (por padrão) e o sabor ECMAScript (por meio de um sinalizador).
O Retina pode operar em vários modos, mas o mais relevante para cálculos (e o Turing-complete) é o modo Substituir. No modo Substituir, você fornece à Retina um número par de arquivos de origem. Estes são então emparelhados, o primeiro de cada par sendo uma expressão regular e o segundo uma substituição. Estes são então executados em ordem, manipulando a entrada passo a passo. O regex também pode ser precedido por uma configuração (delimitada por
`
). A opção mais importante (que torna o Retina Turing completo) é o+
que faz com que o Retina aplique a substituição em um loop até que o resultado pare de mudar. Nos exemplos a seguir, também estou usando;
, que suprime a saída nos estágios intermediários.Em cada um dos seguintes envios, cada linha entra em um arquivo de origem separado. (Como alternativa, você pode usar a nova
-s
opção e colocar todas as linhas em um único arquivo.) Arquivos / linhas vazios são representados como<empty>
. Arquivos / linhas contendo um único espaço são representados como<space>
.As explicações são bastante longas, então as mudei para o final do post.
Os programas
"Olá Mundo!" Variante
ASCII Art N
Isso pressupõe que STDIN seja finalizado com uma nova linha.
GCD
Isso requer que o STDIN não seja finalizado com uma nova linha.
Explicações
"Olá Mundo!" Variante
Isso é bastante trivial. Não recebe entrada (isto é, uma string vazia), não corresponde a nada e a substitui por
Retina was made in 2015!
. Pode-se também fazê-lo funcionar para entradas arbitrárias, substituindo o padrão por[\s\S]*
por exemplo. Isso consumiria STDIN e substituiria tudo pela saída.ASCII Art N
Isso tem várias etapas. A idéia é converter a entrada em unária, criar um bloco N x N de
N
se "entalhar" dois triângulos. Vamos passar pelos estágios individuais. Lembre-se de que;
apenas suprime as saídas intermediárias, mas+
faz com que a substituição seja aplicada em um loop.Simples: acrescente
#
a à entrada. Isso será usado como um marcador na conversão para unário.Isso converte um dígito em unário. Ele pega os dígitos já convertidos
(\d*)
e os repete 10 vezes. E então pega o próximo dígito e acrescenta o número apropriado de dígitos. O valor real dos dígitos é irrelevante neste estágio. Quando#
chega ao final do número, a regex não corresponde mais e a conversão é feita. Como exemplo, o número127
será processado comoonde a última linha contém exatamente 127 caracteres.
Dois estágios simples que se livram disso
#
e convertem todos os dígitos paraN
. A seguir, usarei a entrada7
como exemplo. Então agora nós temosO próximo estágio
substitui cada
N
uma pela sequência inteira (lembre-se de que ela contém uma nova linha à direita) e também remove a própria linha à direita. Portanto, isso transforma a única linha em uma grade quadrada:Agora o triângulo superior. Primeiro, começamos transformando o N no canto inferior direito em um espaço:
O lookahead garante que estamos modificando o correto
N
. Isto dáE agora
é uma regex que corresponde a uma
N
que está acima ou no canto superior esquerdo de um caractere de espaço e a substitui por um espaço. Como a substituição é repetida, trata-se essencialmente de um preenchimento de inundação, que transforma o terceiro octante do espaço inicial em mais espaços:E, finalmente, repetimos a mesma coisa com o triângulo inferior, mas usamos um caractere diferente, para que os espaços já existentes não causem um preenchimento incorreto:
define a semente:
Então
faz a inundação.
E finalmente
Transforma isso
S
em espaços e pronto:GCD
GCD em unário é realmente muito trivial com regex. A maior parte disso consiste na conversão de decimal em unário e de unário em decimal. Isso pode ser feito de forma mais compacta, mas este não é um código de golfe, então ...
Esses estágios são essencialmente os mesmos que acima, exceto que os dois números de entrada são convertidos e o resultado usa
1
s em vez deN
s (não que isso importe). Então, se a entrada foi18 24
, isso produziriaAgora
é todo o cálculo do GCD. Combinamos um divisor comum capturando um número de
1
s e, em seguida, usando referências anteriores para garantir que ambos os números possam ser gravados repetindo essa sequência (e nada mais). Devido a como o backtracking funciona no mecanismo regex (ou seja, que.+
é ganancioso), isso sempre gera o maior divisor comum automaticamente. Como a partida abrange toda a sequência, simplesmente escrevemos de volta o primeiro grupo de captura para obter nosso GCD.Finalmente, a conversão de unário para decimal ...
Anexe um marcador
#
, um delimitador:
e todos os dígitos à sequência. Isso é necessário, porque você não pode produzir novos caracteres condicionalmente em uma substituição de regex. Se você deseja uma substituição condicional, é necessário extrair os caracteres da própria string, então os colocamos lá.Este é o inverso da expansão unária anteriormente. Encontramos o maior múltiplo de 10 que se encaixa na cadeia atual. Em seguida, escolhemos o próximo dígito com base no restante e dividimos o múltiplo por 10, enquanto movemos o marcador pelos dígitos.
E, finalmente, apenas uma etapa de limpeza para se livrar do marcador, do delimitador e dos dígitos auxiliares.
fonte
2013 - Snap !
Snap ! é uma linguagem baseada no Scratch , criada na Universidade de Berkeley. É uma atualização para o Scratch, com dados de primeira classe e blocos personalizados (funções). Como o Scratch, não é baseado em texto, mas sim por "blocos" visuais que se encaixam.
Snap ! , escrito em JavaScript, é o sucessor do BYOB, que foi escrito no Squeak Smalltalk. Snap ! foi lançado para consumo público em março de 2013 .
Snap ! na verdade não é uma linguagem esotérica. É usada como linguagem de programação para a Beauty and Joy of Computing (BJC) curso AP CS em Berkeley e outros.
Eu ajudei com testes e outras coisas.
Variante "Hello World"
ASCII Art "N"
Isso usa o stdlib para alguns dos blocos.
Um loop bastante básico aqui. Recebe uma entrada. Depois, adicionamos tudo e dizemos (resultado para n = 5):
Tomei a liberdade aqui para usar apenas 2 espaços em vez de 1, porque Snap! não diz coisas no espaço aeroespacial.
GCD
O algoritmo euclidiano não é muito rápido, mas funciona e é bastante simples. (Desculpe, cometi um erro de digitação no nome do bloco. Agora fechei a guia sem salvá-lo. Só terá que ficar.)
Essa definição de função produzirá este bloco:
fonte
2007 - LOLCODE
História do idioma
LOLCODE foi criado em 2007 por Adam Lindsay, pesquisador da Universidade de Lancaster. Sua sintaxe é baseada nos memes lolcats popularizados pela Cheezburger, Inc.
"Olá Mundo!" Variante
ASCII Art N
Os valores são lidos como cadeias (YARNs) de stdin usando
GIMMEH
. Eles podem ser convertidos em numéricos (NUMBRs) multiplicando por 1.Os valores são impressos em stdout usando
VISIBLE
. Por padrão, uma nova linha é anexada, mas pode ser suprimida adicionando um ponto de exclamação.GCD
SMOOSH
executa concatenação de string.fonte
IM IN YR toilet UPPIN YR butt
Nomes de variáveis agradáveisx1
,x2
, etc.1982 - PostScript
PostScript é uma linguagem para criar gráficos vetoriais e impressão.
A Adobe foi fundada em 1982 e seu primeiro produto foi o PostScript. A linguagem foi usada nas impressoras: os comandos são interpretados pela impressora para criar uma imagem rasterizada, que é impressa na página. Foi um componente muito comum das impressoras a laser nos anos 90. Mas obviamente é bastante intensivo de CPU na impressora e, à medida que os processadores do computador se tornaram mais poderosos, fazia mais sentido fazer a rasterização no computador do que na impressora. O PostScript desapareceu amplamente em impressoras de consumo, embora ainda exista em muito mais impressoras de ponta.
O padrão que substituiu o PostScript é um formato pouco conhecido chamado PDF.
O PostScript ficou fora de moda quando comecei a programar, mas aprendi um pouco enquanto estava na universidade como outra maneira de criar documentos para o TeX. Era bem diferente de outras linguagens de programação que eu tinha usado (notação de infixo reverso, empilhamento, impressão em uma página em vez de em um console), mas foi bom tirar o pó dessa linguagem antiga por um pouco de diversão.
Como o PostScript é uma linguagem de impressão, parece mais apropriado usá-lo para imprimir algo e enviar uma saída para o console.
Tarefa 1
As primeiras linhas configuram uma tela para desenhar. Em seguida, o
moveto
comando diz ao PS para desenhar em uma posição específica eshow
imprime a string na página. Observe que os parênteses marcam uma sequência em PostScript, não as aspas.Tarefa 2
Eu escrevi uma função para desenhar a “arte ASCII” N, mas não há como as funções PostScript argumentarem. Em vez disso, você envia seus argumentos para a pilha e os recupera. Essa é a
/x exch def
linha.Um exemplo: suponha que a pilha seja
8 9 2
. Primeiro, colocamos o nome/x
na pilha, para que a pilha seja8 9 2 /x
. Oexch
operador troca os dois valores da pilha, agora a pilha é8 9 /x 2
. Em seguida,def
aparece os dois principais valores da pilha e define/x
como tendo o valor2
. A pilha está agora8 9
.Quando comecei a usar o PostScript, achei isso um pouco confuso. Eu li sobre a pilha como um conceito teórico, mas essa foi a primeira vez que a usei na prática.
O restante da função é um código de desenho: comece no canto inferior direito, preenchendo uma linha por vez da esquerda para a direita para a diagonal.
Tarefa 3
Novamente, usei uma forma do algoritmo de Euclides, mas esqueci que o PostScript possui um operador de módulo embutido, então tive que escrever o meu. Isso acabou sendo um lembrete útil das restrições da programação baseada em pilha. Minha primeira implementação de
modulo
foi baseada em recursão:o que é bom até você tentar executar isso quando
x
é grande ey
é pequeno (por exemplo, 5689 e 2). Você só pode ter até 250 elementos na pilha, e eu estava ultrapassando o limite da pilha. Opa Eu tive que voltar para a prancheta nessa.O próprio código GCD é bastante simples. Mas, assim como as funções não podem receber argumentos, elas não têm valores de retorno. Em vez disso, você deve enviar o resultado para a pilha, onde outra pessoa pode retirá-lo mais tarde. Isso é o que
a
eb a gcd
linhas : quando terminam de avaliar, colocam o valor na pilha.Se você colocar todo o código em um documento e imprimi-lo, é assim que a saída será:
fonte
2009 - > <>
Inspirado no Befunge,> <> (Fish) é uma linguagem 2D esotérica baseada em pilha, ou seja, o fluxo do programa pode ser alto, baixo, esquerda ou direita. A versão inicial de> <> apresentava multithreading onde
[
e]
criou e terminou, mas por motivos de simplicidade, essas instruções foram alteradas para criar e remover novas pilhas, respectivamente.O intérprete oficial atual de> <> pode ser encontrado aqui . Infelizmente, o link para o antigo intérprete no wiki da Esolang está quebrado.
"Olá Mundo!" Variante
Observe como a string é escrita de trás para frente -> <> tecnicamente não tem strings, com o único tipo de dados sendo uma mistura estranha de char, int e float.
"
alterna a análise de sequência, empurrando cada caractere para a pilha até que um fechamento"
seja alcançado.A segunda metade do código empurra o comprimento da pilha
l
, verifica se é zero?!
e se o programa termina;
. Caso contrário, o ponteiro de instruções continuará, exibindo a parte superior da pilhao
antes de executarbb+0.
, que teleporta o ponteiro para a posição(22, 0)
imediatamente antes dol
, criando um loop.ASCII Art N
Com espaçamento para maior clareza. Você pode tentar isso no novo intérprete on-line aqui e ver o ponteiro de instruções girar e girar - lembre-se de inserir um número na caixa de texto "Pilha inicial". Se você estiver executando através do interpretador Python, use o
-v
sinalizador para inicializar a pilha, por exemploPara este programa, colocamos a entrada
n
no registro com&
e pressionamos um 0, que chamaremosi
de "iterações". O resto do programa é um loop gigante que é assim:Então repetimos o loop desde o início.
As setas
^>v<
mudam a direção do fluxo do programa e os espelhos/\
refletem a direção do fluxo do programa.GCD
Aqui está um exemplo de como pode ser um programa de golfe <>>. Mais uma vez, você pode tentar isso no intérprete online (digite dois valores separados por vírgula na caixa "Pilha inicial", por exemplo
111, 87
) ou usando o-v
sinalizador do intérprete Python, por exemploEste programa usa o algoritmo euclidiano. Aqui está um GIF que eu preparei anteriormente:
Observe que> <> é toroidal; portanto, quando a
v
instrução inferior esquerda é executada, o ponteiro da instrução desce, gira e volta a aparecer na parte superior.Edit: Ao fazer o código rodar inteiramente da direita para a esquerda , o @randomra conseguiu raspar três bytes com
Acho que não joguei o suficiente :)
fonte
><>
é um palíndromo.2012 - Elemento
Essa é uma linguagem que eu inventei no início de 2012 para ser uma linguagem simples de golfe. Com isso, quero dizer que há muito pouca ou nenhuma sobrecarga de operador. Os operadores também são mais simples e têm menor número do que a maioria das linguagens de golfe modernas.
As características mais interessantes dessa linguagem são suas estruturas de dados. Existem duas pilhas e um hash que são usados para armazenar informações.
A pilha m é a pilha principal, onde ocorrem operações aritméticas e a maioria das outras operações. Quando os dados são inseridos ou impressos, é para onde eles vão ou são recuperados.
A pilha c é a pilha de controle. É aqui que a aritmética booleana ocorre. Os valores superiores da pilha c são usados pelos loops If e While como a condição.
O hash é onde as variáveis são armazenadas. O
;
e~
armazena e recupera dados do hash, respectivamente.Elemento é uma linguagem de tipo muito fraco. Ele usa a capacidade do Perl de interpretar livremente números como strings e vice-versa.
Enquanto estou nisso, posso incluir toda a documentação do idioma. Você pode encontrar o intérprete original de 2012, escrito em Perl, aqui . Atualização: eu criei uma versão mais utilizável, que você pode encontrar aqui .
Tarefa 1 - Imprimir texto
Uma das partes mais estranhas da linguagem é a falta de delimitadores de strings, e é por isso que caracteres de escape são necessários nessa string. O
`
no final imprime a string.Tarefa 2 - ASCII Art N
Aqui, você testemunhará alguma manipulação de pilha. Para facilitar a formatação da explicação, substituirei a nova linha por um
L
e o espaço por umS
.Depois de fazer algumas jogadas extremas nessa resposta, encontrei uma solução de 39 bytes, embora seja muito mais complicada.
Tarefa 3 - GCD
Este é um método baseado em pilha.
fonte
2012 - Julia
História do idioma
Julia foi desenvolvida em 2012 por Jeff Bezanson, Stefan Karpinski e Viral Shah, enquanto Jeff estudava no Instituto de Tecnologia Massachussets (MIT), orientado pelo professor Alan Edelman. Eles foram motivados pelo desejo de uma linguagem de programação de código aberto, rápida e dinâmica (entre muitas outras coisas), mantendo a facilidade de uso em uma variedade de aplicativos. O produto foi Julia, uma nova abordagem para a computação científica de alto desempenho.
"Olá Mundo!" Variante
Imprimir em STDOUT em Julia é bastante simples!
ASCII Art N
O código é recuado para facilitar a leitura, mas Julia não impõe restrições ao espaço em branco.
GCD
A última coisa listada na função é retornada implicitamente.
fonte
1988 - Mathematica
Ou devo chamá-lo Wolfram Language ?
Tarefa 0
O criador do Mathematica é Stephen Wolfram, o Fundador e CEO da Wolfram Research. Antes do desenvolvimento do Mathematica, ele era físico. Havia uma enorme quantidade de cálculo algébrico em física, então ele se tornou um usuário de Macsyma .
Wolfram obteve seu doutorado em 1979, quando tinha 20 anos. Ele achava que precisava de um CAS melhor que Macsyma para fazer física, então começou a escrever SMP (o "Programa de Manipulação Simbólica"). A primeira versão do SMP foi lançada em 1981. O SMP foi o antecessor do Mathematica. Embora tenha tido uma influência profunda no Mathematica, nenhum de seu código foi usado para o Mathematica.
Em 1986, Wolfram decidiu escrever um "sistema de computação final". Ele começou a escrever o código em 1986 e fundou a Wolfram Research em 1987. Finalmente, o Mathematica 1.0 foi lançado em 23 de junho de 1988.
Não encontrei o Mathematica 1.0. De fato, o Mathematica 1.0 não tinha uma versão para Windows nem para Linux. Mas eu encontrei o Mathematica 2.0 em um site chinês. Ainda pode ser executado no Windows XP.
Tarefa 1
Ou simplesmente:
Tarefa 2
No Mathematica de hoje, podemos escrever:
Assim como Julia e R , esta é uma solução matricial. No Mathematica, você pode definir uma matriz esparsa usando a correspondência de padrões.
No entanto,
SparseArray
foi introduzido no Mathematica 5.0, portanto, não podemos usá-lo no Mathematica 1.0.Aqui está uma solução que funciona no Mathematica 1.0:
Não podemos escrever
f[i_, 1 | i_ | n] = "N"
porqueAlternatives
foi introduzido no Mathematica 2.0.Tarefa 3
Podemos apenas usar a função interna:
Ou podemos usar a definição do GCD:
Ou podemos usar o LCM , embora o LCM seja mais comumente calculado a partir do GCD:
Ou podemos usar o algoritmo euclidiano com correspondência de padrões:
Ou como uma função anônima:
Todas as funções acima foram introduzidas no Mathematica 1.0.
fonte
1999 - XSLT
O World Wide Web Consortium (W3C) criou o XSLT para transformar XML em HTML, texto etc. Os exemplos a seguir pressupõem que a entrada esteja entre
<input>..</input>
tags.Tarefa 1
Este é simples. Ele corresponde a uma
input
tag no nível superior e a substitui pela saída desejada.Tarefa 2
Este define 2 modelos recursivos,
loop
espaces
.loop
com parâmetrosi
en
irá gerar a saída desejada paran
, começando na posiçãoi
.spaces
com parâmetron
irá gerarn
espaços.Tarefa 3
A entrada para isso deve estar em
<input><num>..</num><num>..</num></input>
tags.Este é apenas um modelo recursivo
gcd
que usa o algoritmo euclidiano.fonte
2014 - CJam
O CJam foi criado pelo usuário do PPCG aditsu e foi lançado em abril de 2014 .
"Olá Mundo!" Variante
CJam imprime automaticamente o conteúdo da pilha no final do programa
ASCII Art N
Explicação do código:
Toma a altura / largura de N como entrada via STDIN. Experimente online aqui
GCD
Toma os dois números como entrada via STDIN. Experimente online aqui
fonte
ri_S*0'NtW'Nta1$*\,Sf*'Nf+..e>N*
o CJam moderno.1990 - Haskell
Haskell é uma linguagem funcional pura popular (ou devo dizer: a mais popular ?). Destaca-se do mainstream por seu modelo de avaliação incomum (por padrão, tudo é preguiçoso ou, tecnicamente, não-estrito) e por seu sistema de tipo baseado em Hindley-Milner que, ainda hoje, ainda está entre os mais poderosos por aí.
Tarefa 1
Tarefa 2
Demo, imprima a lista infinita inteira (até o usuário ser abortado ou o mundo acabar ...)
Obviamente, você pode acessar facilmente um deles acessando apenas um elemento da lista infinita:
Tarefa 3
fonte
1972 - INTERCAL
E você pensou que Fortran e Cobol eram estranhos. Isso é uma loucura!
Tarefa 1
Não vou tentar explicar o sistema de entrada e saída da INTERCAL; apenas leia isso e espero que você não morra.
Tarefa 2
Graças a Deus. Isso me levou um pouco para descobrir. Os números das etiquetas estão uma bagunça e, portanto, refletem isso. Não vou tentar explicar isso, a menos que alguém pergunte.
Tarefa 3
Este é um pouco mais simples. Por causa da estranheza da INTERCAL, você precisa digitar os números assim:
Por exemplo, para obter o MDC de 42 e 16, digite:
Também imprime o número em algarismos romanos ... porque é INTERCAL para você!
fonte
PLEASE GIVE UP
. Eu já fiz isso .-.1967 - APL
Em 1957, na Universidade de Harvard, Ken Iverson começou a desenvolver uma notação matemática para manipulação de array. Durante a década de 1960, sua notação foi desenvolvida em uma linguagem de programação na IBM. A primeira implementação parcial foi criada em 1963 e foi usada até no ensino médio para ensinar aos alunos sobre funções transcendentais. Uma implementação completa e utilizável teve que esperar até 1965. Por dois anos, foi usada apenas internamente pela IBM. Em 1967, a IBM lançou ao público um intérprete de APL que rodava no computador IBM 1130, que havia sido concluído em 1966. Você pode entender como é um pouco difícil escolher um ano para ele; no entanto, acho que deveria ser 1967, como este é o primeiro ano, uma implementação completa foi disponibilizada ao público. Se alguém realmente discordar, eu poderia mudar.
O código fonte do APL \ 360 está online , assim como um emulador. É isso que eu usei para testar esses exemplos. Data de 1967 e, juntamente com o APL \ 1130 (para o IBM 1130 acima mencionado), é mais ou menos o verdadeiro original. Como esperado, é muito primitivo. Falta suporte para detalhes como letras minúsculas, qualquer operador trabalha apenas com funções internas e o conjunto de funções internas é muito escasso (em particular,
∨
é apenasor
e não é o dobrogcd
). A descrição original e completa está disponível aqui , no entanto, notei que a versão que eu tinha nem sequer é completa com relação a esse documento, faltando⍎
entre outras.Forneci os programas no formato Unicode (para que você possa lê-los) e na codificação original (para que você possa recortá-los e colá-los na janela APL do emulador).
Inacreditavelmente, esses programas são executados corretamente, sem nenhuma alteração (exceto a codificação) nas versões modernas do Dyalog, NARS2000 e GNU APL. Acho que encontrei o caminho para escrever APL portátil: apenas finja que é 1967!
Tarefa 1:
Unicode:
APL \ 360:
Tarefa 2:
Unicode:
APL \ 360:
Tarefa 3:
Eu resolvi isso da maneira recursiva padrão. Em teoria, você poderia fazer algo inteligente e orientado a matriz, como a resposta J; na prática, no entanto, isso tem uso de memória O (N) e supera rapidamente o hardware e o software da era Flower-Power.
Unicode:
APL \ 360:
fonte
1996 - Ocaml
Estava esperando mais de um dia para alguém preencher 1996, para que eu pudesse preencher Ruby. Bem, por que não aprender OCaml então, parece semelhante ao haskell ...
Olá Mundo
ASCII
Cordas mutáveis!
GCD
Não
==
e infixmod
, isso é fofofonte
2005 - Prelúdio
O prelúdio é uma linguagem muito divertida, cujo código fonte consiste em várias "vozes" executadas em paralelo e nas quais eu realmente gosto de resolver problemas . Pretende ser a representação ASCII da sua língua irmã Fugue , que na verdade leva arquivos .midi como seu código-fonte e codifica as instruções encontradas no Prelude como intervalos nas melodias das vozes.
O prelúdio é bastante minimalista, mas Turing está completo (desde que você esteja usando pelo menos duas vozes). Como eu disse, as vozes (linhas de código) são executadas simultaneamente, coluna por coluna. Cada voz opera em sua própria pilha, que é inicializada com um número infinito de zeros. O Prelude suporta as seguintes instruções:
Algumas notas adicionais:
^
na voz superior, copia a voz inferior (e vice-versa).?
e!
na mesma coluna são executados de cima para baixo.?
e!
ler e escrever caracteres com o código de caractere correspondente. No entanto, o interpretador Python também possui uma opção em seu código para imprimir os próprios números. Para fins de teste, na verdade, estou usando uma versão modificada que também pode ler números em vez de caracteres. Mas o consenso por aqui é que a entrada / saída numérica pode realmente ser fornecida como valores de bytes, portanto, essas modificações não são necessárias para criar programas válidos que lidem com números.(
e)
não precisa estar na mesma voz. A voz usada para a condição é sempre a que(
aparece. Portanto, a posição vertical do)
é totalmente irrelevante.(
é executada apenas uma vez antes do início do loop e independentemente de o loop ser inserido. Da mesma forma, qualquer instrução na mesma coluna que a)
é executada no final de cada iteração, independentemente de o loop ser encerrado após essa iteração.Primeiro, mostrarei os três programas sem muito comentário. Você pode encontrar explicações abrangentes abaixo.
Os programas
"Olá Mundo!" Variante
Se você estiver usando o interpretador Python, verifique isso
NUMERIC_OUTPUT = False
.ASCII Art N
Para facilitar o uso, este programa se beneficia da leitura de entradas como números, mas a saída não deve ser numérica. Portanto, se você estiver usando o interpretador Python modificado, defina
GCD
É melhor usado com todas as entradas / saídas numéricas, ou seja,
Explicações
"Olá Mundo!" Variante
Isso é bastante direto. Estou usando três vozes para gerar sucessivamente os códigos de caracteres para todos os caracteres
Prelude was made in 2005!
. Começo pela computação8 + 9*8 = 80
, que é o código de caractere deP
:Depois disso, geralmente copio o código de caractere anterior e adiciono ou subtrai a diferença para o próximo. Aqui está o código, mas cada um deles é
!
substituído pelo caractere que está sendo impresso (e_
pelos espaços e%
pelos dígitos):A final
55+!
imprime uma nova linha à direita, apenas porque é melhor.Como observação lateral, o número de vozes é bastante arbitrário para esta tarefa, mas 3 é bastante conveniente, porque é o maior número no qual cada voz pode acessar diretamente uma a outra.
ASCII Art N
Com 5 vozes, esse é definitivamente um dos programas mais complexos que escrevi até agora. As vozes têm aproximadamente os seguintes objetivos:
N-1
para uso no loop interno.32
conveniente para impressão.78
para imprimir convenientementeN
s.Vamos analisar o código parte por parte. Primeiro, estou criando o
32
as-4 + 9*4
e o78
as6 + 9*8
:Agora, estou imprimindo uma única
N
(porque sempre precisamos de uma) enquanto lê a entradaN
e o armazenamentoN-1
eN-2
nas duas primeiras vozes:A seguir, há um "loop" condicionado
N-1
. No final do loop, a segunda voz é sempre reduzida para0
e o loop sai após a primeira iteração. Então, essencialmente, apenas issoif(N > 1){...}
. Após o loop, imprimimos uma nova linha final à direita. Para recapitular, agora temos a seguinte estrutura:Dentro desse condicional, primeiro
N-2
espaços e um únicoN
para concluir a primeira linha e também armazenamosN-1
na primeira voz para uso futuro:Agora, a verdadeira carne do código. Primeiro, há um loop externo, que imprime
N-1
linhas. Para cada linha, primeiro imprimimos uma nova linha e umN
. Depois, repetimos osN-2
tempos, imprimindo espaços ouN
s (mais sobre isso mais tarde). E finalmente imprimimos outroN
:Finalmente, a parte divertida: imprimir cada linha (e obter a posição
N
correta). Não há realmente um if / else no Prelude, então eu tenho que construí-lo usando dois loops em vozes diferentes. A condição pode ser facilmente obtida subtraindo a variável de loop interno e externo - obtemos0
se queremos imprimirN
e algo diferente de zero se queremos imprimir um espaço.A idéia básica de um if / else no Prelude é colocar um loop após o valor relevante - o código "if" (ou diferente de zero) e sair imediatamente pressionando a
0
. Em outra voz, você mantém um valor diferente de zero e outro loop após o loop "if". Durante o loop "if", você coloca um zero em cima dessa outra voz, para impedir que o "else" seja executado. Existe alguma flexibilidade em você colocar valores zero em cima de valores diferentes de zero ou simplesmente descartar o valor diferente de zero se houver um zero abaixo, mas essa é a ideia geral. Você também pode precisar fazer uma limpeza depois, se quiser continuar usando a voz relevante. É assim que o código se parece:E é isso!
GCD
Esta é "apenas" uma implementação iterativa do algoritmo euclidiano. Mas o módulo no Prelude é um pouco chato, principalmente porque você não pode verificar facilmente se um número é positivo ou negativo. Este código utiliza uma implementação de signum que escrevi há algum tempo . Ou seja, uma grande parte do código apenas transforma um número em
-1
,0
ou1
. Isso pode ser facilmente transformado em uma condição para números positivos ou negativos, adicionando ou subtraindo1
.Então, temos quatro vozes dessa vez. A primeira voz simplesmente rastreia
b
e contém a principal condição de terminação (ou seja, o loop sai quandob
se torna0
). A segunda voz contéma
e com a ajuda das vozes três e quatroa % b
, antes de trocar o resultado pelo anteriorb
. Finalmente, as!
impressõesa
quandob == 0
.Vejamos a parte do sinal primeiro:
O número de entrada
n
é encontrado na primeira dessas vozes (a segunda voz no programa completo). O resultado terminará na voz inferior. As outras duas vozes devem estar vazias (ou seja, preenchidas com zeros). Observe que, sen == 0
ambos os loops forem ignorados e a voz inferior ainda contiver0
exatamente o que queremos.Se
n
for diferente de zero, o primeiro loop pequeno será inserido. Pressionamos o zero para sair imediatamente, colocamos duas cópiasn
na voz do meio e uma1
na voz de baixo. Agora, a idéia básica é incrementar uma das cópiasn
enquanto diminui a outra cópian
até que uma delas atinja zero. Ao fazê-lo, a1
voz inferior apaga seu sinal o tempo todo (o que é facilmente feito subtraindo-o de0
baixo da pilha). Isso é configurado para que, quando um dos números chegar a zero, a voz inferior conterá o sinal correto.Agora o módulo é implementado subtraindo
b
dea
até o resultado ser negativo. Quando isso acontece, adicionamos umb
novamente. É esse pedaço:Observe a construção if / else na parte inferior, que é semelhante à que usei para a Tarefa 2.
fonte
2007 - Raspadinha
Scratch é uma linguagem criada pelo MIT para fins educacionais. Eu estive muito envolvido com isso por 5 anos; mais sobre isso mais tarde.
Tudo isso pode ser visto aqui .
Estou muito apressado agora e explicarei os trechos mais tarde. Espero que eles sejam muito auto-explicativos.
Tarefa 1
Tarefa 2
Tarefa 3
fonte
1972 - C
Todos nós sabemos sobre C, não é? C foi criado no Bell Labs, juntamente com o Unix. O Unix foi amplamente escrito em C. Todos os derivados modernos do Unix ainda são amplamente escritos na sintaxe de C. C influenciou muitas e muitas linguagens de programação. É provavelmente a linguagem de programação mais antiga que ainda é amplamente utilizada para novos desenvolvimentos.
C em si é um descendente de B, que espero que também termine nesta lista. Não havia linguagem de programação 'A': B é uma variante do BCPL, que por sua vez é uma CPL reduzida. Nenhuma dessas línguas foi muito popular. No entanto, BCPL era o idioma em que o primeiro programa "Hello World" foi escrito. Outro fato interessante é que B tinha ambos
/* */
e//
comentários, mas C descartou os//
comentários. Mais tarde, eles foram reintroduzidos em C com o padrão C99.Os programas C aqui foram testados com o compilador Unix V5 C, de 1974. Este foi o compilador C mais antigo que eu pude encontrar e começar a trabalhar, e esses programas não serão compilados em um compilador C moderno. (Uma das alterações feitas é que os operadores de mutação
+=
costumavam ser escritos=+
.)#include <
...>
ainda não existia. Nem grande parte da biblioteca padrão. Eu tive que escrever o meuatoi
. Examinei alguns dos códigos-fonte da V5 para descobrir quais coisas eram permitidas e quais não eram. A versão que usei foi a primeira a incluirstruct
s, mas como não os usei e a sintaxe parece não ter mudado muito até a V7 (como K&R C), isso também pode funcionar com versões anteriores.Fiz o possível para escrever meu código no mesmo estilo que o código-fonte V5 usa. (Não que isso seja terrivelmente consistente.)
Procure aqui links para o Unix V5, um emulador, e instruções sobre como executá-lo em um computador moderno.
Tarefa 1
Tarefa 2
Tarefa 3
fonte
cat > file.c
. (Termine com Ctrl-D, como sempre). Além disso, C mudou menos do que você pode pensar: se você trocar o=*
e=+
nasatoi
funções para os equivalentes modernos*=
e+=
, um GCC moderna vai compilá-los bem e eles correm, também. Quase nenhum aviso, até.2009 - Idris
Idris é uma linguagem funcional pura, tipicamente dependente, que enfatiza ser praticamente utilizável para aplicativos do mundo real, além de oferecer as possibilidades de prova extremamente rigorosas que são possíveis com os tipos dependentes.
Tarefa 1
Tarefa 2
Este não é um programa, mas apenas uma função (mais precisamente, valor dependente ), produzindo a letra N desejada como uma matriz bidimensional.
Tarefa 3
Note que eu tive que escolher o nome
gcd'
porque, comogcd
já está definido no prelúdio de Idris.fonte
:
e::
, e mudou_
paraZ
.Z
é realmente o construtor de0 : Nat
. O sublinhado é usado em Idris, assim como em Haskell.:)
2014 - Pyth
Como temos o CJam, também podemos ter o Pyth para completar :)
Pyth é uma língua de golfe da @isaacg, compilada no Python. É notável por ser processual e por usar a notação de prefixo. Pyth apareceu pela primeira vez em junho de 2014 .
"Olá Mundo!" Variante
Observe a falta de uma cotação de fechamento, que é opcional se um programa Pyth terminar em uma sequência.
ASCII Art N
Experimente online . O Python equivalente é:
Ou expandido (a primeira e a terceira linhas estão implícitas):
GCD
Este programa usa o algoritmo euclidiano e recebe dois números separados por uma nova linha. Experimente online .
i.uQ
é ainda mais curto se usarmos o built-in para o GCD. Isso é equivalente aprint(gcd(*eval(input())))
(receber dois números separados por vírgula como entrada).fonte
1964 - Dartmouth BASIC
BASIC é uma família de linguagens de programação de alto nível e uso geral cuja filosofia de design enfatiza a facilidade de uso. Em 1964, John G. Kemeny e Thomas E. Kurtz projetaram o idioma BASIC original no Dartmouth College, em New Hampshire. Eles queriam permitir que estudantes de outras áreas além da ciência e da matemática usassem computadores.
Estou vendo este manual no BASIC de 1964 e este emulador do Darthmouth Time Sharing System em que ele foi executado. O servidor ainda está ativo, mas, infelizmente, o registro de uma conta parece impossível. Por enquanto, esses programas devem, teoricamente, funcionar:
Tarefa 1
Tarefa 2
Saída algo como:
Observe como a entrada é digitada como parte do programa (
70 DATA 5
); oREAD
modo de instrução no topo busca dados a partir daí. Não há concatenação de strings, mas a seção 3.1 do manual descreve comoPRINT
resultados são gravados em "zonas" tabuladas na saída.Tarefa 3
A versão lenta do algoritmo de Euclides:
Saída:
fonte
2010 - WTFZOMFG
WTFZOMFG é uma linguagem esotérica baseada em Brainfuck. Foi feita por Jay Songdahl em 2010. "WTFZOMFG" é a abreviação de "O que é essa função? Esquilos maliciosos de arquivos otimizados pelo Zen!" .
Aqui está um compilador para sistemas * nix .
Tarefa 1
Tarefa 2
Explicação:
Desculpa. Não sou bom em escrever explicações.
Tarefa 3
Algoritmo euclidiano. WTFZOMFG não tem um comando para mod, então eu tenho que usar
d
(dividir),m
(multiplicar) es
(subtrair).fonte
2009 - Ir
Go é uma linguagem de programação desenvolvida pelo Google. O desenvolvimento começou em 2007, mas o Go foi anunciado em novembro de 2009.
Go é uma linguagem de tipo estatístico, influenciada por C, que enfatiza concisão, simplicidade e segurança.
Tarefa 1:
A primeira linha declara o pacote do código. Mesmo um exemplo simples de impressão de uma linha precisa fazer parte de um pacote. E o executável é sempre chamado
main
.Tarefa 2:
Go tem uma declaração de variável bastante concisa (
i := 0
é a mesma quevar i int = 0
) e o compilador determina o tipo. Geralmente, esse é um recurso mais comum em idiomas dinâmicos. Usando essa notação curta, também é muito fácil atribuir funções a variáveis (f := func(x int) int {/* Code */}
) e criar Closures.Tarefa 3:
Aqui você pode ver a
a, b = b, a%b
sintaxe, o que é muito bom. Eu não sei o nome exato, mas em Python é chamado desempacotar tupla. Usando da mesma maneira, você pode retornar vários valores de uma função (func f() (int, string) { return 42, "Hallo"}
).Outra coisa que acontece nesse código é o loop. O loop for é o único loop no Go. Loops while ou loops while não existem. Mas você pode facilmente criar um equivalente para o loop while
for condition {}
ou um loop infinitofor {}
.fonte
1991 - Python
História do idioma
No final dos anos 80, Guido van Rossum começou a conceber o Python como um hobby. Seu nome vem do Flying Circus de Monty Python, um programa de televisão britânico de que Rossum é fã. A primeira implementação do Python começou em 1989 e foi lançada em 1991. Ela ganhou popularidade ao longo dos anos, tornando-se o idioma de escolha para muitos cursos introdutórios de ciência da computação.
"Olá Mundo!" Variante
Observe os parênteses ao redor da entrada para
print
. Embora essa sintaxe funcione no Python 2, normalmente no Python 2 você omitiria esses parênteses. No entanto, eles são necessários no Python 3. Conforme sugerido por Zach Gates, os parênteses são usados o tempo todo para garantir que o código apresentado aqui funcione entre versões.ASCII Art N
As funções são definidas usando
def
. A concatenação de strings é realizada usando+
e repetição de strings com*
.GCD
Observe que o Python requer espaço em branco estruturado.
fonte
1968 - Algol 68
Algol 68 foi definido pelo Grupo de Trabalho 2.1 do IFIP como sucessor do Algol 60.
É uma linguagem orientada à expressão na qual tudo tem um valor. Também é ortogonal, no qual você pode usar qualquer construção de qualquer maneira. Isso significa que as expressões podem estar no RHS e no LHS de uma atribuição, por exemplo.
Todas as estruturas de controle têm uma forma abreviada e uma forma longa usando expressões. Também permite as definições de operadores.
Os objetivos do idioma são citados como:
Esses programas foram testados com o interpretador Algol 68 Genie , que é uma implementação completa da linguagem.
Alguns recursos que os programadores modernos podem achar diferentes é que declarações vazias não são permitidas. Você não pode simplesmente adicionar em
;
qualquer lugar. Você precisa usar aSKIP
instrução se não quiser explicitamente nada. Também permitiu a codificação de programas concorrentes com muita facilidade. O Algol 68 também usou, notavelmente, palavras-chave anteriores como terminadores, como esac , od , fi etc.O idioma tinha uma representação usada para escrever o código que usava muitas fontes representando palavras-chave em negrito e identificadores em itálico , por exemplo. Na época, e provavelmente ainda, nenhum compilador implementou esse recurso do design. A linguagem permitia várias representações concretas diferentes de programas usando os modos stropping . Isso permitiu que os programas fossem preparados usando conjuntos de caracteres limitados, como os encontrados nos computadores na década de 1960. Considere o pequeno fragmento do programa, que seria representado como:
Isso pode ser preparado para um compilador no modo prime stropping como:
No modo de dispersão de pontos , isso seria:
Em caso modo stropping isso seria:
Eu gosto muito desse idioma, pois trabalhei em uma das implementações do compilador, além de programar nele exclusivamente por muitos anos.
Tarefa 1
O ponto a ser observado aqui são os parênteses duplos. Isso ocorre porque print é uma função que recebe um único argumento, que é uma matriz de comprimento variável da união de todos os tipos. Os parênteses internos são o construtor da matriz. É assim que o polimorfismo é tratado nessa linguagem fortemente tipada.
No modo de remoção de estrias:
Tarefa 2
No modo de remoção de estrias:
Tarefa 3
No modo de remoção de estrias:
fonte
1962 - SNOBOL
A "linguagem orientada e simbólica". A princípio, aparentemente chamado de Intérprete de Expressão Simbólica, 'SEXI', que teve que ser alterado para impedir que os nerds da era dos anos 1960 corassem ao enviar seus trabalhos. História real.
Esse foi um dos primeiros idiomas que conseguiu lidar com strings e padrões de forma nativa. De fato, a primeira versão do SNOBOL tinha a string como seu único tipo de dados. A matemática foi então feita pela análise. A implementação inicial foi feita no IBM 7090. Parece que já faz muito tempo, pelo menos, não consegui encontrá-lo. O que encontrei foi o artigo original que o descrevia, bem como um intérprete SNOBOL3 em Java, que pode ser executado em um computador moderno .
O primeiro SNOBOL tinha praticamente apenas correspondência de padrões e aritmética básica. O SNOBOL 3 adicionou funções e alterou a E / S, mas, de outra forma, parece ter permanecido compatível com versões anteriores. O SNOBOL 4 mudou a sintaxe e, a partir daí, tornou-se o Icon , que mantém o padrão correspondente, mas quase se parece com uma linguagem de programação "normal".
Os programas que escrevi usam apenas a funcionalidade descrita no documento original, portanto, devem funcionar com o SNOBOL original, com exceção da E / S, que fiz no estilo SNOBOL3 para que o interpretador Java possa executá-los. No artigo, parece que a diferença é que o SNOBOL1 usa correspondência de padrões com uma
SYS
variável especial , enquanto o SNOBOL3 usa variáveis de entrada e saída:SYS .READ *DATA*
DATA = SYSPPT
SYS .PRINT 'A STRING' AND VARIABLES
SYSPOT = 'A STRING' AND VARIABLES
Fazer essas substituições deve levá-lo ao SNOBOL 'real' 1. É claro que você não pode executá-lo.
Tarefa 1
Tarefa 2
Isso mostra matemática, manipulação de strings e controle de fluxo. SNOBOL3 tem funções úteis, como
EQ
verificar a igualdade; o SNOBOL original não, então eu não os usei.Tarefa 3
Primeiro, o chato. A única coisa digna de nota é a verificação menor que a, mostrando exatamente como o SNOBOL orientado a cadeias realmente era:
(B - A) '-'
significa "o resultado de BA contém um sinal de menos?". O SNOBOL3 também podeLE(B,A)
, mas o SNOBOL 1 não pode (pelo menos o artigo não menciona).Obviamente, quando você tem um idioma inteiramente baseado em seqüências de caracteres e correspondência de padrões, seria uma pena não usar realmente a correspondência e substituição de padrões. Portanto, aqui está um desses GCDs baseados em unário, incluindo rotinas para a conversão de e para unário.
fonte
2012 - TypeScript
O TypeScript é uma linguagem de programação livre e de código aberto desenvolvida e mantida pela Microsoft.
O principal objetivo é: qualquer navegador. Qualquer host. Qualquer sistema operacional. Código aberto. Foi lançado em outubro de 2012
Olá TypeScript
Arte ASCII
GCD
experimente online e faça screencast .
fonte
2011 - Dardo
Dart é uma linguagem de programação de código aberto desenvolvida pelo Google que é desenvolvida como um substituto para o Javascript (apesar de compilar com o javascript). Foi revelado pelo Google em 2011 durante a conferência GOTO.
"Olá Mundo!" Variante:
ASCII Art N:
O método Bruteforce é executado em 0 (n²), mas não deve realmente importar, a menos que você use um número gigante.
GCD
método Euclid simples portado do Snap! exemplo acima.
fonte
2010 - Ferrugem
Rust é uma linguagem de programação compilada, de múltiplos paradigmas, de propósito geral, desenvolvida pela Mozilla Research. Ele foi projetado para ser uma "linguagem prática, segura e simultânea", suportando estilos de funcionalidade pura, ator simultâneo, procedimento imperativo e orientação a objetos. Wikipedia
Tarefa1
Tarefa2
Explicação:
cuida da impressão apenas na vertical (esquerda e direita
|
) e na diagonal (\
)Tarefa 3
implementação simples de Euclidean_algorithm
fonte
2015 - Muffin MC
O Muffin MC é uma macro-linguagem completa, divertida (mas séria), funcional e minimalista de Turing, escrita por Franck Porcher ( http://franckys.com ) em meados de fevereiro de 2015, por necessidade como uma ferramenta (rápida) para capacitar um planilha a ser usada como o único controlador front-end a pilotar e conduzir todas as operações relacionadas a inventário associadas a um site de comércio baseado em Prestashop para uma nova marca de moda do Tahitian: Mutiny Tahiti ( http://mutinytahiti.com - em breve lançado).
Muffin MC é um acrônimo para MU minúsculo F unctional F lexible IN linha M acro C ommand idioma.
Para atender aos nossos requisitos, os principais recursos do Muffin MC foram projetados com base em construções semânticas integradas de primeira classe flexíveis e eficientes, como iteradores , avaliação preguiçosa , multifuncionais , produto de seqüência de caracteres .
O Muffin MC tem suas raízes na programação funcional (pragmática), FLisp e Perl. Ele suporta totalmente a recursividade (sem qualquer otimização), é digitado dinamicamente e com escopo dinâmico (ligação superficial). Ele oferece a seus usuários apenas uma estrutura de dados, além dos átomos básicos dos tipos de dados (átomos, seqüências de caracteres, números): listas!
A semântica da lista de muffin MC (tipo de) empresta semântica de conjunto de potência , ou seja:
Para se reconciliar com isso, o seguinte pode ajudar:
Como tal, acessar um elemento de lista vazio gera a lista vazia, e não um erro! De fato, o Muffin MC se esforça para lançar o menor número possível de erros, estendendo assim a semântica de muitas operações tradicionais.
Tarefa 1
#(...)
é o comando macro do Muffin MC para aplicar uma função em uma lista de argumentos não avaliada, aqui a função internasay
, emprestada do Perl.#(say 1 2 3 ...)
é funcionalmente idêntico aomap {say $_} (1,2,3,...)
Tarefa 2
Defina a função
ascii-art()
:Ascii-art()
formulário de trabalho mais curto (88 bytes):=(var val...)
é o comando macro do Muffin MC para definir uma variável ou reatribuí-la.$(var)
é o comando macro do Muffin MC para acessar o valor de uma variável. Naturalmente, aceita o formulário$(v1 v2 ...)
para acessar muitas variáveis ao mesmo tempo.=(* var1 val1 var2 val2 ...)
é a extensão do comando macro do Muffin MC=(...)
para lidar com atribuições paralelas.Variáveis
_1, _2
, ... têm escopo dinâmico (mecanismo de ligação superficial) e são definidas automaticamente para vincular aos argumentos da função. Emprestadas do Perl5, as variáveis do sistema#
(número de argumentos) e@
(lista de argumentos) também são definidas automaticamente.Funções são simplesmente variáveis ligadas a qualquer número de instruções do Muffin MC .
Esta solução interessante vem da combinação de dois recursos naturais do Muffin MC :
O comando macro Muffin MC
I(...)
, para definir iteradores de ciclo, usados posteriormente com a forma funcional#(my-iterator want-number-of-values)
,O muffin MC -produto cadeia construo, uma extensão da interpolação variável natural, o que, dado qualquer cadeia
"F1 F2 F3..."
, onde a F i s são ou muffin MC literais corda ou muffin MC comando de macro (aka formas funcionais), irá produzir o maior número de cadeias de caracteres como dado pelo produto cardinal (F1) x cardinal (F2) x ....Por exemplo, dada xa variável que contém 2 valores, diz aeb, ey outra variável que possui 3 valores, diz 1 2 3, a avaliação da sequência
"x=$(x) y=$(y))"
produzirá 6 valores diferentes, a saber, nessa ordem:Este é um dos recursos altamente desejáveis do projeto MUTINY para o qual o Muffin MC foi projetado.
Executá-lo !
Como funciona
Nosso algoritmo é baseado nos seguintes itens:
Atendendo à ascii-art (n), {n = 2p + 1 | p inteiro, p> = 0}, a arte a ser gerada compreende n seqüências de n caracteres, entre as quais duas, a mais à esquerda e a direita, são fixas e sempre as mesmas: 'N'. Isso permite reduzir o problema de produzir apenas as cordas do meio. Por exemplo, dado n = 5, gostaríamos de produzir as 5 seqüências do meio a seguir, cada uma composta de caracteres n-2 (substituímos o espaço por um '_' para melhor visualização):
Tais cadeias médias podem ser facilmente produzidas pedalando pela sequência de 4 elementos
('_' '_' '_' 'N')
em 5 grupos de 3; dado n, na entrada da função, essa sequência é composta de caracteres n-2'_'
, seguidos pelo caractere'N'
. Andar de bicicleta por essa sequência não requer nada além de incorporar a sequência em um iterador interno do Muffin MCI(sequence)
(um iterador que alterna para sempre sua seqüência inicial de valores).Em seguida, simplesmente produzimos as cadeias intermediárias, de comprimento n-2, solicitando ao nosso iterador que nos forneça seus próximos valores n-2 (n-2 caracteres), que são concatenados juntos para produzir a cadeia intermediária esperada.
As n seqüências do meio são produzidas repetindo n vezes o processo acima, usando um mapa para coletar os n resultados (n seqüências de caracteres de n-2).
Nós usamos um outro Muffin poderosa MC construção built-in, ou seja, o produto corda , para produzir as cordas Final N:
"N#(map...)N"
.E é isso !
Tarefa 3
Defina a função
gcd()
:gcd()
é a forma mais curta real (37 bytes - ganho de 2 bytes graças ao Rodolvertice)Executá-lo !
produz 9.
É isso aí.
Obrigado pelo bom jogo e, possivelmente, pelo seu interesse. O idioma está disponível para qualquer pessoa que queira brincar, usá-lo ou até estendê-lo. Basta pedir e terei o maior prazer em enviá-lo.
Felicidades
Franck
PS. A implementação atual do Muffin MC está no Perl5. O código-fonte tem cerca de 2000 linhas do Perl moderno, incluindo comentários, e é fornecido com um conjunto de testes sem regressão, o que é ótimo para aprender construções e semânticas práticas do Muffin MC .
fonte