ASCIIアートテキストを読む


34

Golf meからインスパイアされたASCIIアルファベットで、このチャレンジは(ほぼ)直接の逆です。


仕事:

ASCIIアートテキストの文字列を取得し、テキストの内容を通常のASCIIテキストとして出力します。


入力:

ASCIIアートテキストの文字列。

入力には、ASCII文字#、スペース、および4つまたは5つの改行のインスタンスのみが含まれます(末尾の改行はオプションです)。すべての行の長さは同じです。(つまり、最後のASCIIアート文字の末尾にスペースが埋め込まれます。)#必要に応じて、入力ではなく他の印刷可能なASCII文字を使用できます。

入力には、ASCIIアート文字A-ZとASCIIアートスペース(空白の5x5ブロック)が含まれます。句読点はありません。ASCIIアートテキストは1行のみです(実際の5行)。末尾または先頭のASCIIアートスペースはなく、隣接するASCIIアートスペースもありません。

文字サイズは5x5文字です。各文字の間には1x5のスペースがあります。単語間のスペースは、5x5の空白ブロックです(もう1つの文字であるため、両側に1x5のスペースがあります)。ASCIIアート文字の間にのみ、末尾または先頭に1x5のスペースはありません。


出力:

ASCII文字A-Z+スペースとしてテキストを含む文字列。あなたのソリューションにとって何らかの形で簡単であれば、出力も小文字にすることができます。大文字と小文字を混在させることもできます。


ASCIIアート文字:

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

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

スペース:

     |
     | A 5x5 square of spaces.
     | (Padded with |s to make it appear in this post.)
     |
     |

例:

入力:

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

出力: HELLO WORLD

入力:

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

出力: ASCII

入力:

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

出力: PPCG


これはであるため、バイト単位の最短回答が優先されます。


10
私はこれに対する解決策が何らかのハッシュ関数を含むかもしれないと思っています
ニール

6
入力を画像に変換してこれを行うと、画像処理を使用してこれを解決する場合、私から恩恵を受けます!(もちろん、ソリューションもゴルフする必要があります)
スティービーグリフィン

3
誰かの助けになる場合:関連情報を失うことなく、文字の2行目、4行目、または中央の列をドロップできます。
マーティンエンダー

1
@JungHwanMinうーん。それは人間が読める ASCIIアートテキストではないからです。
-Steadybox

1
@JonathanAllanそれも大丈夫だと思う。
Steadybox

回答:


13

ゼリー 50 44  42 バイト

ỴZ;6/UOḂḅ7‘ị“¥ŒƲVĊ⁾|W£⁼³ƭÇuʋụzḢĖ0ḢẆẠØsĠỌỊ»

オンラインでお試しください!(引数には先頭の改行は必要ありませんが、先頭と末尾の改行には効果がないため、複数行の文字列をより人間が読みやすくするために改行を含めました)

結果は大文字と小文字が混在します(OP のコメントで許可されているとおり)。

どうやって?

新しい行で分割し、転置し、(最大)6つのサブスライスを結合して文字表現を取得し、それぞれを逆にします(長さ25の最終文字に対する後の基本変換を長さ30の他のすべてに等しくします)。次いで、マッピング'#'' '1と0のそれぞれに実際使用'#'しながら奇数序を有し' 'ても一つを有するが。それぞれがベース7の数値であるかのように読み取ります。効果的にそれぞれのモジュロ81を取り(27の可能なケースに対して27の一意の値を生成)、最終的に正しいインデックスで正しい文字を使用して「マジックストリング」にインデックスを付けます(モジュロインデックスは、長さ81のマジックストリングで使用され、 2バイト)。

一致する必要がある(大文字と小文字を区別しない)正規表現パターンと共に作成した「マジックストリング」を次に示します(長さ81にするために「ed」を追加しました)。

 ' affectedly Azerbaijan rewaxed naganas jiujitsudankly pase UVB freqHaarlemcoacted'
'^ ..f...e.....z......a..r.w.x...n.g......iuj....d..kly.p.s...vb....qh.....m.o.ct.*'

そのため、圧縮され、11個のサブスライスをJellyの辞書内の単語として検索します(ほとんどの場合、先行スペースのデフォルトが使用されます)。

' affectedly Azerbaijan rewaxed naganas jiujitsudankly pase UVB freqHaarlemcoacted'
 ^          ^          ^       ^       ^        ^     ^    ^   ^    ^      ^

その結果、Jelly圧縮された文字列、 “¥ŒƲVĊ⁾|W£⁼³ƭÇuʋụzḢĖ0ḢẆẠØsĠỌỊ»

