Code Golf:浪潮

Lir*_*una 41 language-agnostic code-golf rosetta-stone

挑战

按字符计数的最短代码,用于从输入字符串生成波形.

通过提升(第1行)较高字符并使(第1行)降低较低字符来生成波.相等的字符保持在同一行(没有提升或降级).

输入仅由小写字符和数字组成,字母被认为高于数字.

测试用例:

Input:
    1234567890qwertyuiopasdfghjklzxcvbnm

Output:
                                 z
                                l x v n
                               k   c b m
                              j
                             h
                            g
                   y   p s f
                  t u o a d
               w r   i
            9 q e
           8 0
          7
         6
        5
       4
      3
     2
    1

Input:
    31415926535897932384626433832795028841971693993751058209749445923078164062862

Output:
                9 9   8 6 6
         9 6   8 7 3 3 4 2 4  8   9   88
    3 4 5 2 5 5     2       33 3 7 5 2  4 9   9 99 7
     1 1     3                  2   0    1 7 6 3  3 5   8              8 6
                                            1        1 5 2 9      9 3 7 1 4 6 8
                                                      0   0 7 9  5 2 0     0 2 6
                                                             4 44               2
Run Code Online (Sandbox Code Playgroud)

代码计数包括输入/​​输出(即完整程序).

Jon*_*lle 77

x86机器码(37字节)

进制打印:

6800B807BF8007BE8200B40EAC3C0D741338D8740A720481EF400181C7A000AB86C3EBE8C3
Run Code Online (Sandbox Code Playgroud)

在带有50行控制台的MS-DOS中运行,输入来自命令行.

例如

wave.com 1234567890qwertyuiopasdfghjklzxcvbnm
Run Code Online (Sandbox Code Playgroud)

在这里下载二进制

更新:感谢jrandomhacker削减了三个字节

  • 是不是衡量二元作弊的长度?如果要测量装配源的长度,则会相当长一些. (41认同)
  • "并且一个编译/汇编的二进制字节与源字符不同." 2件事:(1)为什么,因为你这么说?(2)谁对消息来源说了什么?不是OP.(但顺便说一句,CPU是一个解释器,机器代码是它的源代码.) (9认同)
  • @P爸爸:我觉得这很公平; 我知道那些已经记住了足够的8086指令以便能够直接以十六进制读写汇编的人.OTOH只有DOS + COM才能实现; 我打赌在Linux/i386 + ELF中同样的东西必须至少300kB.也许我会给那个镜头...... (8认同)
  • @LiraNuna:这是真的,但那些人可能不属于这里.;) (7认同)
  • @Jonas Gulle:当别人碰到他们的作品时,有些人不喜欢它. (4认同)
  • 尼斯.您可以通过删除偏移量为0x1b的"JMP"指令,并将之前的"SUB al,0xa0"更改为"SUB al,0x140"以使其"吸收"下面的"ADD"来减少3个字节. (3认同)
  • 我使用"copy con wave.com"创建了这个条目,没有汇编源,因为那会是作弊,对吧?根据规则"按字符数排序的最短代码从输入字符串生成波形". (3认同)
  • @P Daddy:在数字小键盘上输入十进制的ASCII代码时按住Alt键以生成该字符.另外,我不认为你的"作弊"论证有用:字节是字符是一个字节. (3认同)
  • @P爸爸:公平地说,即使使用`copy/b con wave.com`,我也无法以这种方式生成0x0D - 始终生成以下0x0A.(然而,0x0A可以由它自己生成.)但我认为重点仍然是一个字节是一个字符 - 它没有说明该程序必须通过特定方式输入(例如在控制台输入).我考虑编译JVM/.NET /等.字节码也是可以接受的. (3认同)
  • 即使有人记住操作码,我也不认为每个汇编的字节都算作一个字符("最短的代码**字符**计数").为了将字节输入内存,您必须以十六进制输入它们,*可能*以空格分隔.至少使字符计数字节数的两到三倍.而且有人认为有人在机器代码中编写并测试了一个程序,通过内存 - 或者作为人工汇编程序从asm源到二进制代码,无论是从内存还是从书中.无论如何都是可疑的. (2认同)
  • @ephemient - 你的ELF估计值很高.如果真的削减了很多,你可以用超过50个字节的Linux Hello World程序.当然,这比Hello World更复杂,但不是299.9 kB. (2认同)

eph*_*ent 40

Ĵ

54个字符,如果让解释器处理输入/输出.

