正弦波テキスト


30

目標:入力文字列を正弦波形状で出力するプログラムまたは関数を作成します。

ASCII正弦波

これが正弦波の1つの期間です。

         .......                                 
      ...       ...                              
    ..             ..                            
   .                 .                           
  .                   .                          
 .                     .                         
.                       .                       .
                         .                     . 
                          .                   .  
                           .                 .   
                            ..             ..    
                              ...       ...      
                                 .......         

各列に正確に1つのドットがあることに注意してください。

  • 入力文字列の各文字は、上記の形状のドットを左から右に置き換えます。
  • 入力のスペースは、ドットの代わりに通常の文字のように出力する必要があります。
  • 開始文字は、上の図の左端のドットに対応しています。
  • これは1周期のみで、入力は上記のドット数よりも長くなる場合があります。

入力

  • 入力は、ASCII 10進数32(スペース)とASCII 10進数126(ティルド〜)の間の文字のみを含むASCII文字列です。
  • 入力は常に1行のみです(改行なし)。
  • 入力は、STDIN、関数パラメーター、コマンドライン引数、または同様のものを介して取得できます。

出力

  • 出力は、指定されたテストケースとまったく同じように印刷する必要があります。
  • 行の末尾のスペースは、それらの末尾のスペースを含む行の長さが最長行(最後の文字がある行)の長さを超えない限り許可されます。
  • 先頭/末尾の行は許可されません。

テストケース

  • 入力: .................................................

出力:

         .......                                 
      ...       ...                              
    ..             ..                            
   .                 .                           
  .                   .                          
 .                     .                         
.                       .                       .
                         .                     . 
                          .                   .  
                           .                 .   
                            ..             ..    
                              ...       ...      
                                 .......         
  • 入力: Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.

出力:

         ng Puzz                                         ion and                                         siasts                                          stratio           
      mmi       les                                   est        an                                   thu       and                                   egi       n r        
    ra              &                               qu             sw                               en              c                                r             eq      
   g                                                                 e                                               o                             o                 u     
  o                   C                           a                   r                           e                   d                           n                   i    
 r                     o                                                                         l                     e                                               r   
P                       d                       s                       s                       z                                               ,                       e  
                         e                     i                         i                     z                         g                     e                         d 
                                                                          t                   u                           o                   e                           .
                           G                 e                             e                 p                             l                 r                             
                            ol             ng                                f             g                                fe              f                              
                              f S       cha                                   or        min                                   rs.       00%                                
                                 tack Ex                                         program                                          It's 1                                   
  • 入力: Short text.

出力:

         t.
      tex  
    t      
   r       
  o        
 h         
S          
  • 入力: The quick brown fox jumps over the lazy dog

出力:

          brown                            
      ick       fox                        
    qu              j                      
                     u                     
  e                   m                    
 h                     p                   
T                       s                  

                          o                
                           v               
                            er             
                               th       dog
                                 e lazy    

得点

これはであるため、バイト単位の最短のプログラムまたは機能が優先されます。


これは私が考えていたものです
ベータ崩壊

ああ、それは確かにやや似ていると思います。
15

ちなみに、あなたの波は完全に正弦波ではありません。(当然、sinそれを再現するために関数を使用しようとしましたが、位置は少しずれています。)
デビッドZ

@DavidZそれは私を驚かせるわけではありません、私はASCIIの形を目で見ました。列に「ギャップ」のない正弦波状のもの(列ごとに正確に1つのドット)を取得できますか?
15

4
テストケース2の出力のスクロールバーを非常に速く前後に動かすことで、2、3分楽しんで楽しませました。
mbomb007

回答:


7

Pyth、59バイト(57文字)

Xjb.sC.>V+R*12\ Xz\ C9*+-L12K+JsM._+6jC\཈2tP_JKlz]*dlzC9d

デモンストレーション。

バイナリルックアップテーブルは内部にエンコードされ、値は3912です。これはバイナリに変換され、を与え[1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0]ます。これは、連続する高さの差として扱われます。6を先頭に追加して、すべてのプレフィックスを形成し、それぞれをその合計にマッピングすることにより、ウェーブの最初の4分の1が生成されます。

sM._+6jC\཈2[6, 7, 8, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12]上記のように評価されます。次に、コードはこの文字列の逆で連結して波の前半を形成し、12から減算して波全体を提供します。

次に、各入力文字の行とそれに続く12個のスペースを形成します。この線は、その位置に対応する波高パラメータによって右に回転し、その後、線が転置されて改行で結合されます。

