既知の既知のものがあります


45

元米国国防長官のドナルド・ラムズフェルドは、「既知の知人」というフレーズを有名にした。ここでは、彼の発言を4行のスタンザに要約します。

具体的には、次のテキストを出力します。

known knowns
known unknowns
unknown knowns
unknown unknowns

大文字と小文字は区別されません(たとえば、大文字Known unKnownsで結構です)。また、単一の末尾の改行を使用できますが、他の形式の変更は許可されていません。これは、単語間の単一のスペース、および行間のLF(59バイト)またはCR/LF(62バイト)を意味します。

ルール

  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

1
誰がこれが非常に多くのダウン票を持っているのか説明できますか?私にとってそれは合理的な挑戦であり、さまざまな言語でさまざまな回答を促しました。
エルペドロ

47
@ElPedro多くのダウン投票の背後にある理由は、既知の未知のことです
ワンダークリケット

行列または文字列のリストを返すことができますか?
アダム

1
@Adám4つの文字列のリストは、単語間のスペースを保持しているため、問題ありません。ただし、スペースを含むすべての文字のマトリックスを実行しない限り、マトリックスは問題ありません。
AdmBorkBork

1
末尾のスペースは意図的ですか?
user202729

回答:


29

パイソン254の 52バイト

xnorのおかげで-2バイト

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

オンラインでお試しください!

結果/とは%なり[[2, 2], [2, 0], [0, 2], [0, 0]]つまり除去、開始インデックスであろうunとき2とき不変ストリングを維持します、0


1
あなたが許可すればk可能'unknowns'、あなたが修正することができますk[i/3:7]し、2つのバイトを保存します。
-xnor

27

Vim 28 25バイト

これが私の最初のVimの回答です。ゴルフのヒントは大歓迎です。

2iunknown ␛rsY3P2xw.+.jw.

動作中

素晴らしいアニメーションを作成するためのPythonスクリプトを書いてくれたLynnに感謝します。

これは、V Try it Online!でも実行できます

また25:

2iknown ␛rsY3pwiun␛+.+.w.

別の25:2iunknown ␛rsYPw2x2YP2xj.またはわずかなバリエーション2iunknown ␛rsYPw2x2YPⓋjlx(variation = Ctrl-V)を見つけることができました。
リン

@Lynnニース、Ctrl-Vを試してみましたが、もっと長くなりました。
H.PWiz

23

bash、36バイト

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

他のソリューション

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\;"

先頭の改行と余分なスペースが31バイト受け入れられた場合:

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

3
これは次のとおりです。どのような魔術のを不思議に思ったものは、この(私のような)で、bashのブレース展開
bolov

bash-hackers.orgでさらによく説明されておりオンラインで試すことができます!
デザート

疑問がある場合は、コードブロック全体の答えを置く
スタン・ストラム


14

05AB1E13 12バイト

Erik the Outgolferのおかげで1バイト保存されました(文字列を閉じないでください)

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

オンラインでお試しください!

説明

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

2
“Š¢—‚“->„Š¢—‚
エリック・ザ・アウトゴルファー

@EriktheOutgolfer:ええ、たった2語です。ありがとう!
エミグナ

Bahhh ...どうして最初に見えなかったの?同じ答え。
魔法のタコ

11

CJam(26 25バイト)

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

オンラインデモ

["known" "unknown"]それ自体のデカルト積。次に、各要素はスペースで結合され、接尾辞とs改行が付きます。

1バイト節約してくれたErikに感謝します。



6

Haskell60 58 53 51バイト

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

オンラインでお試しください!

最近許可された行のリストを生成します。指摘してくれた@firefrorefiddleに感謝します。

coleのおかげで-2バイト。


58バイトバージョン:

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

オンラインでお試しください!単一の文字列を生成します。


60バイトバージョンは、実際には53バイトバージョンです。これはunlines、「4つの文字列のリストでも問題ありません。単語間のスペースを保持しているため」という理由で削除できます。(元の質問へのコメント)。
firefrorefiddle

1
アプローチと@PeterTaylorを組み合わせた51バイト
コール


5

網膜33 32バイト


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

オンラインでお試しください!編集:@ovsのおかげで1バイトを保存しました。説明:これは、ほとんどのプレースホルダを使用しての些細なアプローチでありknown、ここを除いて、私は単純に各スペースの前にそれを挿入したり、s保存する、3 4バイト。




2
@Leoを使用すると、|sアプローチすら必要なくなります:tio.run
Martin Ender


5

網膜33 32バイト

Leoの中間印刷アプローチを使用して1バイトを保存しました。


 ¶u

knowns
u
 un
:`s 
 
m`^
un

オンラインでお試しください!

説明


 ¶u

存在しない(つまり空の)入力を2行目の文字列に変換します。これはかなり奇妙に思えますが、これらの文字は、結果の最初の2行の2つのインスタンスを移動するコードですknown[s]。スペースとラインフィードはそれ自体であり、そうuです un


knowns

ここknownsで、すべての位置に挿入します(つまり、最初、最後、およびすべての文字ペアの間に)。

u
 un

をデコードしuます。

:s 
 

次にs、スペースの前のs、つまり各行の前半のs を取り除き、結果を出力します。