残りのコードは次のように機能します。

ỴZ;6/UOḂḅ7‘ị“...» - Main link: multi-line string, s   e.g. HI as the #s and spaces
Ỵ                 - split on new lines                     ["#   # #####","#   #   #  ","#####   #  ","#   #   #  ","#   # #####"] (each is actually a list)
 Z                - transpose                              ["#####","  #  ","  #  ","  #  ","#####","     ","#   #","#   #","#####","#   #","#   #"] (each is actually a list)
   6/             - six-wise reduce by
  ;               -     concatenation                      ["#####  #    #    #  #####     ","#   ##   #######   ##   #"] (each is actually a list)
     U            - upend (reverse each)                   ["     #####  #    #    #  #####","#   ##   #######   ##   #"] (each is actually a list)
                  -     note: all except the last will be length 30 and like "     ...", which will become [0,0,0,0,0,...], while the last will be length 25 without those five leading zeros.
      O           - cast to ordinals ('#' -> 35, ' '-> 32) [[32,32,...],[35,32,...]]
       Ḃ          - modulo 2 ('#' -> 1, ' ' -> 0)          [000001111100100001000010011111, 1000110001111111000110001] (each is actually a list)
        ḅ7        - convert from base 7 (vectorises)       [223498370543967315553, 191672428080864454753] (these are now integers)
          ‘       - increment                              [223498370543967315554, 191672428080864454754]
                  -  (modulo 81 these would be [68, 41])
           ị      - index into (modulo & 1-indexed):                        
            “...» -     the "magic string" described above ' affectedly Azerbaijan rewaxed naganas jiujitsudankly pase UVB freqHaarlemcoacted'
                                                           "Hi"                                   41^                        68^

14

パイソン2405の 335 234 182 171バイト

lambda s,j=''.join:j(' QPVXU_O__FBLK_JMD_CSYZWIENH_AG___TR'[int(j(`ord(y)%2`for y in j(s.split('\n')[x][i:i+5]for x in range(5))),2)%13836%37]for i in range(0,len(s)/5,6))

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


最終的にJSよりも短い


モジュラスの巧妙な使用法ですが、方法がなければならないと考えて仕方がありません。[0,2,3,7,...]それを' UBGOTA...分割し、何らかのマッピングを使用します。0:' ',2:'U',3:'V'...とても長く見える、、、非常に多くがあり:'',ます。(元の投稿で似たようなことがあったが、数字が非常に長いことを知っています。
Stewie Griffin

1
それは今より良いです@StewieGriffin
OVS

11

JavaScriptの(ES6)、204の 186 184 182バイト

ニールに18のバイトのおかげで保存された
ETHproductionsに保存された2つのバイトのおかげで
YairRandに保存された2バイトのおかげ

壊す:

  • 42バイトのルックアップテーブル
  • 162の 144 142コードの140バイト
s=>(a=s.split`
`)[0].replace(/.{6}/g,(_,n)=>' H_JM__WDCSORLU___QKG_P_AFT_N_EI_XBV____YZ'[[0,1,2,4].reduce((p,r,i)=>p+='0b'+a[r].substr(n,5).replace(/./g,c=>1^1-c)<<i*6,0)%178%69%43])

デモ


1
もちろん、ありとなしを使用(a=s.split`\n`)[0].replace(/......?/g,してsubstr(n,5)、大量のバイトを保存できますjoin
ニール

でバイトを保存できc=>0|c>' '、別のバイトで保存できると思いますp+='0b'+...
-ETHproductions

チャレンジのコメントセクションで@Steadyboxが言及したように、\n入力の取り込みは無効です。ただし、splitメソッドで行うのと同じように、入力として実際の改行を含むテンプレートリテラルを使用できると思います。
アルジュン

1
@ DobbyTheFree-Elf実際にテンプレートリテラルを使用できます。これは、先行する引用のために、偶然にも読みやすさを損なうことになります。ただし、入力データが関数に渡される前にフォーマットされる方法に制約を追加することは、トピックIMHOの範囲外です(入力の実際の内容が有効である限り)。
アーナルド

1
@ DobbyTheFree-Elf私はコメントが少し曖昧だったのではないかと心配しています。私が答えていた質問を少し誤解したかもしれません。\nコードの呼び出しサイトで文字列リテラルを使用しても問題ありません。関数に渡される実際の文字列には改行文字のみが含まれ、\` and n . Passing a string that contains \ `とn隣接する別の文字の両方は含まれないためです。
Steadybox

9

Bash + ImageMagick + Tesseract、161バイト

@ stewie-griffinによって提案されたアプローチを試したいと思い、bash + ImageMagick(文字列を画像に変換する)とTesseract(OCRを行う)を選びました。「HELLO WORLD」テストケースでは機能するが、他のテストケースでは失敗するコードを次に示します。パラメータ(フォント、フォントサイズ、カーニング、間隔)を微調整すると役立つ場合があります。

convert -font Courier-Bold -pointsize 8 -interline-spacing -3 -kerning -3 label:"$(</dev/stdin)" -bordercolor White -border 5%x20% png:- | tesseract stdin stdout

コマンドを実行した後、ASCIIアートをコマンドラインにコピーアンドペーストするだけです。^ dを押して入力を終了します。

テストケースの現在の出力:

  • ハローワールド:ハローワールド
  • ASCII:H5511
  • PPCG:PPOG

6

Scala、 184181バイト

hashCode:)に基づくマジックストリング+モジュロソリューション