次に、先頭と末尾の空白行を取り除きます。ただし、入力からスペースがある先頭または末尾の空白行を取り除くことはできません。これは、入力内のスペースをタブ(C9)に置き換えることで実装されます。タブは入力に含めることはできず、空白行を取り除き、タブをスペースに戻します。


@FryAmTheEggman固定、コストは16バイト。
isaacg

12

Python 2、156バイト

l=map(int,"654322111%08d1122345"%1);l+=[12-c for c in l]
def f(t):
 h=len(t);o=bytearray(' '*h+'\n')*13;i=0
 for c in t:o[i-~h*l[i%48]]=c;i+=1
 print o[:-1]

説明

  • コード全体は単にスペースのブロック(o)を作り、正しいスペースを入力の文字で置き換えますt

  • 変数にlは、上からのオフセットのリストが格納されます。そのため、のn番目の文字がtオンラインになりl[n]ます。

  • Python oでは文字列は不変なので、bytearray は可変文字列として機能します。

  • -~hと同じですが、h+1括弧を必要としないため、スペースを節約できます。


7

Java、219 209 199バイト

void p(char[]s){int r=6,c;String t="";for(;r>-7;r--,t+='\n')for(c=0;c<s.length;c++)t+=(s(c%48)==r?s[c]:' ');System.out.println(t);}int s(int a){return a<4?a:a<6?4:a<9?5:a<15?6:a<24?s(24-a):-s(a-24);}

私はまだ初心者なので、サブ関数を導入するルールに準拠していることを期待しています(もちろん、この関数のバイトがカウントされる場合)。そうでない場合は、sin関数を巧妙な配列ルックアップに変換しようとします...

public class SinusText
{
    public static void main(String[] args)
    {
        SinusText s = new SinusText();
        s.p(".................................................".toCharArray());
        s.p("Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.".toCharArray());
        s.p("Short text.".toCharArray());
        s.p("The quick brown fox jumps over the lazy dog".toCharArray());
    }
    void p(char[]s){int r=6,c;String t="";for(;r>-7;r--,t+='\n')for(c=0;c<s.length;c++)t+=(s(c%48)==r?s[c]:' ');System.out.println(t);}int s(int a){return a<4?a:a<6?4:a<9?5:a<15?6:a<24?s(24-a):-s(a-24);}
}

1
いくつかの文字列ベースのチャレンジでは、入力をとして取得する場合も節約されますchar[]。ここでは、()on lengthを取り除きcharAt()、同様に削除します。私がそれを正しく読んでいるなら、print()代わりにprintln()を使用してさらに数個節約することもできます。
ジオビット

@Geobitsこれらは私が知らなかった自由度です。タスクの説明では「文字列」について説明しているため、それぞれの言語の「THE」文字列表現でなければならないと考えました。...
Marco13

うん、私はいつかメタでそれについて尋ねた。参照用のリンクを次に示し
2214

おかげで、それは209です。(多分、あと数バイト絞ってみます。「sin」関数はまだ冗長に見えます...)
Marco13

1
うーん、大きな改善ではありませんが、モジュラス48全体を実行することで10を削減できます。末尾をに変更し...a<24?s(24-a):-s(a-24);、で呼び出しますs(c%48)
ジオビット

4

Perl、222バイト

