Un rompecabezas de programación de Mode Golf


43

Su tarea es imprimir el texto Good morning, Green orb!, con cada carácter repetido en su lugar tantas veces como el byte más frecuente en su fuente (el modo). Se permite una nueva línea final y no es necesario repetirla.

Por ejemplo, si su fuente era

print p

Dado que paparece dos veces y cada dos bytes aparece una vez, necesitaría imprimir

GGoooodd  mmoorrnniinngg,,  GGrreeeenn  oorrbb!!

Las respuestas se puntuarán por el producto de su recuento de bytes y la cantidad de veces que se repite la salida. Por ejemplo, el código anterior (si funcionó) obtendría una puntuación de 7 * 2 = 14 . El objetivo debe ser minimizar el puntaje.

Su código debe contener al menos 1 byte.

Use este programa para verificar que su código y salida coincidan


Las funciones están permitidas, ¿verdad?
totalmente humano

1
@totallyhuman Sí, siempre y cuando no reciban información.
Wheat Wizard

1
¿No debería ser esto etiquetado quine ?
FantaC

La mañana no puede ser capitalizada, ¿o sí?
Urna de pulpo mágico el

@magicoctopusurn No, el texto debe ser el mismo.
Wheat Wizard

Respuestas:


18

Brain-Flak , 384 * 106 366 * 100 = 36,600

(((((((()()()))))))(()({}{}{}(([(({}{})){}()]((((({}())){})){}{}()(({})<([{}](((({}()())))([{}]([{}]()((()()())(()()({}()([(({})){}()](((((({}))))({}({}{}{}){})(({}){}()))))<((((([]){}){}){}<>)<>)>[])))))))(((((()()())()){}{}){}){})<>(((({})<>)))>{}{})))))<(<>({})<>)>))(<>((({}))()){}{}<>)<>(((({}<>()))))({}{}{}<>)<>{((<>{}<><({}<>)>)<{({}[()]<(({}))>)}{}>)<>}<>{}

Pruébalo en línea!

Explicación

Lo primero que hago es empujar la cuerda

!bro neerG ,gninrom dooG

a la pila usando tácticas de complejidad de Kolmogorov bastante complicadas.

(((((((()()()))))))(()({}{}{}(([(({}{})){}()]((((({}())){})){}{}()(({})<([{}](((({}()())))([{}]([{}]()((()()())(()()({}()([(({})){}()](((((({}))))({}({}{}{}){})(({}){}()))))<((((([]){}){}){}<>)<>)>[])))))))(((((()()())()){}{}){}){})<>(((({})<>)))>{}{})))))<(<>({})<>)>))(<>((({}))()){}{}<>)<>({}<>())

Luego empujamos un contador hacia la pila de fichas para decirnos cuántas veces duplicar cada personaje. Sin embargo, no iba a poder determinar qué era este contador hasta que terminara de escribir el programa.

A continuación, invertimos simultáneamente la cadena y duplicamos cada carácter en su lugar la cantidad correcta de veces. Específicamente el contador + 1.

{((<>{}<><({}<>)>)<{({}[()]<(({}))>)}{}>)<>}<>{}

Estas dos partes del programa tienen un modo de 99 paréntesis abiertos. Sin embargo, dado que sin duda vamos a necesitar al menos 1 paréntesis. Aquí es donde noté que el último carácter que empujamos !convenientemente tiene el código de caracteres 33, lo que significa que podemos usarlo para crear 99, el número exacto que queremos usando solo un paréntesis adicional. Esta es una coincidencia pero funciona.


99
Ah sí, solo tácticas bastante estándar de complejidad cerebral de Kolmogorov. Esa es la cosa.
John Keates

Tú, mi buen amigo, debes estar enojado incluso para intentar esto. Solo voy a +1 y me alejo antes de que mi cerebro explote al tratar de entender todos los paréntesis.
caird coinheringaahing

15

Haskell , 37 bytes × 3 = 111

-20 gracias a H.PWiz. -25 gracias a nimi.

"Good m\111rning, Green orb!"<*[2..4]