(a:String)=>a.split("\n").map(_.grouped(6)map(_.take(5))toArray).transpose.map(l=>"Q__WLUY_XOI_ZN_GEFR_P__JKBMV_S__ __C__D__H_T__A"(Math.abs(l.mkString.hashCode)%106%79%47))mkString

オンラインで試す(Scalafiddle)

より読みやすい:

(a:String) => a.split("\n")
                .map(_.grouped(6)map(_.take(5))toArray)
                .transpose
                .map ( l => 
                    "Q__WLUY_XOI_ZN_GEFR_P__JKBMV_S__ __C__D__H_T__A"(
                        Math.abs(l.mkString.hashCode)%106%79%47
                    )
                )mkString

説明

  • 最初の文字列(ASCIIアート)は5行(ASCII文字の高さ)に分割されます
  • 各行は6文字の要素に分割されます(ASCII文字の幅+ 1スペース)
  • 最初の5文字のみが保持されます(末尾のスペースは使用できません)
  • 行は転置されます(各ASCII文字は、'#'またはを含む25文字のシーケンス(5x5)として表されます' '
  • 各ASCII文字表現(シーケンス)は文字列に変換され、その文字列に対して絶対ハッシュコードが計算されます(次のモジュラスのために絶対に必要です)
  • 3つの連続するモジュラス(% 106 % 79 % 47)が適用され[0; 47[、各ASCII文字に数値εが関連付けられます(以下の説明を参照)
  • この番号は、マジックストリングのインデックスとして使用されます

魔法の文字列を取得するには?

最初に、私はこのようにすべての文字を表現しました:

case class Letter(letter: Char, ascii: Seq[Char])

次に、すべての文字のASCII表現を含むアルファベットを作成しました。

例:

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

になる

Letter('A', " ### #   #######   ##   #") // 25 characters from top-left to bottom-right

各文字について、絶対ハッシュコードが計算されました(すべてのハッシュコードは異なります)。

val codes = alphabet.map { case Letter(l, a) => (l, Math.abs(a.mkString.hashCode)) }
// codes: Seq[(Char, Int)] = List(( ,253243360), (A,380997542), (B,1221679148), (C,1573119535), (D,307929190), (E,858088672), (F,857996320), (G,750155628), (H,897290147), (I,1518088099), (J,928547488), (K,1184149391), (L,519601059), (M,741735953), (N,2139154001), (O,1625960980), (P,1307658950), (Q,92382816), (R,1221771494), (S,1689301359), (T,1515228067), (U,1390718627), (V,386730851), (W,733134481), (X,628338619), (Y,23919695), (Z,2081560145))

次に、各コードを減らしてみましたが、各コードが一意でなければならないという事実を常に尊重しました(コードでグループ化されたリストには、各文字に1つずつ、27個の要素が必要です)。だから私は最初の200モジュラスを試しました:

val mod = (1 to 200).find(modulo => codes.map { case (a,b) => (a, b % modulo) }.groupBy(_._2).size==27).get

106適用される最初のモジュロとして見つけました:

val codes2 = codes.map { case (l, c) => (l, c%mod) }
val codes = codes2
// codes: Seq[(Char, Int)] = List(( ,32), (A,46), (B,104), (C,35), (D,38), (E,16), (F,96), (G,94), (H,41), (I,89), (J,102), (K,71), (L,83), (M,105), (N,13), (O,56), (P,20), (Q,0), (R,18), (S,29), (T,43), (U,5), (V,27), (W,3), (X,87), (Y,53), (Z,91))

最小のモジュロになるまで、前の手順を繰り返しました。私が見つけた:

  • 79
  • 47
  • 44
  • 42

注:ここで選択した最後のモジュロ(47)は、ここでは最小ではありません。

  • 私は44を見つけたが、私は44を選択した場合は、魔法の文字列は、(代わりに47の)サイズ44を持っているでしょうが、私が書く必要があります%106%79%47%44(13個の文字を代わりに%106%79%47 = 10文字)。バイト単位で、コードは私が手に入れたものと同じサイズでなければなりませんでした
  • 42もありますが、コードは私が得たものより1バイト多くなければなりませんでした

次に、連続するモジュラス(% 79 % 47)を最後に適用して、codes各文字に関連付けられた決定的なコードを取得します。

codes: Seq[(Char, Int)] = List(( ,32), (A,46), (B,25), (C,35), (D,38), (E,16), (F,17), (G,15), (H,41), (I,10), (J,23), (K,24), (L,4), (M,26), (N,13), (O,9), (P,20), (Q,0), (R,18), (S,29), (T,43), (U,5), (V,27), (W,3), (X,8), (Y,6), (Z,12))

最後に、魔法の文字列を作成するには:

val initialMap = (0 until 47).map(i => (i, '_')).toMap
val codesMap = codes.map(i => (i._2, i._1)).toMap

val magicString = (initialMap ++ codesMap).toSeq.sortBy(_._1).map(_._2).mkString
// magicString: String "Q__WLUY_XOI_ZN_GEFR_P__JKBMV_S__ __C__D__H_T__A"

例:上記の文字Aは46(380997542 % 106 % 79 % 47)におり、マジックストリングの46番目の要素はAです:)

テストケース

// assign function to f
val f = (a:String)=>a.split("\n").map(_.grouped(6)map(_.take(5))toArray).transpose.map(l=>"Q__WLUY_XOI_ZN_GEFR_P__JKBMV_S__ __C__D__H_T__A"(Math.abs(l.mkString.hashCode)%106%79%47))mkString

こんにちは世界 :

val asciiArt = """|#   # ##### #     #      ###        #   #  ###  ####  #     #### 
                  |#   # #     #     #     #   #       #   # #   # #   # #     #   #
                  |##### ####  #     #     #   #       # # # #   # ####  #     #   #
                  |#   # #     #     #     #   #       ## ## #   # #   # #     #   #
                  |#   # ##### ##### #####  ###        #   #  ###  #   # ##### #### """.stripMargin

f(asciiArt)    // HELLO WORLD

ASCII:

val asciiArt = """| ###   ###   ###  ##### #####
                  |#   # #     #   #   #     #  
                  |#####  ###  #       #     #  
                  |#   #     # #   #   #     #  
                  |#   #  ###   ###  ##### #####""".stripMargin

f(asciiArt)    // ASCII

PPCG:

val asciiArt = """|####  ####   ###   ### 
                  |#   # #   # #   # #    
                  |####  ####  #     #  ##
                  |#     #     #   # #   #
                  |#     #      ###   ### """.stripMargin

f(asciiArt)    // PPCG

編集

  • 除去することにより、3つのバイトを保存.する前にmaptoArraymkString

3

PHP、294バイト

<?$l=" 00000YE00G0000R000A0Q0000C0BW000K00000000000LT00000J00000000MU0000Z0000DI000000V0000000P00H0000ONF000S00X";preg_match_all("#(.{5})\s#s","$_GET[0] ",$t);for($i=0;$i<$c=count($a=$t[1])/5;$i++)$s.=$l[bindec(strtr($a[$i].$a[$i+$c].$a[$i+2*$c].$a[$i+3*$c].$a[$i+4*$c]," #","01"))%106];echo$s;

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

拡大

$l=" 00000YE00G0000R000A0Q0000C0BW000K00000000000LT00000J00000000MU0000Z0000DI000000V0000000P00H0000ONF000S00X"; # search string mod 106
preg_match_all("#(.{5})\s#s","$_GET[0] ",$t); # Regex take each group of five chars followed by a whitespace
for($i=0;$i<$c=count($a=$t[1])/5;$i++)
  $s.=$l[bindec(strtr($a[$i].$a[$i+$c].$a[$i+2*$c].$a[$i+3*$c].$a[$i+4*$c]," #","01"))%106]; # join each groups make a binaray make a decimal mod 106  
echo$s; # Output

入力を画像形式に変換する

@Stevie Griffinは、画像からこれを取得するためのソリューションを検索します。彼は本当に私が使っている画像フォーマットを望んでいないと思う。

echo'<svg xmlns="http://www.w3.org/2000/svg" width="100%"><switch><foreignObject x="0" y="0" width="100%" height="300"><body xmlns="http://www.w3.org/1999/xhtml"><pre>'.$_GET[0].'</pre></body></foreignObject></switch></svg>';

SVGは、foreignObjectに含まれている場合、HTMLパーツを含むことができます。そこで、SVGにpre要素を配置しました。

画像出力

<svg xmlns="http://www.w3.org/2000/svg" width="100%"><switch><foreignObject x="0" y="0" width="100%" height="300"><body xmlns="http://www.w3.org/1999/xhtml"><pre>#   # ##### #     #      ###        #   #  ###  ####  #     #### 
#   # #     #     #     #   #       #   # #   # #   # #     #   #
##### ####  #     #     #   #       # # # #   # ####  #     #   #
#   # #     #     #     #   #       ## ## #   # #   # #     #   #
#   # ##### ##### #####  ###        #   #  ###  #   # ##### #### </pre></body></foreignObject></switch></svg>

画像の変化から解決する

SVGは「i.svg」としてSVGを保存した後、機械可読そうであるあなただけ取り替える必要が$_GET[0]preg_replace("#(^.*e>)(.*)(</p.*$)#s","$2",join(file("i.svg")))+通常の入力での方法で55のバイトを


2

Powershell、152 146バイト

-join$(for($t=$args-split'
';$c-lt$t[0].Length;$c+=6){$s=0;$t|% s*g $c,5|% t*y|%{$s+=$s+$_}
'_ISRJ_BK_HFQPL_MYNCE _TXDAO_VWUZ__G'[$s%578%174%36]})

テストスクリプト:

$f = {

-join$(for($t=$args-split'
';$c-lt$t[0].Length;$c+=6){$s=0;$t|% s*g $c,5|% t*y|%{$s+=$s+$_}
'_ISRJ_BK_HFQPL_MYNCE _TXDAO_VWUZ__G'[$s%578%174%36]})

}

&$f @"
#   # ##### #     #      ###        #   #  ###  ####  #     #### 
#   # #     #     #     #   #       #   # #   # #   # #     #   #
##### ####  #     #     #   #       # # # #   # ####  #     #   #
#   # #     #     #     #   #       ## ## #   # #   # #     #   #
#   # ##### ##### #####  ###        #   #  ###  #   # ##### #### 
"@

&$f @"
 ###   ###   ###  ##### #####
#   # #     #   #   #     #  
#####  ###  #       #     #  
#   #     # #   #   #     #  
#   #  ###   ###  ##### #####
"@

&$f @"
####  ####   ###   ### 
#   # #   # #   # #    
####  ####  #     #  ##
#     #     #   # #   #
#     #      ###   ### 
"@

&$f @"
       ###  ####   ###  ####  ##### #####  ###  #   # ##### ##### #   # #     #   # #   #  ###  ####   ###  ####   ###  ##### #   # #   # #   # #   # #   # #####
      #   # #   # #   # #   # #     #     #     #   #   #     #   #  #  #     ## ## ##  # #   # #   # #   # #   # #       #   #   # #   # #   #  # #   # #     # 
      ##### ####  #     #   # ####  ####  #  ## #####   #     #   ###   #     # # # # # # #   # ####  #   # ####   ###    #   #   #  # #  # # #   #     #     #  
      #   # #   # #   # #   # #     #     #   # #   #   #   # #   #  #  #     #   # #  ## #   # #     #  #  #   #     #   #   #   #  # #  ## ##  # #    #    #   
      #   # ####   ###  ####  ##### #      ###  #   # ##### ###   #   # ##### #   # #   #  ###  #      ## # #   #  ###    #    ###    #   #   # #   #   #   #####
"@

出力:

HELLO WORLD
ASCII
PPCG
 ABCDEFGHIJKLMNOPQRSTUVWXYZ

注意:

  1. $t|% s*g $c,5|% t*y|%{$s+=$s+$_} のショートカットです $t.substring($c,5).toCharArray()|%{$s+=$s+$_}
  2. ("abcd","efgh").substring(1,2) 配列を返します ("bc","de")
  3. ("bc","de").toCharArray() 配列を返します ('b','c','d','e')

2

C、  225  209バイト

16バイトを節約してくれた@ceilingcatに感謝します!

i,j,k,l,n,m;f(char*s){l=index(s,10)-s+1;for(i=0;i<l/6;++i){for(m=j=0;j<5;m+=n*(exp10(j++)+.1))for(n=k=0;k<5;)n+=(s[i*6+j+k*l]==35)<<k++;for(j=0;"Qi Y$>W);Xa%d^F4K-]7jcMAG="[j++]-32-m%77;);putchar(n?64+j:32);}}

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.