e=:|:@((#&' '@],[)"0[:(-<./)0,[:+/\[:(}:(>-<)}.)a.i.])
Run Code Online (Sandbox Code Playgroud)

65从stdin中明确读取并写入stdout.

(|:((#&' '@],[)"0[:(-<./)0,[:+/\[:(}:(>-<)}.)a.&i.)~1!:1[3)1!:2[4
Run Code Online (Sandbox Code Playgroud)
   e '1234567890qwertyuiopasdfghjklzxcvbnm'
                             z
                            l x v n
                           k   c b m
                          j
                         h
                        g
               y   p s f
              t u o a d
           w r   i
        9 q e
       8 0
      7
     6
    5
   4
  3
 2
1
   e '31415926535897932384626433832795028841971693993751058209749445923078164062862'
            9 9   8 6 6
     9 6   8 7 3 3 4 2 4  8   9   88
3 4 5 2 5 5     2       33 3 7 5 2  4 9   9 99 7
 1 1     3                  2   0    1 7 6 3  3 5   8              8 6
                                        1        1 5 2 9      9 3 7 1 4 6 8
                                                  0   0 7 9  5 2 0     0 2 6
                                                         4 44               2


   NB. Look up ASCII codes
   ord =: a. i. ]
   ord 'p4ssw0rd'
112 52 115 115 119 48 114 100

   NB. Going up?
   up =: }: < }.
   up ord 'p4ssw0rd'
0 1 0 1 0 1 0

   NB. Going down?
   down =: }: > }.
   down ord 'p4ssw0rd'
1 0 0 0 1 0 1

   NB. Combine to get ±1
   updown =: }: (> - <) }.
   updown ord 'p4ssw0rd'
1 _1 0 _1 1 _1 1

   NB. Start with 0, follow up with partial sums
   sum =: 0 , +/\
   sum updown ord 'p4ssw0rd'
0 1 0 0 _1 0 _1 0

   NB. Subtract the minimum to get sequence with base at 0
   fix =: - <./
   fix sum updown ord 'p4ssw0rd'