Pruébalo en línea!

Los operadores de Haskell FTW.

Recordatorio para nunca jugar golf en el móvil. Sigo cometiendo errores tontos. Puedo llevar al menos la mitad de la culpa al móvil. :PAGS


55
Utilizando <*para guardar bytes (tenga en cuenta que no he verificado su validez)
H.PWiz

... Maldita sea, Haskell casi tiene demasiados operadores. ¡Gracias!
totalmente humano

15

brainfuck , 235 x 77 = 18,095 puntos

Editar: -2 bytes gracias a @Dennis

-[>--<-------]>-[>+++++>+>+>+>+++++>+>+>+>+>+++>+++++>-->+>+>+>+>+>+>+>+++++>+>+>+>+++[<]>-]>>----------->+++++>++>->+>-------->-------->+++++>>->++++++>------>+>---->+>+++++>++>>->--------->++>++>>-[>+<---]>--------<<[>>[-<+<.>>]<<,<]

Pruébalo en línea!

Prueba de TIO

Espera, ¿esto no es código de bolos? \ s

Con solo 8 caracteres utilizables, Brainfuck es uno de los peores idiomas para hacer esta pregunta. Tuve que comenzar minimizando qué personaje inevitablemente aparecería más, típicamente uno +o -. Después de escribir la primera iteración del código, lo encontré terriblemente desequilibrado a favor de +s. Reorganicé partes del código, como la generación de números más grandes, para usar más -. Finalmente, terminé en una cantidad igual de los dos personajes en 77 uno menos -que +. Ciertamente es posible reducir esto aún más, lo que intentaré mañana.

Pero bueno, al menos superé la respuesta de Brainflak


Hola felicidades! No puedo creer que sea posible hacer esto en BF ... Bastante si se puede hacer en el ;#idioma (͡ ° ͜ʖ ͡ °)
RedClover

13

Jalea , 13 bytes * 1 = 13

“¢Ȧ@XĊ'WÑṭḂ#»

Pruébalo en línea!


3
Finalmente alguien maneja la evasiva * 1 respuesta. Tenía la sensación de que Jelly sería el idioma para hacerlo ...
ETHproductions

@ETHproductions Jaja, solo reduje a la mitad mi código mientras
mantengo

Jaja, lo encontré justo después de que lo
editaras

Por curiosidad, ¿cuál es exactamente la diferencia? ¿Cómo es la nueva cadena comprimida la mitad de la longitud de la anterior?
ETHproductions

@ETHproductions Básicamente usé una cadena comprimida no óptima al principio, luego usé el compresor Jelly optimizado que encontró las coincidencias en el diccionario.
Sr. Xcoder

10

Alicia , 49 bytes * 2 = 98144

/:G!4o3r8"1=5',0Grey9Z<@
\"b0=dnm 2'i%g<7R6~e.;o/

Pruébalo en línea!

Explicación

/...@
\.../

Este es el marco habitual para programas lineales que operan completamente en modo ordinal. Al desplegar el flujo de control en zigzag, obtenemos:

"G04d3m821i5g,7G6ee9;<:b!=onr "'=%'<0Rr~y.Zo@

La idea básica es evitar los caracteres que se repiten más de dos veces con la ayuda de una transliteración. La transliteración que vamos a hacer es la siguiente:

input: "G04d3m821i5g,7G6ee9;<:b!"
from:  "0123456789:;<"
to:    "onr "

La forma en que funciona la transliteración en Alice es que las cadenas fromy tose repiten primero al LCM de sus longitudes, aunque en este caso, todo lo que importa es la longitud de la fromcadena, por lo que obtenemos:

from:  "0123456789:;<"
to:    "onr onr onr o"

De esta forma, obtenemos cuatro caracteres diferentes para representar la os, y tres para cada uno n, ry el espacio. Podemos generar la fromcadena usando la expansión de rango de la siguiente manera:

'<   Push "<".
0    Append a zero.
R    Reverse.
r    Range expansion.

