Hay conocidos conocidos


45

El ex secretario de Defensa estadounidense, Donald Rumsfeld, famoso popularizó la frase "conocidos conocidos". Aquí vamos a destilar sus comentarios en una estrofa de cuatro líneas.

Específicamente, envíe este texto:

known knowns
known unknowns
unknown knowns
unknown unknowns

La capitalización no importa (por ejemplo, Known unKnownsestá bien), y una nueva línea final es aceptable, pero no se permiten otros cambios de formato. Eso significa un espacio único entre las palabras, y LF(59 bytes) o CR/LF(62 bytes) entre las líneas.

Reglas

  • Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
  • Las lagunas estándar están prohibidas.
  • Este es el por lo que se aplican todas las reglas habituales de golf y gana el código más corto (en bytes).

1
¿Alguien puede explicar por qué esto tiene tantos votos negativos? Para mí es un desafío razonable y ha alentado una variedad de respuestas en una mezcla de idiomas.
ElPedro

47
@ElPedro La razón detrás de los muchos votos negativos es una desconocida conocida
Wondercricket

¿Podemos devolver una matriz o una lista de cadenas?
Adám

1
@ Adám Una lista de cuatro cadenas estaría bien, ya que aún conserva el espacio entre las palabras; pero, a menos que esté haciendo una matriz de cada carácter, incluidos los espacios, las matrices no están bien.
AdmBorkBork

1
¿Son intencionales los espacios finales?
user202729

Respuestas:


29

Python 2 , 54 52 bytes

-2 bytes gracias a xnor

k='unknowns'
for i in 8,6,2,0:print k[i/3:7],k[i%3:]

Pruébalo en línea!

Los resultados de /y %serán [[2, 2], [2, 0], [0, 2], [0, 0]]los índices iniciales, eliminando el uncuándo 2, manteniendo la cadena inalterada cuando0


1
Si deja que ksea 'unknowns', se puede corregir con k[i/3:7]y guardar dos bytes.
xnor

27

Vim 28 25 bytes

Esta es mi primera respuesta de Vim, cualquier consejo de golf es bienvenido.

2iunknown ␛rsY3P2xw.+.jw.

En acción

Gracias Lynn por escribir el script de Python para hacer esa animación fantástica.

Esto también puede ser ejecutado por V ¡ Pruébelo en línea!

También 25:

2iknown ␛rsY3pwiun␛+.+.w.

Solo logré encontrar otros 25: 2iunknown ␛rsYPw2x2YP2xj.o una ligera variación 2iunknown ␛rsYPw2x2YPⓋjlx(Ⓥ = Ctrl-V).
Lynn

@ Lynn Nice, probé Ctrl-V pero obtuve algo más.
H.PWiz

23

bash, 36 bytes

printf %s\\n {,un}known\ {,un}knowns

otras soluciones

36

eval echo\ {,un}known\ {,un}knowns\;

37

eval printf '%s\\n' \{,un}known{\\,s}

38

eval eval echo\\ \{,un}known{\\,'s\;'}

41

x=\\\ {,un}known;eval "eval echo$x$x\s\;"

45

x='\ {,un}known' e=eval;$e "$e echo$x$x\s\;"
x='\ {,un}known' e=eval\ ;$e"$e\echo$x$x\s\;"

si la nueva línea inicial y el espacio adicional se aceptaran 31 bytes:

echo '
'{,un}known\ {,un}knowns

3
Para los que preguntan qué clase de brujería es esta (como yo): esta es la expansión de llaves fiesta
bolov

… Incluso mejor explicado en bash-hackers.org , ¡y puedes probarlo en línea! .
postre

En caso de duda, coloque la respuesta completa en un bloque de código
Stan Strum,

reformulado, la entrada no válida al final
Nahuel Fouilleul

14

05AB1E , 13 12 bytes

Guardado 1 byte gracias a Erik the Outgolfer (evita cerrar cadena)

„Š¢—‚#D's«â»

Pruébalo en línea!

Explicación

