正弦文字


30

目标:编写一个程序或函数,以正弦形状打印输入字符串。

ASCII正弦波

这是正弦曲线的一个周期:

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

请注意,每一列上只有一个点。

  • 输入字符串中的每个字符将从左到右替换上面形状中的一个点。
  • 输入中的空格必须像普通字符一样输出,代替点。
  • 起始字符对应于上图中最左边的点。
  • 这只是一个周期,输入的长度可能大于上面的点数。

输入值

  • 输入是ASCII字符串,仅包含ASCII十进制32(空格)和ASCII十进制126(波浪号〜)之间的字符。
  • 输入将始终仅是一行(没有换行符)。
  • 可以通过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    

计分

这是,因此以字节为单位的最短程序或函数获胜。


就是我想的
β衰变

哦,我知道确实有些相似。
致命

顺便说一句,您的波不是正弦波。(自然地,我尝试使用一个sin函数来重现它,但是位置有些偏离。)
David Z

@DavidZ这不足为奇,我盯着ASCII形状。在列中没有任何“间隙”的情况下,您甚至可以获得正弦曲线的东西(即每列正好一个点)吗?
致命

4
我花了几分钟,通过来回快速移动测试案例2的输出上的滚动条来娱乐自己。
mbomb007

Answers:


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,形成所有前缀并将其映射到其总和,就生成了波的第一四分之一。

sM._+6jC\཈2计算结果[6, 7, 8, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12]如上所述。然后,代码在此字符串的反面串联起来以形成wave的前半部分,然后从12中减去它以给出整个wave。

然后,我们形成每个输入字符的行,后跟12个空格。通过对应于该位置的波高参数将这条线向右旋转,然后将这些线换位并在换行上合并。

然后,我们删除前导和尾随的空白行。但是,我们不能去除输入中有空格的前导或尾随空白行。这是通过用制表符(C9)替换输入中的空格(不能在输入中),去除空白行并将制表符变回空格来实现的。


@FryAmTheEggman已修复,费用为16个字节。
isaacg 2015年

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]

  • 字节数组o用作可变字符串,因为字符串在python中是不可变的。

  • -~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[]。在这里,这将摆脱()length淘汰charAt()为好。如果我没看错,也可以使用print()而不是println()节省更多资源。
Geobits,2015年

@Geobits这些是我所不了解的自由度。任务描述谈论的是“字符串”,因此我认为它必须是相应语言的“ THE”字符串表示形式。...
Marco13年

是的,我前段时间在meta上问过这个问题。这是参考链接:meta.codegolf.stackexchange.com/q/2214/14215
Geobits,2015年

谢谢,那是209。(也许以后我会尝试挤出更多的字节。“ sin”函数看起来仍然太冗长了...)
Marco13

1
嗯,这不是一个很大的改进,但是您可以通过将整体模数设为48来减少10。将端更改为...a<24?s(24-a):-s(a-24);并用调用s(c%48)
Geobits,2015年

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

需要-Esay,卖场作为整数转换为二进制数和阵列的翻转可能不是非常有效字节明智的位置。另外,我敢肯定会有很多积蓄,所以我会继续戳戳和催动。

输出示例:

$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位置(偏移量为a,即ASCII码97)。然后,它遍历所有可能的行;如果当前行的y值与wave上的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个字符。也不用再加上两个字符。

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。可能也可以将for循环组合起来以节省更多...最后一件事,值得注意的是,我当前的字节数只有220,所以您的225可能是windows,\r\n而不是\n我认为您可以忽略的窗口(如果我错了,请纠正我)...
Dom Hastings 2015年

回车的好习惯!下次我将不太信任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]:" "
Vartan

使用伪零代替==减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]
Vartan

我无法从我的评论中粘贴它,所以这里是一个pastebin 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

一个衬板从控制台(stdin)接收输入,为130字节。扩展版本将控制台输入替换为函数定义(+1字节),但更适合在循环中用于测试用例:


描述:

每个字符的行索引计算一个半周期,然后进行镜像和连接以具有一个完整的周期。
我们创建一个空白背景的空白字符(与输入字符串长度相同。我们根据每个字符在相关行中的位置放置它们。如果输入字符串长于一个句点,则mod(模)运算符会将其换行,因此我们不请求行号时不要越界。


测试用例:

将函数版本保存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    

如果你想测试一个衬垫版本与输入stdin,你输入必须输入作为一个单一的string,所以你必须附上您之间的输入'字符。例:

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

感谢Luis Mendo您剃掉3个字节;-)


@LuisMendo,感谢您保存了3个字节:-)。我解释了如何输入适当的字符串,以便简单的字符串s=input('');仍然有效。
Hoki,2015年

2

Scala 377个字符

首先切。可能可以获得更好的公式来转换xy

(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

普通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

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)

  • l:(从中9960000切掉后)的二进制表示为。这是每列正弦波的“步骤”,从最低点的最后一个字符开始。我复制此列表,取反每个数字,然后将其附加到其末尾,以形成实际上是该函数派生的内容。"0b"bin100101111111101001000000
  • s:这是一个变量,用于跟踪下一个字符插入到哪一行(转置中的列)。
  • o:最终输出,转置
  • i:跟踪正弦波周期。从9开始,因为l略有移动。

for循环中,我创建了一个由13个空格组成的列表(我正在使用字节数组,但字符列表原来具有较短的print语句),然后用s输入字符替换th个字符。追加b到结尾o,在上添加适当的步骤s,然后递增i

我曾希望print声明能够像一样简单\n'.join(*zip(o)),但没有这种运气。zip(*o+['\n'*13])[::-1]附加一列换行符,然后反转并转置整个内容(不反转,正弦波为上下颠倒),sum(...,())将元组连接在一起成为一个字符元组,然后''.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"]

那是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    
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.