El único problema ahora es que necesitaríamos cuatro "tanto para inputla tocadena como para la cadena. Para evitar eso, los colocamos en una sola cadena y la dividimos en =un separador.

"G04d3m821i5g,7G6ee9;<:b!=onr "
     Push the string containing both parts.
'=%  Split around "=".

El resto es solo:

~   Swap "from" and "to".
y   Transliterate.
.Z  Duplicate and interleave. This duplicates each character.
o   Print.
@   Terminate the program.



5

C (gcc) , 68 × 3 = 204

0000000: 6a 3b 6d 61 69 6e 28 29 7b 77 68 69 6c 65 28 6a  j;main(){while(j
0000010: 3c 37 32 29 70 75 74 63 68 61 72 28 7e 22 b8 90  <72)putchar(~"..
0000020: 90 9b df 92 90 8d 91 96 91 98 d3 df b8 8d 9a 9a  ................
0000030: 91 df 5c 32 32 30 8d 9d de 22 5b 6a 2b 2b 2f 33  ..\220..."[j++/3
0000040: 5d 29 3b 7d                                      ]);}

¡Gracias a @MDXF por ahorrar 9 puntos y allanar el camino para 6 más!

Pruébalo en línea!

Versión alternativa, ASCII imprimible, 69 × 3 = 207

j;main(k){while(j<72)putchar("Gnmg$hiuf`dl -I}ut|3{gt6"[k=j++/3]^k);}

Pruébalo en línea!




5

Vim, 42 41 pulsaciones de teclas × 3 = 123

iGod morning, Green orb!<Esc>2|qsyl2pl@sqX0@s

Explicación:

  1. iGod morning, Green orb!<Esc>
    Escribe la cadena God morning, Green orb!( ofalta una ).
  2. 2|
    Salta al primero o.
  3. qsyl2pl@sq
    Crea una macro recursiva s. Como efecto secundario, triplique la corriente o.
  4. X0
    Elimina uno oy salta al principio.
  5. @s
    Ejecuta la macro s, que repite cada personaje dos veces.

4

C, 78 × 4 = 312

*s=L" ÞÞÈ@ÚÞäÜÒÜÎX@äÊÊÜ@ÞäÄB";main(y){while(*++s)for(;y++%5;putchar(*s/2));}

Pruébalo en línea!

356 332


Comento porque estoy cansado de encontrarlo en el historial de mi navegador cada vez que quiero jugar al golf: utilicé esto para encontrar la cantidad de repeticiones de caracteres.
MD XF

Y esto para codificar la cadena.
MD XF

3

Japt , 24 bytes * 2 = 48

`Good ¶rÍÁ,
GÎ9 b!`m²·¸

Contiene un no imprimible. ¡Pruébalo en línea!

La mayoría del programa es solo una cadena comprimida, que se descomprime a

Good morning,
Green orb!

y luego maps cada personaje repitiéndolo bien, eso fue un poco² exagerado . El espacio es el único carácter que aparece 3 veces en la cadena comprimida; para guardar una instancia, la reemplazamos con una nueva línea, luego la usamos ·¸para dividir en nuevas líneas e inmediatamente unir en espacios. Si bien 2 bytes más, reduce sustancialmente la puntuación (de 66 a 48).

Ahora, si solo hubiera una forma corta de hacerlo sin usar dos veces el personaje ...


Porque no puedo verlo: ¿qué personaje está en la fuente tres veces? Veo varias cosas que tienen una cuenta de 2, pero no 3.
Draco18s

1
@ Draco18s Ninguno, el puntaje es 24 * 2.
ETHproductions

Entonces la salida es incorrecta. Estás imprimiendo cada personaje 3 veces en lugar de dos veces.
Draco18s

@ Draco18s Dangit, publicó el enlace equivocado ... Gracias por señalarlo.
ETHproductions

*salute*Y ahora que miro tu respuesta, veo que tiene ² mientras que el enlace tenía ³ :)
Draco18s

3

SNOBOL4 (CSNOBOL4) , 97 bytes * 10 = 970

	S ='Good Morning, Green orb!'
