Codificación en canción: representación de letras de música en un lenguaje de programación de su elección [cerrado]


13

Escriba un programa en el idioma de su elección que, cuando se lee, es la letra de una canción. Se debe ser un programa válido que puede ser compilada y ejecutada sin errores. Si bien técnicamente podría imprimir en la pantalla todas las letras, le recomendamos que lo haga con estilo y evite los literales de cadena siempre que sea posible.

Dado que esto es difícil en sí mismo, se le permite escribir una sola sección de código repetitivo que no cuenta para ser legible en la letra. Sin embargo, una vez que comienza el bloque de código que debe leerse como la letra de una canción, no puede interrumpirlo hasta que la canción haya terminado. Puede indicar el comienzo y el final del código de la canción con comentarios. Especifique también las letras en sí mismas, ya que leería el código. Puedes ser "liberal" con tu interpretación siempre que no te alejes demasiado de lo que está escrito, de lo contrario te costará puntos.

Se permiten letras de canciones parciales, aunque obtienes el doble de puntos por tener las palabras de una canción completa. La evaluación se divide en 3 categorías:

  1. 10 puntos - Originalidad
  2. 10 puntos - dificultad de la canción
  3. 20 puntos - Representación de esa canción en código.

Para cada presentación, le daré su puntaje en un comentario a continuación. Si edita su respuesta, solo deme un indicador de comentario y lo reevaluaré en consecuencia. Sin embargo, para ser justos, cada reevaluación resta 2 puntos de su puntaje total.

Un ejemplo podría ser el siguiente:

public class Song {
    public String play() {
        // Song begin
        try {
            if(this instanceof TheRealLife || this instanceof JustFantasy) {
                throw new InALandSlide();
            }
        } catch (InALandSlide e) {
        }
        return "No \"FromReality\"";
        // Song end
    }

    public static void main(String [] args) {
        Song song = new Song();
        song.play();
    }
}

Que se lee:

Is this TheRealLife?
Or is this JustFantasy?
Caught InALandSlide.
No escape \"FromReality\"

Los instrumentos no están permitidos, sabios. ;)


44
Este es un concepto interesante, y estoy interesado en ver los resultados, pero esto no es muy objetivo. ¿Cómo se determina la "dificultad" de la canción? (etc.)
Gaffi

3
Me recuerda mucho a este ganador de IOCCC
ugoren

@Gaffi, principalmente longitud, pero también la palabrería. Ejemplo de una canción que obtendría 0 podría ser que esta canción tiene solo 6 palabras .
Neil

¿Qué tal el HQ9programa 9? : P
Li-aung Yip

1
Sugerencia para cualquiera que intente encontrar una canción adecuada para la codificación: "Escape to the Void" parece ser un título prometedor :) - lyricstime.com/sepultura-escape-to-the-void-lyrics.html
Cristian Lupascu

Respuestas:


8

Python - 8 + 4 + 15 = 27 puntos

Aquí hay un par de estrofas de The Hunting of the Snark de Lewis Carroll.
Calcula un número, basado en el algoritmo sugerido en el poema, y ​​lo usa para indicar una prueba sobre la voz del jubjub.

class taking:
    def __init__(self, n): convenient.val = (n)
    def __enter__(self): pass
    def __exit__(self, type, value, traceback): pass
def a(x,y): x.val = y(x.val); return True
class We:
    def __init__(self): self.val=0
    def __add(self, y): return y+sum(self.x)
    def add(self, *x): self.x = x; return self.__add
    def multiply(self,x,by,diminished_by): self.val *= by-diminished_by
    def proceed2divide(self,x,by): self.val /= by
    def subtract(self,x): self.val -= x; return True
perfectly = lambda x: x and not not x
def must_be(x):
    if x: 
        print "\n".join(["Tis the %s of the Jubjub!"%["voice","note","song"][x%3] for x in range(out.val)])
        return out.val
