ヘルプ:エイリアンプログラマーはASCIIのみを話す


22

シーンの設定:

長い一日を過ごした後、お気に入りの娯楽、PPCGの魅力的な質問に答えることでくつろぐので、それは平均的な午後です。あなたにとって良い日ではありませんでした。それらのとてつもないPythプログラマーは最高の答えを得続け、それはあなたの雰囲気を殺している。突然、新しい質問が投稿されました!あなたは決心します。今回はCJammersではありません。猛烈に、あなたはタイプし始め、文字の流れを産みます。最終製品となる見事なBrainFuckループの胎児。入力して入力します。もっと早く!さらに速く!あなたはあまりにも集中しているので、画面上のライトが点滅し始めるのに気付くことすらありません。突然、モニターが緑色に点灯します。これは、デスクトップにブランド化された異星人のようなシンボルです。あなたの完璧なスキルを使用してcat ~/Desktop/aliensymbolたくさんの数字、メッセージが表示されます!あなたが抜け目のないPPCGプログラマであることから、あなたはそれがASCIIのように見えることに気付くでしょう。あなたに関係なく、あなたprint(chr(i) for i in file)とメッセージを解読します。あなたの最初の考え:「これをコミュニティと共有する必要があります!」。

...

誰がそれを考えたでしょうか?エイリアンと最初に接触するのはPPCGの謙虚なプログラマーだろうということ。なんで私達なの?それは、私たちが人間の知性の縮図だからかもしれません。あるいは、BrainFuckが外国語とほぼ同じくらい近いからかもしれません。それにもかかわらず、エイリアンは-彼らがいる超知的な生命体である-人類を知的なものとして分類すべきかどうかをテストしたい。私たちの精神力のテストとして、エイリアンは私たちに技術的な文化であることを示すためにいくつかのコンピュータープログラムを送るように頼みました。問題は、彼らが理解している唯一の人間の言語は数値ASCIIであるということです!

人類が本当の知的アルファである生き物を示すのを助けてください。テキストベースのソースコードを数値のASCIIバージョンに変換するスクリプトを送信する必要があります。残念ながら、当社の未開発の技術により(オバマ氏に感謝)、できるだけ小さな翻訳プログラムを送信する必要があります。彼らがPPCGに連絡することを選んだのは良いことです!

チャレンジ:

この課題の前提は簡単です。プログラムのソースコード(または、一般的なテキストファイル)を取得するプログラムを作成し、各行の下にASCII変換を含むスペース区切りバージョンを出力します。つまり、テキストファイルの入力が与えられた場合、そのファイルの各行を出力し、その後にその行の各文字のASCII表現を含む行を出力する必要があります(各数字が表す文字と並んでいます)。

例はこれを非常に明確にします。hello world入力として悪名高いのソースコードを取得します。

#include <stdio.h>

int main() {
    printf("hello, world\n");
    return 0;
}

あなたのプログラムは出力するはずです:

#   i   n   c   l   u   d   e       <   s   t   d   i   o   .   h   >
35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  10

10
i   n   t       m   a   i   n   (   )       {
105 110 116 32  109 97  105 110 40  41  32  123 10
                p   r   i   n   t   f   (   "   h   e   l   l   o   ,       w   o   r   l   d   \   n   "   )   ;
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 44  32  119 111 114 108 100 92  110 34  41  59  10
                r   e   t   u   r   n       0   ;
32  32  32  32  114 101 116 117 114 110 32  48  59  10
}
125 10

実装の詳細:

任意の形式(ファイル、コマンドラインパイプ、関数パラメーターなどを開く)で入力を選択することができ、stdoutに出力するか、関数から出力を返す必要があります。