„Š¢—‚           # push the string "known unknown"
     #          # split on spaces
      D         # duplicate
       's«      # append "s" to each
          â     # cartesian product
           »    # join on newline

2
“Š¢—‚“->„Š¢—‚
Erik the Outgolfer

@EriktheOutgolfer: Oh, sí, solo 2 palabras. ¡Gracias!
Emigna

Bahhh ... ¿por qué no miré primero? La misma respuesta
Urna de pulpo mágico

11

CJam ( 26 25 bytes)

"unknown"_2>\]2m*{S*'sN}%

Demostración en línea

Producto cartesiano de ["known" "unknown"]sí mismo, luego cada elemento se unió con espacio y sufijo con suna nueva línea.

Gracias a Erik por un ahorro de un byte.



6

Haskell , 60 58 53 51 bytes

f<$>l<*>l
f x y=x++' ':y++"s"
l=["known","unknown"]

Pruébalo en línea!

Produce una lista de líneas como se permitió recientemente. Gracias a @firefrorefiddle por señalarlo.

-2 bytes gracias a cole .


Versión de 58 bytes:

f=<<"? ?s\n? un?s\nun? ?s\nun? un?s"
f '?'="known"
f c=[c]

Pruébalo en línea! Produce una sola cuerda.


Su versión de 60 bytes es en realidad una versión de 53 bytes porque puede eliminarla unlinesporque "Una lista de cuatro cadenas estaría bien, ya que aún conserva el espacio entre las palabras"; (Comentario a la pregunta original).
firefrorefiddle

1
51 bytes combinando su enfoque con @ PeterTaylor's
cole


5

Retina , 33 32 bytes


 s¶ uns¶un s¶un uns
 |s
known$&

Pruébalo en línea! Editar: Guardado 1 byte gracias a @ovs. Explicación: Este es casi el enfoque trivial de usar un marcador de posición known, excepto que aquí simplemente lo inserto antes de cada espacio o s, lo que ahorra 3 4 bytes.



2
Puede mejorar esto imprimiendo hasta la mitad
Leo

2
@Leo usando eso ya ni siquiera necesita el |senfoque: tio.run/##K0otycxL/P@fK1shu/jQtmyF0rzsYi6rhGyu7Lz88jyu3IQ4rtK8//…
Martin Ender

5

PHP, 55 51 47 bytes

<?=strtr("1 1s
1 01s
01 1s
01 01s",[un,known]);

pruébalo en línea


¿Necesita abrir etiquetas para las entradas de php?
Josías el

@Josiah Necesito algo para imprimir el resultado; <?=Es la opción más corta.
Titus

5

Retina , 33 32 bytes

Se guardó 1 byte con un enfoque de impresión intermedio de Leo.


 ¶u

knowns
u
 un
:`s 
 
m`^
un

Pruébalo en línea!

Explicación


 ¶u

Convierte la entrada inexistente (es decir, vacía) en la cadena en la segunda línea. Ese parece bastante extraño, pero estos personajes son códigos para las cosas que van entre dos instancias known[s]en las dos primeras líneas del resultado. El espacio y el salto de línea son solo ellos mismos y lo uson un.


knowns

Ahora insertamos knownsen cada posición (es decir, al principio, al final y entre cada par de caracteres).

u
 un

Decodificamos el u.

:s 
 

Luego nos deshacemos de la ss delante de los espacios, es decir, los de la primera mitad de cada línea, e imprimimos el resultado.

m`^
un

Y finalmente anteponemos unambas líneas e imprimimos el resultado nuevamente.

Esto supera el enfoque trivial de solo usar un marcador de posición knownpor 4 bytes, pero no la implementación más eficiente de ese enfoque por parte de Neil .


5

Lenguaje de programación Shakespeare , 1021 1012 993 bytes

-19 bytes gracias a Joe King!

,.Ajax,.Ford,.Page,.Act I:.Scene I:.[Exeunt][Enter Ajax and Ford]Ajax:Am I nicer a big cat?If sois the remainder of the quotient betweenI the sum ofa cat a big cat worse a big cat?If notlet usScene V.You be the sum ofa fat fat fat pig the cube ofthe sum ofa cat a big big cat.Speak thy.You be the sum ofyou the sum ofa cat a fat fat fat pig.Speak thy.Scene V:.[Exit Ajax][Enter Page]Page:You be the product ofthe sum ofa cat a big big cat the sum ofa pig a big big big big cat.Speak thy.You be the sum ofyou the sum ofa cat a big cat.Speak thy.Ford:You be the sum ofI a cat.Speak thy.You be the sum ofyou a big big big cat.Speak thy.Page:Speak thy.You be the sum ofyou the sum ofa cat a big big cat.Is the remainder of the quotient betweenAjax a big cat worse a cat?If soyou big big big big big cat.Speak thy.If solet usScene X.You be twice the sum ofa cat a big big cat.Speak thy.Scene X:.[Exit Page][Enter Ajax]Ford:You be the sum ofyou a cat.Be you worse a big big big cat?If solet usAct I.

Pruébalo en línea!


Puede eliminar los espacios después de algunos operadores de varias palabras comothe sum of
Jo King el

De Verdad? Huh, son muchas las representaciones de números más cortas que tengo que volver a calcular. Gracias.
JosiahRyanW

4

Perl 6 , 45 bytes

$_='known';.say for [X](($_,"un$_")xx 2)X~'s'

Intentalo

Expandido

$_ = 'known';

.say                # print with trailing newline the value in topic variable 「$_」

  for               # do that for each of the following

    [X](
      ($_, "un$_")  # ('known','unknown')
        xx 2        # list repeated twice
    ) X~ 's'        # cross using &infix:«~» with 's' (adds 「s」 to the end)

La [X](…)parte genera

(("known","known"),("known","unknown"),("unknown","known"),("unknown","unknown")).Seq

Luego, usarlo X~coacciona las listas internas en un Str (debido al &infix:«~»operador), que al hacerlo agrega un espacio entre los valores.

("known known", "known unknown", "unknown known", "unknown unknown").Seq

Entonces cada uno se une con un s

("known knowns", "known unknowns", "unknown knowns", "unknown unknowns").Seq


4

Haskell, 57 52 bytes

id=<<id=<<mapM(\s->[s,"un"++s])["known ","knowns\n"]

Pruébalo en línea!


49 bytes con una salida alternativa de la lista
cole

@cole: el formato de salida es muy estricto, por lo que creo que una lista de cadenas no es válida.
nimi

la otra respuesta de haskell lo hace, parece que el OP aprobó ese formato.
cole

4

APL (Dyalog) , 64 47 35 bytes

⍪,∘.{⍺,' ',⍵,'s'}⍨k('un',k'known')

Pruébalo en línea!

¿Cómo?

k←'known'- kes"known"

k('un',k←'known') - "known" "unknown"

∘.... - producto externo consigo mismo

    {⍺,' ',⍵,'s'} - con la función que formatea los argumentos como {⍺} {⍵}s

, - aplastar la tabla de productos en vector

- separado a columnas


33 bytes (+ arreglando el formato de salida incorrecto)
dzaima

1
@dzaima 31
Kritixi Lithos

4

Java 8, 56 55 bytes

v->" s\n uns\nun s\nun uns".replaceAll(" |s","known$0")

-1 byte gracias a @SuperChafouin .

Explicación:

Pruébalo aquí

v->                         // Method with empty unused parameter
  " s\n uns\nun s\nun uns"  //  Literal String
   .replaceAll(" |s",       //  Replace all spaces and "s" with:
     "known                 //   Literal "known"
           $0")             //   + the match (the space or "s")
                            // End of method (implicit / single-line return-statement)

De acuerdo, tengo que preguntar ... ¿por qué \r? ^^ '
Olivier Grégoire

@ OlivierGrégoire Woops ..; p
Kevin Cruijssen

1
Puedes ganar un byte conv->" s\n uns\nun s\nun uns".replaceAll(" |s","known$0")
Arnaud


3

Casco , 14 bytes

OΠṠemhw¨ṅW∫ḟωμ

Pruébalo en línea!

Explicación

OΠṠemhw¨ṅW∫ḟωμ
       ¨ṅW∫ḟωμ    The compressed string "knowns unknowns"
      w           Split on spaces ["knowns","unknowns"]
   e              Make a list with:
    mh             this list with the last letter dropped from each word
  Ṡ                and this same list
                  [["known","unknown"],["knowns","unknowns"]]
 Π                Cartesian product [["known","knowns"],["unknown","knowns"],["known","unknowns"],["unknown","unknowns"]]
O                 Sort the list [["known","knowns"],["known","unknowns"],["unknown","knowns"],["unknown","unknowns"]]
                  Implicitely print joining with spaces and newlines

3

6502 código máquina (C64), 48 bytes

00 C0 A9 37 85 FB A9 73 4D 2B C0 8D 2B C0 A9 0D 4D 2C C0 8D 2C C0 A9 26 90 02
E9 02 A0 C0 20 1E AB 06 FB D0 E1 60 55 4E 4B 4E 4F 57 4E 53 0D 00

Demostración en línea

Uso: sys49152


Cómo funciona

El truco aquí es usar un "contador de bucles" para 8 iteraciones donde los bits 7 a 1 del valor inicial son 1para unknown(s)y 0para known(s)en una iteración. Este contador se desplaza hacia la izquierda después de cada iteración (desplazando el bit más a la izquierda hacia el indicador de acarreo) y el bit 0es inicialmente, 1por lo que sabemos que hemos terminado una vez que se desplazó el último bit. En la primera iteración, knownse imprime porque al llamar al programa, el indicador de acarreo está claro.

En cada iteración, el final de la cadena se alterna entre <space>y s<newline>.

Aquí está el listado de desmontaje comentado:

         00 C0            .WORD $C000    ; load address
.C:c000  A9 37            LDA #$37       ; initialize loop counter ...
.C:c002  85 FB            STA $FB        ; ... as 0011 0111, see description
.C:c004   .loop:
.C:c004  A9 73            LDA #('s'^' ') ; toggle between 's' and space
.C:c006  4D 2B C0         EOR .plural
.C:c009  8D 2B C0         STA .plural
.C:c00c  A9 0D            LDA #$0D       ; toggle between newline and 0
.C:c00e  4D 2C C0         EOR .newline
.C:c011  8D 2C C0         STA .newline
.C:c014  A9 26            LDA #<.knowns  ; start at "known" except
.C:c016  90 02            BCC .noprefix  ; when carry set from shifting $fb:
.C:c018  E9 02            SBC #$02       ; than start at "un"
.C:c01a   .noprefix:
.C:c01a  A0 C0            LDY #>.knowns  ; high-byte of string start
.C:c01c  20 1E AB         JSR $AB1E      ; output 0-terminated string
.C:c01f  06 FB            ASL $FB        ; shift loop counter
.C:c021  D0 E1            BNE .loop      ; repeat if not 0 yet
.C:c023  60               RTS            ; done
.C:c024   .unknowns:
.C:c024  55 4E           .BYTE "un"
.C:c026   .knowns:
.C:c026  4B 4E 4F 57 4E  .BYTE "known"
.C:c02b   .plural:
.C:c02b  53              .BYTE "s"
.C:c02c   .newline
.C:c02c  0D 00           .BYTE $0d, $00

3

Perl 5 , 33 bytes

Descargo de responsabilidad : no me di cuenta de que era posible la expansión de llaves dentro del <...>operador (¡aprendí gracias a la respuesta de @ Grimy !) Y al usar el ingenioso truco de expansión de la sorprendente respuesta de @ NahuelFouilleul , pude construir esta solución. Felizmente eliminaré esto a cualquiera de sus solicitudes.

print<"{,un}known {,un}knowns$/">

Pruébalo en línea!


Perl 5 , 42 bytes

Código de 41 bytes + 1 para -p.

s//K Ks
K unKs/;s/K/known/g;$\=s/^/un/gmr

Pruébalo en línea!


Perl 5 , 45 bytes

Intenté encontrar una alternativa, pero no pude hacerlo más corto ... Pensé que era lo suficientemente diferente como para justificar la adición de todos modos.

print"un"x/[3467]/,known,$_%2?"s
":$"for 0..7

Pruébalo en línea!


3

Haskell, 71 66 56 54 bytes

(<*>).map((++).init)<*>map(' ':)$["knowns","unknowns"]

¡Gracias a @Leo por -3 bytes!

Nota: En los comentarios de la pregunta, el operador dijo que devolver una lista de cadenas está bien

Pruébalo aquí


Esto es genial y ni siquiera puedo entenderlo, pero la parte de tu segundo en fmapadelante se puede acortar a map(' ':):)
Leo

1
@Leo Gracias! Jaja, ni siquiera estoy seguro de entenderlo más
addison

No es necesario darle un nombre a la función, por lo que puede soltar el f=.
nimi



2

Lote, 66 bytes

@set s= in (known unknown)do @
@for %%a%s%for %%b%s%echo %%a %%bs

Respuesta alternativa, también 66 bytes:

@for %%a in (k unk)do @for %%b in (k unk) do @echo %%anown %%bnowns

Por supuesto, bucles anidados, no he pensado en eso ... ¡buen trabajo!
schnaader



2

PowerShell , 46 44 bytes

' s
 uns
un s
un uns'-replace' |s','known$&'

Pruébalo en línea!

(Casi) simple reemplazo de cadena. Utiliza el enfoque de Neil para recortar dos bytes. Gracias a Martin por señalar eso.

Lamentablemente, es más corto que el método de productos cruzados más interesante en tres cinco tres bytes:

PowerShell , 49 47 bytes

($a='known','unknown')|%{$i=$_;$a|%{"$i $_`s"}}

Pruébalo en línea!



@MartinEnder Correcto, buena decisión. ¡Gracias!
AdmBorkBork

2

T-SQL, 56 54 bytes

PRINT REPLACE('1 1s
1 un1s
un1 1s
un1 un1s',1,'known')

SQL admite saltos de línea dentro de literales de cadena, de manera similar a algunos otros idiomas ya publicados.

EDITAR : Ligeramente más largo ( 82 bytes ), pero un poco más inteligente:

SELECT k+s+k+p+k+s+u+p+u+s+k+p+u+s+u+p
FROM(SELECT'known'k,' 's,'unknown'u,'s
'p)t

EDIT 2 : Mi favorito hasta ahora, usando una unión cruzada de una tabla derivada ( 79 bytes ):

WITH t AS(SELECT'known'a UNION SELECT'unknown')
SELECT z.a+' '+t.a+'s'FROM t,t z

EDITAR 3 : Cambió el carácter de reemplazo de 'x'a 1, lo que me permite eliminar las comillas a su alrededor y guardar 2 bytes, ya que REPLACEhace una conversión implícita a cadena.



1

Javascript 66 54 53 50 bytes

_=>` s
 uns
un s
un uns`.replace(/ |s/g,'known$&')

Historia

  • guardado 12 bytes gracias a @someone (uso explícito de "un" en la cadena principal)
  • guardado 1 byte gracias a @ThePirateBay (dividir ... unirse en lugar de reemplazar)
  • guardado 3 bytes gracias a @Neil (mejor reemplazar ())

1
Creo que sería más corto agregar un en la cadena en sí
alguien

tienes toda la razón, una pena que entorpezca tanto la solución.
Brian H.

1
¿Se necesita el espacio después de la coma?
alguien

44
Usando split..join en lugar de guardarreplace un byte.

2
Me refería a eliminar el 0sy usar .replace(/ |s/g,'known$&')(que ahora solo ahorra 3 bytes).
Neil
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.