out=convenient=as_you_see=we=then=the=We()
_ = exactly = 15
with\
\
    taking(3) as the_subject_to_reason_about:
    a(convenient, #2 state
    we.add(7,_ & 10)) and then.multiply(out,
    by=1000, diminished_by=8)

    the_result = we.proceed2divide(as_you_see,
    by=992)
    then.subtract(17) and the; answer = must_be(
    exactly and perfectly(True))

El texto original:

"Tomando a Tres como sujeto de razonamiento sobre—
Un número conveniente para decir: Sumamos
Siete y Diez, y luego multiplicamos
por Mil disminuido por Ocho.

"El resultado procedemos a dividir, como ve,
por Novecientos Ciento Noventa y Dos:
Luego reste Diecisiete, y la respuesta debe ser
Exactamente y perfectamente cierta.


Es lindo, me gusta. Originality: 8/10, Song difficulty: 4/10, Representation of that song in code: 15/20, Haciendo que su puntuación final 27. La vergüenza no se podía utilizar toda la canción.
Neil

2
Creo que el criterio de "canción completa" tiene demasiado peso. Hubiera sido mucho más fácil elegir una canción de una línea.
Ugoren

Dado que The Hunting of the Snark tiene más de 500 líneas de largo, eso habría sido una hazaña impresionante.
breadbox

1
@breadbox, incluso un solo ajuste sería una hazaña impresionante, todo sería una agonía.
Ugoren

6

Python (8 + 7 + 15 = 30)

Código válido de Python sintacticamente aunque no hace nada particularmente útil ;-)

from sys import exit as stops ; import os
thing = [] ; me = can = remember = False ; this = open(__file__)
def terrible(v): return v

# ==== start song snippet

me = can = remember = not any(thing)
can = not this.tell(), [True, "dream"]
locals()["deep"] = {"down":{"inside":{"feel_to":"scream"}}}
if `this` + (terrible("silence")): stops(me)

# ===== end song snippet

Cómo se supone que debe leerse:

No puedo recordar nada.
No puedo decir si esto es verdad o sueño.
En el fondo siento gritar.
Este terrible silencio me detiene.
...
(Metallica - Uno)


Wow, difícil elección de canción, pero muy impresionado de cómo lo hiciste. Originality: 8/10, Song difficulty: 7/10, Representation of that song in code: 15/20, Haciendo que su puntuación final 30.
Neil

5

C

Algo descuidado, escribí esto en unos 15 minutos para reír. Compila y funciona bien con la última versión de G ++ / MinGW (aunque en realidad no hace mucho). Puedes resolver esto bien por ti mismo, creo:

class Rick {

public:

    struct us { bool you; bool me; };

    bool giveYouUp()  { return false; }
    bool letYouDown() { return false; }
    bool runAround()  { return false; }
    bool desertYou()  { return false; }
    bool makeYouCry() { return false; }
    bool sayGoodbye() { return false; }
    bool tellALie()   { return false; }
    bool hurtYou()    { return false; }

    bool thinkingOf(bool whatImThinkingOf) { return whatImThinkingOf; }
    bool justWantTo(bool whatIWantToDo) { return whatIWantToDo; }
    bool tellYou(bool whatIWantToTellYou) { return whatIWantToTellYou; }

    void roll() {
        bool gonna = false;
        while (gonna) {
            giveYouUp();
            letYouDown();
            gonna = (runAround() && desertYou());
            makeYouCry();
            sayGoodbye();
            gonna = (tellALie() && hurtYou());
        }

        bool strangersToLove = true;
        us we = {!strangersToLove, !strangersToLove};

        bool knowTheRules = true;
        bool you = knowTheRules, I = knowTheRules;

        bool aFullCommitment = true;
        we.me = thinkingOf(aFullCommitment);

        int me = 0;
        Rick* guys[] = {this, nullptr, nullptr, nullptr, nullptr};

        bool howImFeeling = true;
        we.me = justWantTo(tellYou(howImFeeling));

        bool understand = true;
        while (we.you != understand) {
            we.you = understand;
        }
    }

};