$n[$_%13].=substr$l[$_/13],$_%13,1for 0..13*(@l=map{(map{sprintf"%013b",$_}@t=(64,128,256,512,(1024)x2,(2048)x3),(4096)x7,reverse@u=(32,16,8,4,4,2,2,2),(1)x7,(reverse@u),@t)[$-++%48]=~s/./$&?$_:$"/egr}<>=~/./g);$,=$/;say@n

-Efor が必要ですsay。2進数にキャストされた整数として位置を格納します。配列の反転は、おそらくバイト単位ではあまり効率的ではありません。また、貯金が十分にあると確信しているので、突っ込み続けます。

出力例:

$perl -E '$n[$_%13].=substr$l[$_/13],$_%13,1for 0..13*(@l=map{(map{sprintf"%013b",$_}@t=(64,128,256,512,(1024)x2,(2048)x3),(4096)x7,reverse@u=(32,16,8,4,4,2,2,2),(1)x7,(reverse@u),@t)[$-++%48]=~s/./$&?$_:$"/egr}<>=~/./g);$,=$/;say@n' <<< '.................................................'
         .......                                 
      ...       ...                              
    ..             ..                            
   .                 .                           
  .                   .                          
 .                     .                         
.                       .                       .
                         .                     . 
                          .                   .  
                           .                 .   
                            ..             ..    
                              ...       ...      
                                 .......         

$perl -E '$n[$_%13].=substr$l[$_/13],$_%13,1for 0..13*(@l=map{(map{sprintf"%013b",$_}@t=(64,128,256,512,(1024)x2,(2048)x3),(4096)x7,reverse@u=(32,16,8,4,4,2,2,2),(1)x7,(reverse@u),@t)[$-++%48]=~s/./$&?$_:$"/egr}<>=~/./g);$,=$/;say@n' <<< 'Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It'\''s 100% free, no registration required.'
         ng Puzz                                         ion and                                         siasts                                          stratio           
      mmi       les                                   est        an                                   thu       and                                   egi       n r        
    ra              &                               qu             sw                               en              c                                r             eq      
   g                                                                 e                                               o                             o                 u     
  o                   C                           a                   r                           e                   d                           n                   i    
 r                     o                                                                         l                     e                                               r   
P                       d                       s                       s                       z                                               ,                       e  
                         e                     i                         i                     z                         g                     e                         d 
                                                                          t                   u                           o                   e                           .
                           G                 e                             e                 p                             l                 r                             
                            ol             ng                                f             g                                fe              f                              
                              f S       cha                                   or        min                                   rs.       00%                                
                                 tack Ex                                         program                                          It's 1                                   

3

JavaScript、251 243 224 220 217

本当に単純な実装:文字列を使用して、ウェーブ上の各文字のy位置を表します(aASCIIコード97であるによるオフセット)。次に、可能なすべての行を反復処理します。現在の行のy値がウェーブのy位置と同じ場合、文字列から文字を書き込みます。行が完全に空白であることが判明した場合、行を削除するためのクリーンアップも最後にあります。

alert()等幅フォントを使用していない場合、出力はウィンドウに不安定に表示されることに注意してくださいconsole.log()。出力が正しいことを確認するように変更できます。

s=prompt(o=[])
for(y=i=0;y<13;++y){o[i]=""
for(x=0;x<s.length;++x)o[i]+=y=="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97?s[x]:" "
if(o[i++].trim().length<1)o.splice(--i,1)}
alert(o.join("\n"))

EDIT1:++および--存在します。

EDIT2:空白行の削除は、残りと同じループで行われ、17文字を保存します。余分な2文字のために、これらの括弧も必要ありませんでした。

EDIT3:波形を変数として宣言する必要はなく、4文字を節約します。

EDIT4:コメントでDom Hastingsが指摘したように、バイトカウントには改行文字と改行が含まれ、すべてのリビジョンのバイトカウントが更新されて改行が除外されました。

EDIT5:Dom Hastingsのご厚意により3バイトを保存しました。o.splice空白行の削除に失敗するため、修正を実装していません(少なくとも、私の側では)。


1
よくやった!あなたはより多くのカップルを保存することができますいくつかの場所バイト:置き換えますif(o[i++].trim().length<1)o.splice(--i,1)o.splice(i-(t=!o[i++].match(/\s/)),t)、-4のために、s=prompt() o=[]と:s=prompt(o=[])、-1とfor(y=0,i=0;y<13;++y){o[i]=""for(y=i=0;y<13;++y){o[i]=""、-2。これは、組み合わせて、おそらく可能ですあなたのループは、あまりにも多くの保存するために...最後に一つ、あなたの225は窓かもしれないので、私は、あなたの現在のバイト数220を持っていることにも注意することの価値\r\nだけではなく、の\n私はあなたが無視できると仮定(私が間違っている場合は、私を修正してください)...
ドムヘイスティングス

キャリッジリターンで十分キャッチ!次回はNotepad ++をあまり信用しません:)
ショーンレイサム

166に減らしたと思います。他の誰かが確認できますか?プログラム全体で配列の動作をログに変更しました。私はifステートメントの代わりに短絡回路を使用し、最初のforループの終わりにログを置くことで括弧を取り除きました。for(s=prompt(),y=0;y<13;y++,v.trim()&&console.log(v))for(v="",x=0;x<s.length;x++)v+=y=="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97?s[x]:" "
バルタン

減算と==交換するfalsyゼロを使用して、165チャー for(s=prompt(y=0);y<13;y++,v.trim()&&console.log(v))for(v="",x=0;x<s.length;x++)v+="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97-y?" ":s[x]
バルタン

私のコメントから貼り付けるのに問題がありますので、ペーストビンbit.ly/1VQgGXw 217-> 166 = 76%
Vartan

3

MATLAB、133、130のバイト

ワンライナー:

s=input('');y=ceil(5.6*sin(0:pi/24:pi-.1).^.9);l=[-y y]+7;n=numel(s);t=repmat(' ',13,n);for k=1:n;t(l(mod(k-1,48)+1),k)=s(k);end;t

そして、拡張バージョン:

function f(s)
    y=ceil(5.6*sin(0:pi/24:pi-.1).^.9);l=[-y y]+7;  %// calculate the line number for each column position
    n=numel(s);                                     %// number of character in input
    t=repmat(' ',13,n);                             %// Create a blank canvas of whitespace characters
    for k=1:n
        t(l(mod(k-1,48)+1),k)=s(k);                 %// place each input character where it should be
    end
    t                                               %// force the output display

1つのライナーは、コンソール(stdin)からの入力を受け取り、130バイトです。拡張バージョンは、コンソール入力を関数定義(+1バイト)に置き換えますが、ループ内のテストケースで使用する方がはるかに快適です。


説明:

各文字の行インデックスは半期間計算され、その後、ミラーリングおよび連結されて全期間になります。
空白文字の空白の背景を作成します(入力文字列と同じ長さ。関連する行の位置に応じて各文字を配置します。入力文字列が1ピリオドより長い場合、mod(モジュロ)演算子はそれをラップします。 t行番号を要求するときに範囲外になります。


テストケース:

textsine.mパスに関数のバージョンを保存して、次を実行します。

s = {'.................................................';...
    'Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It''s 100% free, no registration required.';...
    'Short text.';...
    'The quick brown fox jumps over the lazy dog'};

for txtcase=1:4
    textsine(s{txtcase,1})
end

出力されます:

t =

         .......                                 
      ...       ...                              
    ..             ..                            
   .                 .                           
  .                   .                          
 .                     .                         
.                       .                       .
                         .                     . 
                          .                   .  
                           .                 .   
                            ..             ..    
                              ...       ...      
                                 .......         


t =

         ng Puzz                                         ion and                                         siasts                                          stratio           
      mmi       les                                   est        an                                   thu       and                                   egi       n r        
    ra              &                               qu             sw                               en              c                                r             eq      
   g                                                                 e                                               o                             o                 u     
  o                   C                           a                   r                           e                   d                           n                   i    
 r                     o                                                                         l                     e                                               r   
P                       d                       s                       s                       z                                               ,                       e  
                         e                     i                         i                     z                         g                     e                         d 
                                                                          t                   u                           o                   e                           .
                           G                 e                             e                 p                             l                 r                             
                            ol             ng                                f             g                                fe              f                              
                              f S       cha                                   or        min                                   rs.       00%                                
                                 tack Ex                                         program                                          It's 1                                   


t =

         t.
      tex  
    t      
   r       
  o        
 h         
S          








t =

          brown                            
      ick       fox                        
    qu              j                      
                     u                     
  e                   m                    
 h                     p                   
T                       s                  

                          o                
                           v               
                            er             
                               th       dog
                                 e lazy    

からの入力を使用して1つのライナーバージョンをテストする場合stdin、入力は1つのシングルとして入力する必要があるstringため、入力を'文字で囲む必要があります。例:

'Short text.'   %//   valid input
Short text.     %// INVALID input

Luis Mendo3バイトを削ってくれてありがとう;-)


@LuisMendo、保存された3バイトに感謝します:-)。適切な文字列を入力する方法を説明したので、単純な文字列でs=input('');も動作します。
ホキ

2

Scala 377文字

最初のカット。おそらく翻訳するより良い式得ることができますxへのy

(s:String)⇒s.zipWithIndex.map(t⇒(t._1,t._2,t._2%48 match{
case i if i<5⇒6-i
case 5|19⇒2
case 6|7|8|16|17|18⇒1
case i if i<16⇒0
case i if i<29⇒i%20+2
case 29|43⇒10
case 30|31|32|40|41|42⇒11
case i if i<40⇒12
case i if i>43⇒10-i%44
})).groupBy(_._3).toSeq.map{case(y,xs)⇒(""→0/:xs.sortBy(_._2)){case((p,l),(c,x,_))⇒(p+" "*(x-l-1)+c)→x}._1→y}.sortBy(_._2).map(_._1).mkString("\n")

1

Common Lisp、205バイト

(lambda(s &aux p v o)(dotimes(r 13)(setf o 0 p v v(round(*(/ 24 pi)(+(asin(-(/ r 6)1))pi))))(when p(map()(lambda(c)(princ(if(some(lambda(k)(<= p(mod k 48)(1- v)))`(,o,(- 23 o)))c" "))(incf o))s)(terpri))))

テスト

http://pastebin.com/raw.php?i=zZ520FTUを参照してください

備考

出力を行ごとに出力し、逆正弦関数を使用して出力する文字列のインデックスを計算しますasin。出力は質問で予想される入力と正確に一致しませんが、OPは出力例が実際の正弦波ではないことを認めているため、これは問題ないと思います。少なくとも、各列に書き込まれる文字は常に1つだけです。


1

Python 2、172バイト

これはAlex Lの答えほど良くはありませんが、かなり近いです。標準入力から入力を取得し、.pyファイルで最適に動作します。

l=map(int,bin(9960000)[2:]);l+=[-c for c in l];s=6;o=[];i=9
for c in raw_input():b=[' ']*13;b[s]=c;o+=[b];s+=l[i%48];i+=1
print''.join(sum(zip(*o+['\n'*13])[::-1],())[:-1])

pythonでは行列の転置がであるため、転置された出力(各列は行)を構築し、結果を転置することにしましたmap(*m)

  • l9960000"0b"fromを切り取った後)のバイナリ表現bin100101111111101001000000です。これは、各列の正弦波の「ステップ」であり、非常に低いポイントの最後の文字から始まります。このリストをコピーし、各番号を否定し、それを最後に付け加えて、関数の派生物を効果的に形成します。
  • s:これは、次の文字が挿入される行(転置の列)を追跡する変数です。
  • o:出力の終了、転置
  • i:正弦波の周期を追跡します。lわずかにシフトされるため、9から始まります。

forループ、私は13個のスペース(私がByteArrayとして定義が、文字のリストが短いprint文を持つことが判明を使用していた)のリストを作成し、その後、交換してくださいs入力された文字と番目の文字を。追加bの最後にo、適切なステップを追加sし、増分をi

私は、print声明がのように簡単であることを望んでいました\n'.join(*zip(o))が、そのような運はありませんでした。zip(*o+['\n'*13])[::-1]改行の列を追加し、全体を反転して転置し(反転せずに正弦波を逆さまにします)、sum(...,())タプルを1つの文字タプルに''.join(...)連結してから、文字を連結して印刷します。

私が試した他のことは、スペースの12文字の配列を作成し、新しい文字を適切な場所に挿入し、l+=[-c for c in l];何らかの数学に置き換えて、何らかの乗算1-1インデックス付けの結果でしたlが、何も思い浮かぶことはありませんでした短くなってしまいました。


0

Mathematica、131バイト

i=[input string];c=Characters@i;l=Length@c;StringJoin@Riffle[StringJoin@@@SparseArray[Table[{7-Round[6 Sin[.13(x-1)]],x},{x,l}]->c,{13,l}," "],"\n"]

の3文字を含む131文字ですi=foo;。これは、入力を取得する合理的な方法のように思えました。c数ストロークの定義にそのまま入れて保存することもできましたが、それは不公平に感じます。

それは非常に簡単です-ほとんど読みやすい。文字列を文字のリストに分割し、それらから決定された位置でそれらの文字をスパース配列に配置しますTable(配列内の文字の既定値はスペースになります)。線は別々に組み立てられ、次に改行がそれらの間に散らばります。最後のStringJoinがすべてを縫い合わせます。

注意:他のいくつかのソリューションと同様に、これは(美しい)手作りの例ではなく実際の正弦波を生成するため、実際には有効ではない場合があります。

テスト:

(*i=Programming Puzzles...*)
         ng Puzz                                          on and                                          iasts                                           tration          
       mi       le                                     sti       a                                      us      and                                     is        r        
     am           s                                   e           ns                                  th            c                                 eg           eq      
    r               &                               qu              we                              en               o                               r               u     
  og                  C                                               r                                               d                            o                  ir   
 r                     o                          a                                               e                    e                          n                     e  
P                       d                       s                       si                       l                       g                                               d 
                         e                     i                          t                    zz                         o                     ,                         .
                           G                                               e                  u                            lf                 ee                           
                            o               ge                               f               p                               e               r                             
                             lf           an                                  or           g                                  rs            f                              
                                St      ch                                       p      min                                     .        0%                                
                                  ack Ex                                          rogram                                          It's 10                                  
(*i=.... ...*)
         .......                                 
       ..       ..                               
     ..           ..                             
    .               .                            
  ..                 ..                          
 .                     .                         
.                       .                       .
                         ..                    . 
                           .                  .  
                            .               ..   
                             ..           ..     
                               ...      ..       
                                  ......         
(*i= Short text.*)
         t.
       ex  
      t    
    t      
  or       
 h         
S          





(*i=The quick...*)              
          brown                            
       ck       fo                         
     ui           x                        
    q               j                      
  e                  um                    
 h                     p                   
T                       s                  
                          o                
                           v               
                            e              
                             r            g
                               the      do 
                                   lazy    
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.