m`^
un

そして最後にun、両方の行の先頭に追加して、結果を再度印刷します。

これはプレースホルダをknown4バイトだけ使用するという単純なアプローチに勝りますが、Neilによるそのアプローチのより効率的な実装ではありません。


5

シェークスピアプログラミング言語1021 1012 993バイト

ジョーキングのおかげで-19バイト!

,.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.

オンラインでお試しください!


次のような複数の単語演算子の後にスペースを削除しますthe sum of
ジョーキング

本当に?ええと、それは再計算しなければならない数の最短表現です。ありがとう。
JosiahRyanW

4

Perl 6、45バイト

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

それを試してみてください

拡大

$_ = '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)

[X](…)一部は生成します

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

次に、それを使用X~して、内部リストをStrに強制します(&infix:«~»演算子のため)。これにより、値の間にスペースが追加されます。

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

次に、それぞれが s

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



4

APL(Dyalog)64 47 35バイト

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

オンラインでお試しください!

どうやって?

k←'known'- k"known"

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

∘....- それ自体との外積

    {⍺,' ',⍵,'s'} -引数を次のようにフォーマットする関数を使用 {⍺} {⍵}s

, -製品表をベクトルに粉砕します

-列に分離


33バイト(+不良な出力形式を修正)
dzaima

1
@dzaima 31
Kritixi Lithos

4

Java 8、56 55バイト

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

@SuperChafouinのおかげで-1バイト。

説明:

ここで試してみてください。

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)

さて、私は尋ねなければならない...なぜ\rですか?^^ '
オリビエグレゴワール

@OlivierGrégoireWoops ..; p
ケビン・クルーッセン

1
あなたが1バイトを獲得することができますv->" s\n uns\nun s\nun uns".replaceAll(" |s","known$0")
アルノー


3

、14バイト

OΠṠemhw¨ṅW∫ḟωμ

オンラインでお試しください!

説明

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マシンコード(C64)、48バイト

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

オンラインデモ

使用法: sys49152


使い方

ここでのトリックは初期値の1ビット7である8回の反復は、「ループ・カウンタ」を使用することである1ためunknown(s)0のためにknown(s)一回の反復です。このカウンターは、各反復(左端のビットをキャリーフラグにシフトする)の後に左にシフトされ、ビット0は最初にある1ので、最後のビットがシフトアウトされると終了します。knownプログラムの呼び出し時にキャリーフラグがクリアされるため、最初の反復で印刷されます。

各反復で、文字列の末尾は<space>との間で切り替わりs<newline>ます。

コメント付きの逆アセンブリのリストは次のとおりです。

         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バイト

免責事項<...>演算子内でブレース展開が可能であることに気づかず(@ Grimy回答のおかげで学んだ!)、@ NahuelFouilleul驚くべきbash回答からの巧妙な展開トリックを使用して、このソリューションを構築することができました。どちらのリクエストでも喜んで削除します。

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

オンラインでお試しください!


Perl 5、42バイト

41バイトのコード+ 1の場合-p

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

オンラインでお試しください!


Perl 5、45バイト

代替案を考え出そうとしましたが、短くすることはできませんでした...とにかく追加することを保証するのに十分異なると思いました。

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

オンラインでお試しください!


3

Haskell、71 66 56 54バイト

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

-3バイトの@Leoに感謝します!

注:質問のコメントでは、opは、文字列のリストを返すことは問題ないと述べました。

ここで試してみてください。


これは素晴らしいことであり、理解することすらできませんが、2番目fmap以降の部分は次のように短縮できますmap(' ':):)
レオ

1
@レオありがとう!ハハ、私も確認してください、私はもうそれを理解していないよ
アディソン

関数に名前を付ける必要はないため、をドロップできますf=
nimi



2

バッチ、66バイト

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

別の回答、66バイト:

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

もちろん、ネストされたループは、それを考えていませんでした...良い仕事です!
シュナーダー



2

PowerShell46 44バイト

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

オンラインでお試しください!

(ほぼ)単純な文字列置換。Neilのアプローチを使用して2バイトをトリミングします。それを指摘してくれたマーティンに感謝します。

悲しいことに、より興味深いクロス積法よりも3 5 3バイト短くなっています。

PowerShell49 47バイト

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

オンラインでお試しください!



@MartinEnderそう、いい電話。ありがとう!
AdmBorkBork

2

T-SQL、56 54バイト

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

SQLは、文字列リテラル内の改行をサポートしているため、すでに投稿されている他のいくつかの言語と同様です。

編集:少し長い(82バイト)が、もう少し賢い:

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

編集2:これまでのところ、派生テーブル(79バイト)からの相互自己結合を使用して、私のお気に入り:

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

編集3:置換文字をから'x'に変更しました1。これによりREPLACE、文字列への暗黙的な変換が行われるため、引用符を削除して2バイト節約できます。



1

Javascript 66 54 53 50バイト

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

歴史

  • @someoneのおかげで12バイト節約されました(メイン文字列で明示的に「un」を使用)
  • @ThePirateBayのおかげで1バイト節約されました(replaceの代わりにsplit..join)
  • @Neilのおかげで3バイト節約されました(より良いreplace())

1
文字列自体にunを追加する方が短いと思います
誰かが

あなたは完全に正しい、しかしそれがソリューションをあまりにも馬鹿にしているのは残念だ。
ブライアンH.

1
コンマの後のスペースは必要ですか?
誰か

4
1バイトを節約する代わりにsplit..joinを使用しreplaceます。

2
私は0sを削除して使用することを意味しました.replace(/ |s/g,'known$&')(現在は3バイトしか保存されていません)。
ニール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.