int main() {
    Rick rick;
    rick.roll();

    return 0;
}

2

Scala (48 = 2 * (7 + 4 + 13))

¡Es Linux! canción.

object Song extends App {
  // Compose a song
  trait Compose {
    override def toString = {
      val token = """^.*\$(.*)\$.*$""".r
      val token(verse) = super.toString
      verse.replaceAll("([a-z])([A-Z])", "$1 $2").capitalize
    }
    def excl(ex: String) = println(this + ex)
    def !!(c: Compose) = { excl("."); c }
    def ***(c: Compose) = { excl("..."); c }
    def !(c: Compose) = { excl("!"); c }
    def *(c: Compose) = { excl(","); c }
    def ! = excl("!")
  }
  // It's linux  - lyrics
  case object ItBootsUpFine extends Compose
  case object AllOfTheTime extends Compose
  case object TuxThePenguinIsGreat extends Compose
  case object aPieInTheFace extends Compose
  case object ToTheManIHate extends Compose
  case object EveryoneKnowsItsLinux extends Compose
  case object StableForYouAndMe extends Compose
  case object ItsLinux extends Compose
  case object NoMoreBSODs extends Compose
  case object BetterThanNT extends Compose
  case object BestOfAllItsFree extends Compose
  case object FreeSoftwareForYouAndMe extends Compose
  case object LinuxGPLd extends Compose

  // Singer to sing a song
  def sing(song: => Unit) = { song }

  // Song begins
  sing {
      ItBootsUpFine!
      AllOfTheTime!!
      TuxThePenguinIsGreat!
      aPieInTheFace*
      ToTheManIHate***
      EveryoneKnowsItsLinux!
      ItsLinux!
      ItsLinux!
      StableForYouAndMe!
      ItsLinux!
      ItsLinux!
      NoMoreBSODs!
      ItsLinux!
      ItsLinux!
      BetterThanNT!
      ItsLinux!
      ItsLinux!
      BestOfAllItsFree!
      FreeSoftwareForYouAndMe***
      LinuxGPLd!
  }
  // Song ends
}

Salida:

It Boots Up Fine!
All Of The Time.
A Pie In The Face,
Tux The Penguin Is Great!
To The Man IHate...
Everyone Knows Its Linux!
Its Linux!
Its Linux!
Stable For You And Me!
Its Linux!
Its Linux!
No More BSODs!
Its Linux!
Its Linux!
Better Than NT!
Its Linux!
Its Linux!
Best Of All Its Free!
Free Software For You And Me...
Linux GPLd!

Originality: 7/10, Song difficulty: 4/10, Representation of that song in code: 13/20. Desde que pones toda la canción, eso duplica tu puntaje, lo que significa que tu puntaje final es 48. Buena. :)
Neil

1

PHP

Probé mi canción favorita, Stairway to Heaven.

$GLOBALS['sign']= 'words';

class lady extends me // there is a lady
{
  function __construct(){   // who is sure
    global $glitters = 'gold'; // all that glitters is gold
    $buy('stairway_to_heaven'); // and shes buying the stairway to heaven
  }
  $know[] = 'stars are close'; // when she get's there she knows, the stars are close
  function word(){  // with a word she can get
    debug_backtrace(); // what she come for
  }

  $this->buy('stairway_to_heaven'); // and she's buying the stairway to heaven

  $sign = 'words'; // there is a sign on the door
  if(!$sign === $GLOBALS['sign']) // but she want to be sure, cause you know sometimes words have 2 meanings
    exit();

  in_array($tree / $brook, $songbird ? 'sings'); // (literal) in a tree by the brook, there is a songbird who sings