y	S	LEN(1) . y rem . s	:f(p)
	x	=x DUPL(y,10)	:(y)
p	OUTPUT	=x
END

Pruébalo en línea!

sí ........ SNOBOL requiere que los operadores estén separados por espacios en blanco, y hay requisitos de espacios en blanco que son bastante incómodos. Hay 9 '\t'y 10 ' 'en el código, por lo que cualquier mejora requerirá un cambio de enfoque bastante significativo.


3

R , 65 bytes * 5 = 325 59 bytes * 5 = 295 62 bytes * 4 = 248

cat(gsub('(.)',strrep('\\1',4),"Good Mo\x72ning, Green orb!"))

Pruébalo en línea!

Hay 4 (or,')personajes.


2
Nunca he visto strrepantes, eso debería ser útil.
BLT


3

Perl 5 , 59 × 2 = 118 puntos

$_="GSSdYmoVRing,YGVIen orb!";y<H-Z>[d-t ],s<.>[$&x2]eg;say

Pruébalo en línea!

Perl 5 , 51 × 3 = 153156 puntos

s""GOOd morning, Green orb!";y'O'o';s/./$&x3/eg;say

Pruébalo en línea!

Perl 5 , 43 × 4 = 172 puntos

say"Good morning, Green orb!"=~s/./$&x4/egr

Pruébalo en línea!

Se guardaron 2 bytes en cada solución gracias a @Xcali (hace algunos cambios). Para todas las optimizaciones mira las ediciones.


Hacer de este un programa en lugar de una función ahorraría 2 bytes (4 puntos): ¡ Pruébelo en línea!
Xcali

@Xcali, pero su cambio necesita una opción no estándar -M5.010, que también cuenta
mik


2

V , 35 bytes * 2 = 70

IG²od morning, GreeN ORb!5h3~Óˆ/°°

Pruébalo en línea!

Hexdump:

00000000: 4947 b26f 6420 6d6f 726e 696e 672c 2047  IG.od morning, G
00000010: 7265 654e 204f 5262 211b 3568 337e d388  reeN ORb!.5h3~..
00000020: 2fb0 b0                                  /..


2

Pitón 2 , 62 * 4 = 248

Gracias a @ovs y @Giuseppe!

lambda:"".join(c*4for(c)in"G\x6f\x6fd mor\x6eing, Green orb!")

Pruébalo en línea!

Pitón 2 , 51 * 6 = 306

print"".join(c*6for c in"Good morning, Green orb!")

Pruébalo en línea!

Pitón 2 , 70 * 5 = 350

lambda:"".join(c*5for(c)in"Gxxd mxrning, Green xrb!".replace('x','o'))

Pruébalo en línea!

Gracias a @Mr. ¡Xcoder para guardar un byte de ambas versiones!


Puede eliminar el espacio entre 6y for.
Sr. Xcoder

@ Mr.Xcoder Gracias!
Steadybox


@ovs eso no está del todo bien, creo que necesitas dos \x6fs, lo que todavía es bueno para 244
Giuseppe



2

CJam , 32 bytes × 2 = 64

"Gnmg$hiuf`dl -I}ut|3orb!"K,.^:_

Pruébalo en línea!

Empuja una cadena, luego XOR con los primeros 20 caracteres [0, 1, …, 19]y luego duplica cada carácter.


2

05AB1E , Puntuación: 22 (22 bytes * 1)

…‚¿•´,„ˆ¨èã).ªðý23£'!«

Pruébalo en línea.

Explicación:

NOTA 1: La pila de ajuste en la lista integrada )se usa en lugar del par integrado , porque ya es parte de la palabra del diccionario good.
NOTA 2: Los dos comas en el código y ,pueden tener el mismo aspecto, pero son diferentes caracteres Unicode . El primero se usa generalmente para el par integrado , y el segundo para la impresión integrada en STDOUT con nueva línea final . En este caso, se utilizan para la palabra del diccionario goody, sin embargo, la coma esperada en la salida.