注意事項

  • 出力の各文字は '\ t'で区切られ、下の行の3桁のスペースを揃えることができます(タブが4スペース以上に設定されていると仮定します)。
  • 改行は、リターンキーが押された行に表示されます(例では10に注意してください)。
  • '\ t'および '\ n'の印刷要件は緩やかです。あなたの出力は、一般的な意味で、目を楽しませなければなりません(私たちにも美的感覚を持っているエイリアンを表示する必要があります)。
  • 最後の行の終わりに改行があるかどうかを仮定することを選択できます。

得点

これはコードゴルフなので、最短のプログラムが勝ちます。プログラムは最短ではありませんが、使用している言語に比べて本当にすてきなトリックを使用している場合でも、多くの+1があります。

がんばろう。人類の銀河間知能ランキングはあなたの肩にかかっています。

注:プロットホールはご容赦ください。私は作家ではありません:D


8
「プロット」を落とすか、大幅に単純化して、チャレンジをそのままにしてください。正直なところ、3段落のバックストーリーを読むつもりはありません。それが私がここにいるので、私は挑戦を読むつもりです。
mbomb007

1
@YetiCGN改行は改行として機能しており(それを表す文字は表示されませんが、表示されます)、それでもasciiバージョンで明示的に記述する必要があります。正規表現で「\ n」のソースコードを検索したかのように考えてください。あなたの検索がハイライトでしょうどこでもあなたが10を書くべきところである。ここ vimのからの例(最後のものを無視する)です。
-gowrath

26
@ mbomb007 tbh、それはかなり壮大なバックストーリーでした。私はそれをちょっと楽しんだ
Maltysen

7
@ mbomb007読みたい人はできること、そうでない人はチャレンジの部分に直接行くことができます。これが字幕の美しさです。
-gowrath

1
私はそれを「人間と最初に接触するのはPPCGの謙虚なプログラマーだろう」と読んだ。
マルツェルム

回答:


5

Dyalog APL、14 バイト

改行シーケンス(10または13 10など)を含む文字列のリストを取得します