  mysql_real_escape_string($_GET['thoughts']); // sometimes all of our thoughts are misgiven
  for ($i=0;$i<2;i++)
    parent::wonder(); // makes me wonder , makes me wonder

}

¿Cómo se lee:

Hay una dama que está segura de que todo lo que brilla es oro.
Y está comprando una escalera al cielo.
Cuando llegue allí, sabe, si las estrellas están todas cerca
Con una palabra, puede obtener lo que vino a buscar.
Ooh, ooh, y ella está comprando una escalera al cielo.

Hay un letrero en la pared, pero quiere estar segura
porque a veces las palabras tienen dos significados.
En un árbol junto al arroyo, hay un pájaro cantor que canta.
A veces , todos nuestros pensamientos son confusos.
Ooh, me hace preguntarme,
Ooh, me hace preguntarme.


1

C

Aquí hay una canción completa.
Puedes escucharlo en Mama Lisa's World .
Tenga en cuenta que la canción se incluye tal cual, incluida la puntuación.

#define breath,
#define smell breath
#define an;}Englishman; main(){printf("%d\n",sizeof
struct x{int
// Song starts here
Fee, fa, fie, fo, fum,
I smell the breath of an Englishman.
// Song ends here
I);}

Imprime el número 4.


1

Rubí

Mi opinión sobre la representación más cercana posible. Es fácil con el encadenamiento de llamadas de Ruby.

$lines = []

def thisline n=2
    caller(n).first.match(/:(\d+):/)[1].to_i
end