1 2 1 1 0 1 0 1

   NB. For convenience, name this chain of functions
   d =: [: fix [: sum [: updown ord
   NB. Make spaces before the characters
   push =: (#&' ' @ ] , [)"0 d
   push 'p4ssw0rd'
 p
  4
 s
 s
w
 0
r
 d

   NB. Turn it on its side
   |: push 'p4ssw0rd'
    w r
p ss 0 d
 4

   NB. Combine into one named function…
   e =: |: @ push
   NB. …and inline everything
   e =: |:@((#&' '@],[)"0[:(-<./)0,[:+/\[:(}:(>-<)}.)a.i.])

  • 看起来你只是在制作一堆笑脸.让我试试J::(:[[[:(:o:pO_O&i - :)$$.我做了一个程序吗? (29认同)
  • 我认为这就是所谓的**orgicon**(表情符号狂欢). (7认同)
  • 这甚至看起来都不像是一个语言,就像优胜美地山姆一样喊着虫子兔子. (6认同)
  • 我真的很想解释那个程序......我根本不认识J. 我甚至无法猜测它在做什么. (5认同)
  • @rmeador:J有点深奥,所以我通常会在有空的时候添加解释.现在就在那里.@Alex:不,`(:`不是一个合法的词. (4认同)

cod*_*nix 36

按字符排序的最短代码用于从输入字符串中打印"wave".

Console.WriteLine("来自输入字符串的'a'wave'.");

  • +1,因为我喜欢一个很好的聪明的评论. (64认同)
  • -1这个答案不符合问题的精神. (9认同)
  • 绝对不是最短的. (3认同)
  • 很好的答案.打破了代码高尔夫的严肃性. (2认同)
  • Console.Write("输入字符串中的'wave'."); ;) (2认同)

Bar*_*aba 14

Perl(94个字符)

由barnaba创作的144个字符:

chop($_=<>);$l=length;push(@a," "x$l)for(1..$l*2);$l+=(ord $p<=>ord $_),substr($a[$l],$r++,1)=$p=$_ for(split //);/^\s+$/||print "$_\n" for(@a)

Chris Lutz优化的121个字符:

$_=<>;chop;$a[@a]=" "x$l for 1..($l=length)*2;$l+=$p cmp$_,substr($a[$l],$r++,1)=$p=$_ for split//;/\S/&&print"$_\n"for@a

进一步优化的94个字符:

$_=<>;@a=($"x($l=y///c).$/)x(2*$l);s/./substr$a[$l+=$"cmp$&],"@-",1,$"=$&/ge;/\S/&&print for@a

请注意,在传统的Perl高尔夫中,人们通常会增加开关的数量和代码的长度(这将有助于几笔),但在这里我们使用的是没有开关的独立程序.


P D*_*ddy 12

VT100终端上的C(76个字符)

这适用于我对FreeSBIE的测试:

o;main(c){for(;(c=getchar())-10;o=c)printf("\33[1%c%c",c<o?66:c>o?65:71,c);}
Run Code Online (Sandbox Code Playgroud)

但是为了清楚地看到输出,你必须用这样的东西运行它:

clear ; printf "\n\n\n\n\n" ; echo the quick brown fox jumps over the lazy dog | ./a.out ; printf "\n\n\n\n\n"

这算数了吗?


ACo*_*lie 11

Python(161个字符)

v,s="",raw_input()
m=n=len(s)
r=[' ']*n
q=[r[:]for i in range(2*n)]
for j,i in enumerate(s):
 m+=(i<v)-(i>v)
 q[m][j],v=i,i
for i in q:
 if i!=r:print''.join(i)
Run Code Online (Sandbox Code Playgroud)

尽管如此,我还没有做太多的压缩.现在将它移植到宇宙飞船运营商的东西.


Dig*_*oss 10

Ruby:99个字节

r,a,q,i=[],"",99,0
gets.chars{|x|t=r[q+=a<=>x]||=""
a=x
r[q]+=" "*(i-t.size)+x
i+=1}
puts r.compact
Run Code Online (Sandbox Code Playgroud)

未压缩:

r,a,q,i = [],"",99,0
gets.chars { |x|
  t = r[q+=a<=>x] ||= ""
  a = x
  r[q] += " "*(i-t.size)+x
  i += 1
}
puts r.compact
Run Code Online (Sandbox Code Playgroud)


sea*_*lea 7

PHP(138个字符)

<?for($lc=$i=$h=0;"\n"!=$c=fgetc(STDIN);$o[$h]=sprintf("%- {$i}s%s",@$o[$h],$lc=$c),$i++)$h+=$c<$lc?-1:$c>$lc;krsort($o);echo join($c,$o);
Run Code Online (Sandbox Code Playgroud)

'可读'版本:

<?
for (
    $last_ch = $i = $level = 0;
    "\n" != $ch = fgetc(STDIN);
    $out[$level] = sprintf("%- {$i}s%s", @$out[$level], $last_ch = $ch), $i++
    )
    $level += $ch < $last_ch ? -1 : $ch > $last_ch;
krsort($out);
echo join($ch,$out);
Run Code Online (Sandbox Code Playgroud)

  • 我想你只能省略<?= ...?>短标签中的分号; 但是,如果你这样做,你不能省略关闭?>无论如何.但是,我可以通过使用$ l而不是$ lc来削减另外4个字符..使解决方案成为134个字符. (2认同)

Ano*_*non 6

Python 2.x,现在低至156个字符:

s=raw_input()
R=range(len(s))
m=[0]
for i in R[1:]:m+=[m[-1]-cmp(s[i],s[i-1])]
for x in range(min(m),max(m)+1):print''.join(m[i]==x and s[i]or' 'for i in R)
Run Code Online (Sandbox Code Playgroud)


str*_*ger 5

C89(151个字符)

l[999][999];p;v=500;r;main(c){for(;(c=getchar())>0;
)l[v+=c>p,v-=c<p][++r]=*l[v]=p=c;for(v=999;v--;)for
(c=0;c++<=r;)*l[v]&&putchar(c<=r?32|l[v][c]:10);}
Run Code Online (Sandbox Code Playgroud)


小智 5

Haskell,215个字符.我发布这个是因为我根本不喜欢Khoth的版本.只是通过写一个合理的功能风格,我最终得到了一个明显更短和IMO更可读的程序.我实际上并没有尝试将变量名称和间距缩小.破坏性地更新数组可能会比复制空格更短.

import Char    
import List    
main=getLine>>=(putStr.p)    
p s=unlines$transpose[z++(y:x)|(m,y)<-zip n s,let(x,z)=splitAt m$replicate(maximum n)' ']
    where o=map ord s
    n=scanl(+)0$map signum$zipWith(-)(tail o)o
Run Code Online (Sandbox Code Playgroud)