Richard Dawkins en su libro The Blind Watchmaker , describe un programa de Weasel . El algoritmo se puede describir de la siguiente manera:
Comience con una cadena aleatoria de 28 caracteres. Los caracteres válidos son todas letras mayúsculas y espacio.
Haga 100 copias de esa cadena, con un 5% de probabilidad por personaje de ese personaje reemplazado por un personaje aleatorio.
Compare cada nueva cadena con el objetivo "METHINKS IT LIKE A WEASEL", y otorgue a cada una una puntuación de acuerdo con el número de letras en la cadena que sean correctas y en la posición correcta.
Si alguna de las nuevas cadenas tiene una puntuación perfecta (28), deténgase.
Elija la cadena con la puntuación más alta del paso 3. La forma en que trabaja un empate depende de usted, pero solo se puede elegir una cadena. Tome la cuerda elegida y vaya al paso 2.
El ganador será el fragmento de código más corto para obtener la respuesta correcta al imprimir la cadena de mayor puntuación de cada generación en el siguiente formato:
¡Si la gente pudiera ayudar marcando las respuestas de otras personas, sería muy útil!
Respuestas:
APL (143)
Explicación:
0{
...}⊃∘(C←27↑⎕A)¨?28/27
: establecidoC
en las primeras 27 letras mayúsculas. Solo hay 26, por lo que el elemento 27 será un espacio. Seleccione 28 elementos al azar deC
. Este será el primero⍵
. La primera⍺
(generación) será0
.⍵≢T←'METHINKS IT IS LIKE A WEASEL
: establecidoT
en la cadena'METHINKS IT IS LIKE A WEASEL'
. Mientras⍵
no sea igual aT
:{
...}¨100⍴⊂⍵
: Hacer 100 copias de⍵
. Para cada uno de estos ...9≠?28/20
: seleccione 28 números aleatorios del 1 al 20. Haga una máscara de bits donde cada uno1
signifique que el número aleatorio no era igual a9
. (Esto significa 5% de probabilidad de a0
).⍵{⍵:⍺⋄C[?27]}¨
: para cada letra⍵
, si el bit correspondiente era1
, conserve esa letra, de lo contrario reemplácela con un elemento elegido al azarC
.c←
: almacena las 100 cadenas mutadas enc
.G←{+/⍵=T}¨c
: para cada elementoc
, calcule la puntuación (cantidad de caracteres que coincidenT
) y almacene las puntuaciones enG
.s←⌈/G
: encuentre la puntuación máxima y guárdela ens
.c←⊃c/⍨G=s
: seleccione el primer elemento dec
cuya puntuación sea igual as
(el máximo) y guárdeloc
nuevamente.⎕←(⍕⍺),':'c'-- score:',s
: imprime la generación en el formato dado (⍺
es la generación actual,c
es la mejor cadena actual,s
es la puntuación)c∇⍨1+⍺
: Incremente la generación y ejecute la mutación nuevamente usando la mejor cadena actual (c
) como entrada.fuente
Mathematica -
238236225Salida de ejemplo
fuente
Pitón (273)
fuente
K,
173167/ /
fuente
Python: 282 caracteres sin punto y coma
278 con:
fuente
JavaScript,
277246(requiere soporte de función de flecha; sangría agregada solo para facilitar la lectura)
Siéntase libre de cambiar
alert
aconsole.log
si quieres una experiencia más agradable de ejecución.Aquí hay algunos bits ingeniosos de golf:
La función
c
devuelve un carácter aleatorio de la cadena del alfabeto" ABC..."
. La función toma un argumento para usar como límite superior para la selección de índice aleatorio. Al generar la cadena base, usamos27
, por lo que la función se comporta normalmente.Sin embargo, abusamos de este comportamiento al pedir un límite superior aleatorio de 540 pulg
h = c(540) || h
. Solo el 5% del tiempo enc
realidad devolverá una cadena (porque 540 * .05 = 27); el otro 95% del tiempo, el índice elegido al azar cae más allá de la longitud de la cadena, por lo que la función regresaundefined
. Este valor de falsey provoca una cascada OR lógicac(540) || h
, por lomap
queh
se utiliza el valor original (es decir, no se produce ningún reemplazo).La operación de suma de puntajes sí
f+=h=="METHINKS IT IS LIKE A WEASEL"[p]
, que dice "agregartrue
af
si elmap
carácter actualh
coincide con el carácterp
th de la cadena WEASEL". La suma de número más booleano coacciona el resultado booleano a cualquiera0
o1
, lo que significa quef
se incrementa solo cuando hay una coincidencia con la cadena WEASEL objetivo.fuente
v
indicado en el código? No se menciona en ningún otro lugar allí. Puedes ahorrarte 2 caracteres.v
es un argumento para la función de flecha almacenada enc
:c = (v => ...)
. Si desea definir una función de flecha sin argumentos, cuesta dos caracteres()=>...
, en lugar de unov=>...
, por lo que es mejor simplemente tener un argumento no utilizado.k=s=[28]
y++
, no tenía idea!R (
245239238 caracteres)Da:
...
fuente
0: ...
si la primera vez que invocacat
aumentac
a 1? (+1 sin embargo, ya que intento desde hace una hora hacer algo más corto y todavía no puedo :))ifelse(…,h(f,1),…)
reemplaza todas las posiciones seleccionadas con el mismo carácter aleatorio. Puede interpretar las reglas en esta dirección, pero se siente como doblarlas, así que al menos lo mencionaría. En segundo lugar, reemplazas=z
dentro del1:100
bucle, por lo que no está haciendo 100 copias de la misma cadena, sino a veces copias de una copia. Esto parece romper una regla para mí, no simplemente doblarla.C 256
Tres bucles simples, inicialización, generación de nuevas cadenas del padre y puntaje calculado por la misma declaración. No es muy legible incluso con sangría.
C 252
Un bucle, con una matriz que contiene las 101 cadenas.
Esta segunda versión rompe las reglas porque imprime la cadena del (equivalente al) paso 1, pero fue eso o no imprimió la última cadena. Estoy perplejo de cómo solucionarlo sin explotar en tamaño. Lo estoy publicando de todos modos por inspiración.
C 256
Enfoque diferente, en lugar de hacer una matriz para contener 101 cadenas, simplemente regenere la cadena 100 veces y use la asignación de estructura para copiar fácilmente. La inicialización se realiza iniciando el contador "repetir 100 veces" en -1 y manejándolo con cuidado mediante post-incremento estratégicamente elegido. A pesar de un enfoque muy diferente, termina exactamente igual que el primer intento: 256 caracteres.
fuente
C # - 436
fuente
Lua 5.1 (502)
La versión minimizada:
y la versión más fácil de leer (¡con comentarios!):
Para ser honesto, aunque esto definitivamente no va a ganar, ¡me alegré de encontrar y minimizar una solución razonablemente corta para este problema! (énfasis en razonablemente): p
fuente
SAS - 374
->
Con saltos de línea / sangría / comentarios:
fuente
C
361331No es tan bueno como la solución de Art, pero aquí está mi intento (novato) de una solución C. 361 caracteres si elimina líneas nuevas y pestañas.
Editar: se deshizo del bucle anidado y usó una matriz 1D. Esperaba que hiciera una gran diferencia, pero solo me salvó 30 caracteres. Aquí está el código:
Editar: Este es el código original, sin golf, para aquellos que estén interesados en saber cómo se hizo el "golf". El código no genera advertencias cuando se compila con GCC con -Wall y C99 habilitado. Tal vez eres un novato en el golf como yo, o un novato en C como yo, o tal vez solo tienes curiosidad. :) https://gist.github.com/cpx/97edbce4db3cb30c306a
fuente
Scala
347341337 caracteres:=>
fuente
println("%2d: %s -- score: %d".format(i,a,s(a))
puede cambiar aprintln(f"$i%2d: $a%s -- score: ${s(a)}%d")
, ¡ahorrando 4 caracteres!def c=(' '+:('A'to'Z'))(r(27))
me daerror: type mismatch; found : Int required: scala.collection.generic.CanBuildFrom[scala.collection.immutable.IndexedSeq[Char],Char,?]
PHP 442
Fácilmente:
fuente
if\for
, está en 436. También puedes buscar$n>90
otror()
ys()
funciones. Aquí están los cambios con comentarios: ideone.com/4ecZQc%s
siempre tiene la misma longitud y%d
se deja justificado, por lo que puede usar lo siguiente en su lugar:printf("%2d: $s -- score: $l\n",$i);
Java (632)
Java es un lenguaje tan detallado ... :(
fuente
Pitón (
330321)Versión legible:
Salida de ejemplo:
editar: eliminó algunos caracteres según la respuesta de AMK y Timtechs
fuente
sum(1for c in range(28)if n[c]==t[c])
puede acortarse asum(n[c]==t[c] for c in range(28))
(-3 caracteres)import random as r
afrom random import*
y luego retire los tres casos der.
S
? El desafío requiere comenzar con una cadena de caracteres aleatorios.PHP (
381 397 323 319312):Versión legible:
Créditos de optimización (319):
Créditos de optimización (312):
fuente
for
para los$f=N;while($f--){
de 3 caracteres cada uno. y para otro$n=rand(0,26);[...]chr($n?$n+64:32)
Rubí, 218
ejemplo ejecutado
fuente
Rubí
225202203198 caracteresRuby parece estar subrepresentado en este desafío hasta ahora, ¡así que pensé en intentarlo! Mejoras bienvenidas.
fuente
1
pero la pregunta especifica0
. Si inicias con,g=-1
entonces está bien. Puede haber una forma más inteligente, pero lo hice de esa manera. Saludos, compañero RubyGolfer.puts"#{g+=1}: #{$.,s=(0..99).map{n=(r=0..27).map{|i|x=[' ',*?A..?Z].sample;rand<0.05?x:s[i]||=x};[r.count{|i|n[i]=='METHINKS IT IS LIKE A WEASEL'[i]},n*'']}.max;s} -- score: #$."until$.>27
Rubí,
206200199La primera línea es simplemente una forma elegante de definir
q=-2
,i=-1
yR=(0..27).to_a
. Todo el trabajo se realiza en la segunda línea:fuente
Japt v2.0a0,
112108 bytesPruébalo en línea!
-4 bytes gracias a @ETHproductions.
Desempaquetado y cómo funciona
fuente
Japt
-R
, 94 bytesUn enfoque diferente pero con un poco de inspiración de la solución de Bubbler .
Prueba de ello (o intentarlo en línea )
Explicación
Línea 1
El resultado se asigna a la variable
U
.Línea 2
El resultado se asigna a la variable
V
.Línea 3
El resultado de esta línea se une implícitamente con nuevas líneas y resultados.
fuente
Perl 5 , 219 bytes
Pruébalo en línea!
fuente
Rubí - 410
Editar * Actualmente está fallando (por alguna razón, [cualquiera] se está estableciendo en 0 (type => fixnum)). Sin embargo, el diseño real es correcto, solo necesito encontrar el error que hace que esto suceda (es muy misterioso)
fuente
Python 284
fuente
JavaScript - 312
Ya hay una solución JS más corta arriba pero está utilizando funciones de puntero experimentales, así que pensé en agregar otra solución que se ejecuta en cualquier entorno JS:
fuente
Java:
557534Sin envolver:
fuente
PHP
429426421415impresión bonita
Necesitaré un lenguaje menos detallado la próxima vez
fuente
Python 2.7 - 319 bytes
Claro que no es el más pequeño, pero fue divertido programarlo.
Utiliza una función recursiva, por lo que puede alcanzar la máxima profundidad de recursión si hay algún tipo de devolución extraña con la cadena.
Enormes gracias a Sp3000 por su ayuda en el golf.
fuente
Julia, 281 bytes
Golfizado:
El algoritmo en sí no es muy inteligente, pero hay algunas partes interesantes aquí. La combinación de un intervalo de caracteres con otro personaje, a continuación, la indexación en él:
['A':'Z',' '][rand(1:27,n)]
y tomando la suma de una matriz de booleanos (comunes, pero todavía me encanta la idea):sum(a.=="METHINKS IT IS LIKE A WEASEL".data)
. Me alegro de tener menos de 300!Sin golf:
fuente