…‚¿•´,        # 3-word dictionary string "good morning," (the comma counts as the third word)
„ˆ¨èã         # 2-word dictionary string "green orbit"
)             # Wrap everything on the stack into a list: ["good morning,","green orbit"]
            # Sentence capitalize all strings: ["Good morning,","Green orbit"]
   ðý         # Join by spaces: "Good morning, Green orbit"
     23£      # Only leave the first 23 characters: "Good morning, Green orb"
        '!«  '# Append a "!": "Good morning, Green orb!" (and output the result implicitly)

Vea esta sugerencia mía 05AB1E (sección ¿Cómo usar el diccionario? ) Para comprender por qué …‚¿•´,es "good morning,"y „ˆ¨èães "green orbit".


2

PowerShell , 46 bytes * 4 = 184 puntos

"Good morning, Green orb!"-replace'.',('$0'*4)

Pruébalo en línea!


1
Eso es inteligente. Me olvidé por completo$0
Veskah

: | espera, intenté esto, pero solo después de hacer el formato, por lo que no funcionó tan bien como lo hizo
solo ASCII

¯ \ _ (ツ) _ / ¯ ¿qué pasa con el enlace TIO?
mazzy


1

Gelatina , 31 bytes × 2 = 62 puntos

“2ðƈZ(Øṡdȷ¿Ɱ’ṃ“God mrnig,eb!”x2

Pruébalo en línea!

Explicación

“2ðƈZ(Øṡdȷ¿Ɱ’ṃ“God mrnig,eb!”x2
“2ðƈZ(Øṡdȷ¿Ɱ’                     Base 250 number
              “God mrnig,eb!”     Unique characters of "Good morning..."
             ṃ                    Convert the base 250 number in base 13 then index into the string "God mr..."
                             x2   Repeat each character twice because “ occurs twice in the source (and now 2)

1

JavaScript (ES6), 61 bytes * 3 = 183

_=>'Good morning, Gr\145en \x6f\x72b!'.replace(/./g,"$&$&$&")

JavaScript (ES6), 51 bytes * 4 = 204

_=>'Good morning, Green orb!'.replace(/./g,'$&$&$&$&')

Respuesta sugerida por @ETHproductions .

JavaScript (ES6), 73 bytes * 4 = 292

_=>`G00d mo1ning, G244n orb!`.replace(/./g,_=>(('o'+!0)[_]||_).repeat(4))

JavaScript (ES6), 58 bytes * 6 = 348

_=>'Good morning, Green orb!'.replace(/./g,_=>_.repeat(6))


Alternativamente, cambie _=>_a'$&'
ETHproductions

1
Alternativamente, creo que puede hacer '$&$&$&$&$&$&'el reemplazo, lo que luego creo que le permite eliminar dos instancias y reducir varios caracteres a 4, reduciendo drásticamente la puntuación ...
ETHproductions

@ETHproductions ¡Gracias, no sabía sobre ese patrón de reemplazo!
darrylyeo


1

Rubí, 55x4 = 220 puntos

"Good morning, Green orb!".split(//).each{|x|print x*4}

Estoy bastante molesto porque usar each_char hace el recuento de r's 5 ..


1

Insistente , 36 * 2 = 72

`GXVWOP^4W_[afdc\hiB`N$29+L-''.

Pruébalo en línea!

El principio principal de esta respuesta es que cada carácter nse almacena como n + index - 29para evitar la repetición en la cadena original. Esta asignación creó la cadena en los backticks. El resto del programa simplemente decodifica esto e imprime cada personaje dos veces:

` ... `              \ Push the encoded string
       N             \ Remove printing delimiter
        $            \ While there are items left on stack:
         29+         \   Add 29 to top of stack
            L-       \   Subtract current length from top of stack
              ''.    \   Print twice, then pop

Bytes usados ​​dos veces: `'W

Registro de cambios

  • Longitud de golf de 41 a 38, cambiando el método de decodificación.
  • Golfed longitud de 38 a 37 restando 29 de cada carácter codificado para evitar caracteres multibyte.
  • Longitud de golf de 37 a 36 mediante el uso de 'final loop' implícito
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.