↑(⊢,[.5]⎕UCS

からなるリストのリストをマトリックス化する

(... 各行の戻り値について...

テキスト自体

,[.5] 新しい次元で最初の次元の前に続く

⎕UCSU nicode C haracter Sらコードポイント

TryAPLオンライン!


一度にすべての入力を取り込むのではなく、各行ごとにこれを呼び出しませんか?
スティーブンH.

1
@stevenH。いいえ、(関数の右端の)関数にはループが含まれていますが、全体としては1回だけ呼び出されます。f入力で直接呼び出されるTryAPLの例を参照してください。もし言っていたら、1行に1回関数を呼び出すには
アダム

9

Pyth、17 13バイト

Pythプログラマーのもう一人。 ごめんなさい。

新しいコードでは、各行を引用符で囲んでエスケープする必要があります(印刷する場合は改行を含む)が、行とASCIIの間に余分な改行を挿入します。

jjLC9smCMBd.Q

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

説明:

           .Q  Evaluate all input lines
      m        For each of those lines:
         Bd     Return the line and
       CM       the line mapped to ASCII characters
     s         Sum all these together to begin alternating between line and mapped line
 jLC9          Join all the characters and numbers in the lines and mapped lines on tabs
j              And join all of those on newlines

私は古いコードとその説明を以下に保持しています。

#Jw
jKC9J
jK+CMJT

オンラインでお試しください!または読みやすいテストケースを使用します。

説明:

#                  Until we run into an error:
 Jw                 Read in the next line of input and call it J.
                     (When there is no line of input, error is thrown that ends program.) 

j                  Join: 
    J               all characters in input line
 KC9                and insert tab characters (C9), which we can refer to later as K.
                        (Setting it to a variable doesn't save or lose bytes.)

                   Implicit print that join with trailing newline.

j                  Join:
   CMJ              the mapping of ASCII numbers to characters in the input,
 K                  inserting tab characters in between every number
  +   T             And with a trailing 10 for the newline at the end.

1
最初のリンクは2番目のリンクと同じように機能しないと思います(新しい行を印刷しないと思います)。その中のコードを更新することもできます。
-gowrath

8

Python 2、105バイト

これは、OPの答えとは少し異なるアプローチを使用します。SOはリテラルのタブをスペースで混乱させることに注意してください。

def f(s):
 o=x=''
 for c in s:
    o+=c+"  ";x+="%s    "%ord(c)
    if"\n"==c:print o[:-1],x;o=x=''
 print o+"\n"+x

オンラインで試す


x+=ord(c)+" "より短くはないでしょう"%s "%ord(c)か?
DJMcMayhem

@DJMcMayhem文字列に整数を追加することはできません。x+=`ord(c)`+" "同じ長さです。
mbomb007

8

Vimは、86、 77回のキーストローク

:g/^/norm A<C-v><C-v>10<C-v><esc>Yp:s/./\=char2nr(submatch(0))."\t"/g<C-v><cr>k:s/./&\t/g<C-v><cr>
:%s/<C-v><cr>0<cr>

これは長すぎますが、vimのeval機能(\=)を使用すると得られるものです。


6
あなたがあれば言うことができない\=evalの機能を説明する、または悲しい顔されますが、evalの機能を使用しているので...
AdmBorkBork

2
@timmyD最初。これは私の悲しい顔です。D;
DJMcMayhem


6

Perl、> 33 31バイト

+3を含みます-F(組み合わせることはできず-e、コードも持つ'ため、スペース-もカウントされます)。

STDINの入力で実行するか、1つ以上のファイル名を引数として指定します

perl -M5.010 asciidump.pl <<< "Hoi"

asciidump.pl

#!/usr/bin/perl -F
$"=v9;say"@F@{[unpack'W*']}"

テキストにタブが含まれている場合、または最終的な改行がない場合、出力は見栄えがよくありません


5

Pyth、21バイト

j.imjC9d.zmjC9+CMdT.z

これは、「ひどいPythプログラマー」の 1人のエントリです;)

STDINで引用符で囲まれていない複数行の文字列の入力を受け取り、結果を出力するプログラム。これは、すべての入力の末尾に改行があることを前提としています。末尾の改行を処理しない場合<は、プログラムの最初と)_3最後に追加します。

オンラインで試す

テストケースの出力は、オンラインインタープリターで見るのが難しいため、ここに含めました。

#   i   n   c   l   u   d   e       <   s   t   d   i   o   .   h   >
35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  10

10
i   n   t       m   a   i   n   t   (   )       {
105 110 116 32  109 97  105 110 116 40  41  32  123 10
                p   r   i   n   t   f   (   "   h   e   l   l   o   ,       w   o   r   l   d   \   n   "   )   ;
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 44  32  119 111 114 108 100 92  110 34  41  59  10
                r   e   t   u   r   n       0   ;
32  32  32  32  114 101 116 117 114 110 32  48  59  10
}
125 10

使い方

j.imjC9d.zmjC9+CMdT.z  Program. Input: .z (All of STDIN split on newlines)
     C9                 Yield tab character by taking chr(9)
    j                   Join on tab
   m   d.z             Map that over .z
               CM       Map ord()
              +   T     Append 10
           jC9          Join on tab
          m      d .z  Map that over .z
 .i                    Interleave the results of the two mappings
j                      Join on newlines
                       Implicitly print

あなたはを取り除くことで2つのバイトを保存することができます.zし、行のリストとして入力を取る
Maltysen

1
@Maltysen質問と他の回答から判断すると、改行の分割は課題の一部だと思います。
-TheBikingViking

5

C、136の 117の 114バイト

#define p(s)while(l[i])printf(s,l[i++]);i=0;puts("")
char l[99];i;f(f){while(fgets(l,99,f)){p("%c\t");p("%d\t");}}

char l[99];i;f(f){while(fgets(l,256,f)){i=0;while(l[i])printf("%c\t",l[i++]);i=0;puts("");while(l[i])printf("%d\t",l[i++]);puts("");}}

このようにテストできます

infile;
main(c,v)char**v;
{
    infile=fopen(v[1],"r");
    f(infile);    
}

持つchar**v内部でmain()..あなたにそこに2つの文字を救う
アレクシス・ヴィルケ

ええと、そのコードでは114バイトしかカウントしません。LF(117-> 115)の代わりにCRLFを使用していることに加えて、末尾に改行(115-> 114)があります。
ティムČas16年

4

PowerShell v2 +、85バイト

gc $args|%{$a=$b='';$_-split'(.)'-ne''|%{$a+="$_`t";$b+="$(+[char]$_)`t"};$a;$b+"10"}

入力はファイルへのパスを介して行われます。次に、そのファイルでGet-Content(エイリアスgc)、改行で自動的に分割します。それらのそれぞれをループします|%{...}。設定でスタート$aし、$b空の文字列に-これらはそれぞれ、当社のASCII文字とコードポイントです。次に-split、すべての文字の入力行を保持し(.)、空の値を削除し-ne''(.NET正規表現の解析方法による)、それらを別のループに送信します。

各内部ループでは、現在の文字をタブで文字列連結し、`tそれをに追加します$a。同様に$b、として明示的にキャストし、char次にintとしてキャストすることを除きます+

内側のループの外側では、パイプライン上に結果の$aand を配置します(ループ$b指定ではラインフィード指定子は表示されないため)。これらはWrite-Output、プログラムの完了時に暗黙的にまとめられます。

(末尾の改行があり、Markdownがタブ文字をマングルすることを理解して)

PS C:\Tools\Scripts\golfing> .\aliens-only-understand-ascii.ps1 '.\aliens-only-understand-ascii.txt'
#   i   n   c   l   u   d   e       <   s   t   d   i   o   .   h   >   
35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  10

10
i   n   t       m   a   i   n   t   (   )       {   
105 110 116 32  109 97  105 110 116 40  41  32  123 10
                p   r   i   n   t   f   (   "   h   e   l   l   o   w   ,       w   o   r   l   d   \   n   "   )   ;   
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 119 44  32  119 111 114 108 100 92  110 34  41  59  10
                r   e   t   u   r   n       0   ;   
32  32  32  32  114 101 116 117 114 110 32  48  59  10
}   
125 10

くそー、PowerShellの回答を書いたところ、どうにかしてこれを完全に見逃してしまいました!常に上流階級が表されるのを見てうれしい!:)
briantist

4

> <>(魚)、48バイト

>i:0(?v::oa=?v9o
2';'oa<.20r  <~p3
o9nv?=0l
voa<

言語が輝くタスク!おそらくもう少しゴルフアウトできたと思うが、それは長い週だった。しかし、後でそれを見るかもしれません。

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

代替試して、それがオンラインのテストケースのような長い行で入力のためのルックスは、私の意見でよりよいが、少しアップテキストの折り返しを台無しいます。


4

PHP、131 115バイト

単なるFGITWであり、それをさらに改善できるかもしれません。わかった、できる!

131バイトの最初のバージョン:

<?$s=file($argv[1]);foreach($s as$l){$a=str_split(trim($l));echo join(' ',$a).'
';$i=0;while($c=ord($l{$i++}))echo$c.'  ';echo'
';};

ファイル名は、スクリプト名の後の最初の引数として提供されます。 php aliens.php helloworld.c

115バイトの2番目のバージョン:

function($s){foreach($s as$l){$a=str_split($l);echo join('  ',$a);$i=0;while($c=ord($a[$i++]))echo$c.'  ';echo'
';}};

最初のバージョンは行末の改行の欠落を説明しますが、追加の明確化の後、そのコードを省き、すべてを関数に入れて16バイトを節約できます。

内および内の空白文字はjoin(' ',$a)echo$c.' 'タブ文字= \tです。コード内の改行は意図的です。


3

Python 3、89 77バイト

同じ考えに基づいたより多くのゴ​​ルフバージョン:

def f(s):
 for a in s:print(*map('{:>4}'.format,[*a,*a.encode()]),end='\n\n')

tは入力にあります\」がある場合は、変更4します9

以前のバージョン:

def f(s):
 for l in s:
  print(*l,sep='\t',end='');print(*l.encode(),sep='\t',end='\n\n')

それぞれが「\ n」で終わる文字列のリストを取得します。


protip:あなたが最後にprint文を残すことができfor l in s、すなわちfor l in s:print(*l,sep='\t',end='');print(*l.encode(),sep='\t',end='\n\n')
破壊可能なレモン

私はそれをテストしていませんが、8を離陸できると思いますlambda s:'\n\n'.join(*map('{:>4}'.format,[*a,*a.encode()])for a in s)
DJMcMayhem

3

Powershell、56バイト

gc $args|%{($a=[char[]]$_)-join"    ";[int[]]$a+10-join"    "}

スクリプトは、入力としてファイルパスを受け入れます。Get-Contentは、入力をソースの改行で分割された文字列の配列に自動的に分割します。

そこからforeachを入力し、文字の配列にキャストして$ aに設定し、それをタブで結合して印刷します。次に、まだforeach内で、文字配列を整数配列にキャストし、改行を追加して、タブで再度結合します。

呼び出しは次のようになります。

PS C:\PretendFolder> .\aoua.ps1 ".\aoua.txt"

ここに出力サンプルがあります

#   i   n   c   l   u   d   e       <   s   t   d   i   o   .   h   >
35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  10

10
i   n   t       m   a   i   n   (   )       {
105 110 116 32  109 97  105 110 40  41  32  123 10
                p   r   i   n   t   f   (   "   h   e   l   l   o   ,       w   o   r   l   d   \   n   "   )   ;
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 44  32  119 111 114 108 100 92  110 34  41  59  10
                r   e   t   u   r   n       0   ;
32  32  32  32  114 101 116 117 114 110 32  48  59  10
}
125 10

2

JavaScript(ES6)、94バイト

s=>s.replace(/(.*)\n?/g,(s,n)=>n&&[...s].join`␉`+`
${[...n].map(c=>c.charCodeAt()).join`␉`}
`)

ここで、␉はリテラルのタブ文字を表します。入力にタブ文字が含まれていない限り機能します。入力に末尾の改行が必要な81バイトバージョン:

s=>s.replace(/.*\n/g,s=>[...s].join`␉`+[...s].map(c=>c.charCodeAt()).join`␉`+`
`)

.split().map()は勝つかもしれないと思う.replace()。エスケープ文字はバッククォートで最適化されると、これは85バイトである必要があります:s=>s.split('\n').map(c=>(s=[...c]).join('\t')+'\n'+s.map(c=>c.charCodeAt()).join('\t')).join('\n')(バッククォートはコメントに含めることができる方法/場合は申し訳ありませんが、私はさっぱりだが。)
アルノー

@Arnauldは、(たとえば)裸の改行文字では機能しません。また、コメントにバッククォートを含めるには、それらの前にバックスラッシュを付けます。
ニール

2

C#、64 63バイト

s=>{foreach(int c in s+(s=""))s+=c+(10==c?"\n":"    ");return s;};

-1バイトではなく、実際のタブ文字を使用します\t。注:上の4スペースと下の非ゴルフバージョンでは2スペースとしてレンダリングされます。

ゴルフをしていない:

/*Func<string, string> Lambda =*/ s =>
{
    // Enumerate the ascii (int) values of the chars in s, 
    // but at the same time set input s to "" to use at the output var.
    // +(s="")   is 2 bytes less than   var o="";
    foreach (int c in s + (s=""))
        // Append the string representation of the ascii value,
        // Append new line if c was new line, otherwise append tab. 
        s += c + (10==c ? "\n" : "  ");
    return s;
};

結果:

(注:\r\n入力を貼り付けたときに新しい行にVisual Studioが使用されているため、13 10出力で行が終了しています)

Input:

#include <stdio.h>

int maint() {
    printf("hello, world\n");
    return 0;
}

Output:

35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  13  10
13  10
105 110 116 32  109 97  105 110 116 40  41  32  123 13  10
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 44  32  119 111 114 108 100 92  110 34  41  59  13  10
32  32  32  32  114 101 116 117 114 110 32  48  59  13  10
125 

2

CJam、27バイト

qN/{_1/9c*N+\{is9c}%+}%AN+*

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

説明

q       e# Take the whole input
N/      e# Split on newlines
{       e# Map this block to every line:
_        e# Duplicate
1/       e# Split into characters
9c*      e# Join with tabs (ASCII code 9)
N+       e# Append a newline
\        e# Swap top elements
{is9c}%  e# Map each character to its ASCII code plus a tab character
+        e# Concatenate the two lines
}%      e# (end of block)
AN+*    e# Join with "10" plus a newline

1/そしてs不要です。
マーティンエンダー

2

PowerShell、61 59バイト

gc m|%{$b="$_
"[0..$_.Length]
$b-join'    '
[int[]]$b-join' '}

注意事項:

  • m現在のディレクトリにある名前のファイルから入力を読み取ります。
  • すべての改行(最初の文字列の後の文字列に埋め込まれたものを含む$_)はリテラルの改行(0xA)であるため、それぞれ1バイトです。
  • -join演算子の直後の文字列の内容は、それぞれ単一のタブ文字です(ここでの表示方法に関係なく)。

非ゴルフ

Get-Content m | ForEach-Object -Process { # Read the file line by line
    $b = "$_`n"[0..$_.Length]   # Line by line processing strips line endings, so add a newline
                                # Index operator on a [string] returns a [char], or given a [range], a [char[]]
                                # Using $_.Length automatically accounts for the extra linebreak (0 based index)
    $b -join "`t"               # PowerShell displays [char] as the printable character by default, so join the array with a tab
    [int[]]$b -join "`t"        # We need to convert the [char]s to an [int]s so we can display it as a number
                                # So cast the [char[]] as [int[]], then join with tab again

}

コードは、チャレンジの出力例のように、10の代わりにASCII 13、改行を印刷しています
-Chirishman

@Chirishman PowerShellは、.ps1ファイルの改行にASCII 10のみを使用することをサポートしていますが、ほとんどのテキストエディターを使用するWindowsでこれを行うのは難しい場合があります。SCiTEまたはNotepad ++、またはその他の行末認識エディタを使用すると、UNIXの末尾を使用していることを確認できます。ファイルに13が含まれていないことが確認されると、10が出力されます。
ブリアンティスト

0

Java、202バイト

s->{for(String g : s.split("\n")){g.chars().forEach(c->System.out.print((char)c+"   "));System.out.println();g.chars().forEach(c->System.out.print(c+(c<10?"  ":c<100?"  ":" ")));System.out.println();}};

これを短くすることさえできません。



-1

Python 3、92 97107バイト

for i for list(open(input())。read()。split( "\ n")):iのj:print(i + "\ n" + ord(j))

p=print
for i in list(open(input()).read().split("\n"))
    s=t=''
    for j in i:
        r=str(ord(j))
        s+=j+' '*len(r)
        t+=r+' '
    p(s)
    p(t)

これはテストされていませんが、動作するはずです。

質問で指定されているとおりにコードが実行されていないことを指摘してくれた@gowrathに感謝します。


何故なの?input()そこで実行するコマンドはすべて、開くファイルの名前を取得することです。
-sonrad10

@gowrathああ、わかった。
sonrad10

これは、質問仕様のようにテキストとasciiの出力をオーバーレイしません。数字を印刷するだけです。
-gowrath

@gowrathありがと、ありがとうございます。
-sonrad10

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