class Chain < Array
    def method_missing method, *args
        $lines[thisline] = Chain[first, self[1], [method, thisline, args]]
    end

    def -(arg)
        $lines[thisline] = Chain[' - ', thisline, self, arg]
    end

    def tokens
        if size < 3
            if first == :_
                []
            else
                [first.to_s.tr(?_, ?\s).strip]
            end
        elsif size < 4
            [first.to_s.tr(?_, ?\s)] + at(2).tokens
        else
            lhs = case el = at(2)
            when Chain then el.tokens
            when String
                el.empty? ? [?'] : [?', el, ?']
            end

            rhs = case el = at(3)
            when Chain then el.tokens
            when Range then el.first.tokens + ['... '] + el.last.tokens
            end

            lhs + [first.to_s.tr(?_, ?\s)] + rhs
        end
    end
end

def self.method_missing method, *args
    line = thisline(3)

    if args.length > 1
        newlines = args.first.is_a?(String) ? args.first.count(?\n) : 0
        $lines[line] = false
        $lines[line-newlines] = Chain[method, line, Chain[', ', line, *args]]
    else
        $lines[line] = Chain[method, line, *args]
    end
end

####################

The pest in_the eyes of death follows us
Through the dirty streets of blood
It begins to eat inside us, decaying_our_bones
How will we escape_if the void covers our lungs?
We are buried_in the spewed trash_for ourselves

Blood _, pain - nothing_to_say
Why then_- must_we_die?

Escape to the void
Escape to the void

I look at my face on the other side of the mirror
My face falls down_in pieces full of worms
I burst my rotten heart with my own hands
I'm dying and I can',t_help_myself

Blood _, pain - nothing_to_say
Why then_- must_we_die?

What have I been running from?
I'',m_not_guilty
You've shown me the worst way
Cause you',re_my_victim... the_next_one

The pest in_the eyes of death follows us
Through the dirty streets of blood
It begins to eat inside us, decaying_our_bones
How will we escape if_the void covers our lungs?
We are buried in_the spewed trash_for ourselves

Blood _, pain - nothing_to_say
Why then_ - must_we_die?

Escape to the void
Escape to the void

####################

$lines.drop_while {|line| !line }.each_with_index {|line, i|
    puts if line.nil?
    next if not line

    line = line.tokens
    line.map!.with_index {|el, j|
        punct = [', ', ' - ', '... ', ?']

        if line[j-1] == ?' and el == ', '
            ''
        elsif punct.include?(el) or punct.include?(line[j+1])
            el
        else
            el + ?\s
        end
    }

    puts line.join
}

Salida

The pest in the eyes of death follows us 
Through the dirty streets of blood 
It begins to eat inside us, decaying our bones 
How will we escape if the void covers our lungs? 
We are buried in the spewed trash for ourselves 

Blood, pain - nothing to say 
Why then - must we die? 

Escape to the void 
Escape to the void 

I look at my face on the other side of the mirror 
My face falls down in pieces full of worms 
I burst my rotten heart with my own hands 
I'm dying and I can't help myself 

Blood, pain - nothing to say 
Why then - must we die? 

What have I been running from? 
I'm not guilty 
You've shown me the worst way
Cause you're my victim... the next one 

The pest in the eyes of death follows us 
Through the dirty streets of blood 
It begins to eat inside us, decaying our bones 
How will we escape if the void covers our lungs? 
We are buried in the spewed trash for ourselves 

Blood, pain - nothing to say 
Why then - must we die? 

Escape to the void 
Escape to the void

Que hacer

  1. Comas multilíneas (argumentos)
  2. Puntos multilínea (llamadas a métodos)

0

T-SQL Bone Thugs-N-Harmony

DECLARE @line1 varchar(25);
DECLARE @line2 varchar(25);
DECLARE @line4 varchar(25);
DECLARE @line5 varchar(25);

SET @line1 = 'Wake up, wake up, wake up,';
SET @line2 = 'its the';
SET @line4 = 'to get up, get up get up';
SET @line5 = 'so cash your checks and get up';

SELECT @line1 as Layzie, @line2 as Bizzy,
CONVERT(date,DATEADD(day, -
(SELECT
DATEPART(day, GETDATE()) 
- 1), GETDATE())) as FirstOfTheMonth,
@line4 as Layzie, @line5 as Bizzy;

Sí, sé que hice trampa un poco y podría tener a los miembros que cantaron qué línea también está mal.


0

C - Botellas de cerveza

Compila y ejecuta esto. Las letras se ponen en el código fuente. Compila y ejecuta la salida para obtener la siguiente línea de canción. Cuando dice "Hora de irse ...", compile y ejecute con el número de botellas especificado en la línea de comando, por ejemplo:

cl prog.c
prog 32 > prog1.c
cl prog1.c
prog1 > .... etc

El código, probado usando VS2005: -

// Time to go to the shop and get some beer
//
//
//
//
// #####.#####.#####.#####.#####.#####.#####
// ##.#####.#####.#####.#####.#####.#####.##
// #####.#####.#####.#####.#####.#####.#####
// ##.#####.#####.#####.#####.#####.#####.##

char *z [] = {
"void l(char *s,int b){int i;printf(\"// \");for(i=0;i<b;++i)printf(s);",
"printf(\"\\n\");}\nint main(int argc, char *argv[]){\nint i,j,k,x=%d;",
"char*p;\nif(!x&&argc==2)x=atoi(argv[1]);\nif(!x){printf(\"// Time to ",
"go to the shop and get some beer\\n//\\n//\\n//\\n//\\n\");k=7;\n",
"}else{printf(\"// %%d bottles of beer on the wall, %%d bottles of beer",
".\\n\",x,x);printf(\"// Take one down and pass it round, \");\n",
"if(x>1)printf(\"%%d bottles of beer on the wall.\\n//\\n\",x-1);\n",
"else printf(\"no more bottles of beer on the wall.\\n//\\n\");\n",
"k=x>2?x:2;l(\"  ^   \",x);l(\" / \\\\  \",x);l(\"/   \\\\ \",x);",
"l(\"|   | \",x);l(\"|Duf| \",x);l(\"|   | \",x);l(\"----- \",x);}\n",
"for(i=0;i<4;++i){\nprintf(\"// %%s\", i&1 ? \"##.\" : \"\");\n",
"for(j=i&1;j<k;++j)\nprintf(\"%%s#####\",j!=(i&1)?\".\":\"\");\n",
"printf(\"%%s\\n\",i&1?\".##\":\"\");}\nprintf(\"\\nchar *z [] = {\\n\");\n",
"for(i=0;i<sizeof z/sizeof z[0];++i){\nprintf(\"\\\"\");\n",
"for(p=z[i];*p;++p)\nswitch (*p){\ncase '\\n':printf(\"\\\\n\");break;\n",
"case '\\\\':printf(\"%%c%%c\",92,92);break;\n",
"case '%%':printf(\"%%c\",37);break;\ncase '\"':printf(\"%%c%%c\",92,'\"');break;\n",
"default:printf(\"%%c\", *p);break;}\nprintf(\"\\\",\\n\");}\n",
"printf(\"};\\n\");\nfor(i=0;i<sizeof z/sizeof z[0];++i)\n",
"printf(z[i],x?x-1:0);}\n",
};
void l(char *s,int b){int i;printf("// ");for(i=0;i<b;++i)printf(s);printf("\n");}
int main(int argc, char *argv[]){
int i,j,k,x=0;char*p;
if(!x&&argc==2)x=atoi(argv[1]);
if(!x){printf("// Time to go to the shop and get some beer\n//\n//\n//\n//\n");k=7;
}else{printf("// %d bottles of beer on the wall, %d bottles of beer.\n",x,x);printf("// Take one down and pass it round, ");
if(x>1)printf("%d bottles of beer on the wall.\n//\n",x-1);
else printf("no more bottles of beer on the wall.\n//\n");
k=x>2?x:2;l("  ^   ",x);l(" / \\  ",x);l("/   \\ ",x);l("|   | ",x);l("|Duf| ",x);l("|   | ",x);l("----- ",x);}
for(i=0;i<4;++i){
printf("// %s", i&1 ? "##." : "");
for(j=i&1;j<k;++j)
printf("%s#####",j!=(i&1)?".":"");
printf("%s\n",i&1?".##":"");}
printf("\nchar *z [] = {\n");
for(i=0;i<sizeof z/sizeof z[0];++i){
printf("\"");
for(p=z[i];*p;++p)
switch (*p){
case '\n':printf("\\n");break;
case '\\':printf("%c%c",92,92);break;
case '%':printf("%c",37);break;
case '"':printf("%c%c",92,'"');break;
default:printf("%c", *p);break;}
printf("\",\n");}
printf("};\n");
for(i=0;i<sizeof z/sizeof z[0];++i)
printf(z[i],x?x-1:0);}

1
¡No me disculpo por mi arte ASCII!
Skizz

1
Bastante impresionante, pero ¿cómo encaja con el desafío? Pensé que la idea es que puedes leer la fuente como una canción.
Ugoren

1
@ugoren: compila y ejecuta el ejecutable con un solo parámetro, el número inicial de cervezas. Luego, el programa emite el primer verso de la canción como código fuente (bueno, las letras en el comentario superior). Compile la salida y vuelva a ejecutarla para obtener el siguiente verso, etc.
Skizz

Muy bonito, pero la idea no es un programa que imprima la canción. Es un programa que, cuando se lee su fuente, ES la canción.
ugoren

0

Perl realiza Barnes & Barnes

Desde que aprendí Perl, quería una excusa para usar la -Popción. Hoy, esa excusa finalmente ha llegado:

#define cry $$
#define people $_
#define some kill
#define we people
#define whenyoudie END
sub yeah{}

# "When You Die", Barnes & Barnes

whenyoudie { you stop drinking beer }
whenyoudie { you stop being here }
whenyoudie { some people,cry }
whenyoudie { we=say "goodbye" }

                yeah

Ejecútelo -M5.010además de la -Popción, así:

$ perl -PM5.010 whenyoudie
goodbye
Hangup
$ 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.