波粒二象性横向编程


30

编写一个包含非空单行字符串的程序或函数。该字符串将是零个或多个空格,后跟一个句点(一个粒子),例如.         .或者该字符串将是一个或多个交替的正斜杠和反斜杠(波形)的序列,该斜杠可以以任意一个开始,例如作为\/\/\/\/\/\/\/\/

无论哪种情况,都将粒子/波向右传播一个单位。

具体来说,在粒子情况下,在之前插入一个空格.,将其向右移动一个位置,然后输出结果字符串。例如:

.→交通 .
 .→交通  .
  .→交通   .
   .→交通    .
    .→交通     .
     .→交通      .
      .→交通       .
       .→交通        .

在wave情况下,附加一个/\适当的附加值,以使wave保持交替,并且其长度增加一,然后输出结果字符串。例如:

/→交通/\
\→交通\/
/\→交通/\/
\/→交通\/\
/\/→交通/\/\
\/\→交通\/\/
/\/\→交通/\/\/
\/\/→交通\/\/\

无论哪种情况,输出都可能没有尾随空格,但允许使用可选的尾随换行符。

以字节为单位的最短代码获胜。


评论不作进一步讨论;此对话已转移至聊天
丹尼斯,

Answers:


16

C,69字节

p;f(char*s){p=s[strlen(s)-1]^46;p^=p?93:3022856;printf("%s%s",s,&p);}

这需要一个低位字节序的机器,并输出到支持ASCII转义码的终端。

p=s[strlen(s)-1]^46 获取输入字符串的最后一个ASCII码,并将其与点的ASCII码进行XOR。

p^=p?93:3022856将导致pp^93如果ASCII代码不是(背面)斜线,其中p^46^93 == p^115,这将向后和向前的斜线之间切换。如果p是点,则改为3022856,是的小端"\b ."

printf("%s%s",s,&p);打印输入字符串,后跟整数p,解释为小尾数字节字符串。


1
这是纯粹的天才。
Leaky Nun

您可以通过更换保存一个字节3022856'. \b',多字节字符文字。很棒的答案!
昆汀

谁能提出一个不使用任何stdlib东西的版本?:)
TylerY86 '16

12

果冻17 14 字节

ṪO*2.ị“ .\/\”ṭ

在线尝试!验证所有测试用例

怎么运行的

ṪO*2.ị“ .\/\”ṭ  Main link. Argument: s (string)

Ṫ               Tail; pop and yield the last character.
 O              Ordinal; map “./\” to [46, 47, 92].
  *2.           Elevate the code point to the power 2.5.
                This maps [46, 47, 92] to [14351.41, 15144.14, 81183.84].
     ị“ .\/\”   Index into that string.
                Jelly's indexing is modular, so this takes the indices modulo 5,
                which gives [1.41, 4.14, 3.84].
                Also, for a non-integer index, ị retrieves the elements at both
                adjacent integer indices (1-based). Here, these are [1, 2], [4, 5],
                and [3, 4], so we get " .", "/\", or "\/".
             ṭ  Tack; append the characters to the popped input string.

7

CJam,16个字节

l)_'.={S\}"\/"?|

在线尝试!验证所有测试用例

怎么运行的

l                 Read a line from STDIN.
 )_               Shift out the last character and copy it.
   '.=            Compare the copy with a dot.
              ?   If the last character is a dot:
      {S\}            Push " " and swap the dot on top.
          "\/"    Else, push "\/".
               |  Perform set union, ordering by first occurrence.
                    " " '.  | -> " ."
                    '/ "\/" | -> "/\"
                    '\ "\/" | -> "\/"

1
自我注意:学习集合联合的工作原理。与我的相比,这似乎是保存了大多数字节的地方。
Zwei

6

Python,41个字节

lambda s:[s+'\/'[s[-1]>'/'],' '+s][s<'/']

个案工作。使用排序的顺序' ', '.', '/', '\'。对于空格和周期,请加一个空格。否则,在最后一个字符的后面加上斜杠或黑斜杠。


5

Python,第44的42个字节

lambda s:s[:-1]+"\/ /\."[-ord(s[-1])&3::3]

用两个字符的对应集合替换最后一个字符。ideone链接

(由于@xsot较短的映射功能,因此为-2个字节)


-ord(s[-1])&3还给出了3个不同的索引。
xsot

@xsot哦,太好了,我没想到&
Sp3000

这次没有模因吗?:'(
ThreeFx

5

游戏制作者语言,107字节

s=argument0;if string_pos(" ",s)return " "+s;if string_pos(s,string_length(s))="/"s+="\"else s+="/"return s

5

Vim,27 23击键

有史以来第一个vim答案,甚至根本没有使用过vim。

A/<esc>:s#//#/\\<cr>:s#\./# .<cr>

工作原理:它追加/在一行的末尾,潜艇///\,潜艇./ .


/如果使用其他分隔符,则可以避免对s进行转义s#//#/\\
m-chrzan '16

谢谢,我不知道有那样的东西
破坏的柠檬

4

MATL,19字节

t47<?0w}'\/'yO)o)]h

在线尝试!验证所有测试用例

说明

t        % Input string implicitly. Duplicate
47<      % Are entries less than 47 (i.e dot or spaces)?
?        % If all are
  0      %   Push a 0. When converted to char it will be treated as a space
  w      %   Swap, so that when concatenated the space will be at the beginning
}        % Else
  '\/'   %   Push this string
  y      %   Duplicate the input string onto the top of the stack
  O)     %   Get its last element
  o      %   Convert to number    
  )      %   Use as (modular) index to extract the appropripate entry from '\/'
]        % End
h        % Concatenate string with either leading 0 (converted to char) or
         % trailing '\'  or '/'. Implicitly display

3

CJam,35 26 25字节

感谢dennis,节省了9个字节

还要多保存1个字节,这也要归功于dennis

q:I'.&SI+IW='/=I'\+I'/+??

在线尝试!

大概打的不好,但是我对CJam不太熟悉。检查元素是否在数组中可能是更好的方法,但是我找不到用于该元素的任何运算符。

说明:

q:I e# take input
'.& e# push union of input and ".", effectively checking if input contains it
SI+ e# push string with space in beginning
IW='/= e# push 1 if the last chsaracter in the input is /
I'\+ e# push the input with a \ appended
I'/+ e# push the input with a / appended
? e# ternary if to select correct /
? e# ternary if to select final result

1
W最初-1?与块等物品堆都工作,所以您可以将代码减少q:I'.#)SI+IW='/=I'\+I'/+??
丹尼斯

1
要测试字符是否属于字符串,可以将它们相交&
丹尼斯

我对CJam哈哈真是不好意思
Zwei

3

05AB1E,17 15字节

D'.åiðì뤄\/s-J

说明

D'.åi              # if input contains dot
     ðì            # prepend a space
       ë           # else
        ¤„\/s-     # subtract last char of input from "\/"
              J    # join remainder to input
                   # implicitly print

在线尝试


2

C,85个字节

j;f(char*n){j=strlen(n)-1;printf("%s%s",n[j]<47?" ":n,n[j]==46?n:n[j]==47?"\\":"/");}

伊迪奥

我已经有20个小时没有睡觉了,我的代码可能可以打很多。



2

Matlab,74 71 62 57字节

@(s)[s(1:end-1) ' .'+(s(1)>46)*'/.'+(s(end)>47)*[45 -45]]

它基于s(1)(第一个字符)计算最后两个字符-确定是否要处理\/大小写,最后一个字符s(end)为字符创建正确的元组\/



2

> <>,47个字节

i:0(?\
*=?$r\~:1[:"./ \/"{=?@r=?$r~~]:48
l?!;o>

在线尝试!

第一行是标准的> <>输入循环。第二行/ \根据最后一个输入字符,从中选择适当的字符追加到字符串。此外,如果最后一个输入字符是a .,则切换前两个元素。最后,将堆叠内容反向打印。


2

JavaScript,79 70 65 58字节

(a,b="/\\/",i=b.indexOf(a[a.length-1]))=>i<0?" "+a:a+b[i+1]

1
替换b.charAt(i+1)b[i+1]以保存一些字节。同样,这不适用于所有测试用例。\/例如,给出`/ \。
user2428118 '16

@ user2428118谢谢,已修复错误并缩短了代码!
kamoroso94 '16

1
init bi作为具有默认值的参数:(a,b=...,i=...)=>避免return
查理(Charlie)

嗯,是的,我忘记了这个新功能。也因此能够将其删除{ }
kamoroso94 '16

实际上,通过其他一些步骤,您将收敛于@ TylerY86的答案
charlie


2

Haskell,46 45 44字节

f z@(x:_)|x<'/'=' ':z|x<'0'='\\':z|1<2='/':z

利用这样的事实,即< .< /< 0< \在ASCII表保存两个字节


1

Python 2,72个字节

lambda x:x[:-1]+(" .","\/","/\\")[ord(x[-1])/46+(-1,1)[ord(x[-1])%46>0]]

任何打高尔夫球的帮助将不胜感激!

这将输入中的最后一个字符转换为其ASCII代码,以在两个字符的列表中获取相应的索引。直到最后一个字符为止,这两个字符都会附加到输入的所有字符上。


1

SQF,91

使用文件功能格式:

s=_this;switch(s select[(count s)-1])do{case".":{" "+s};case"\":{s+"/"};case"/":{s+"\"};}

称为 "STRING" call NAME_OF_COMPILED_FUNCTION


1

Perl,30 +1(-p)= 31个字节

s/\./ ./,s|/$|/\\|||s|\\$|\\/|

需要-p-M5.010-E运行:

perl -pE 's/\./ ./,s|/$|/\\|||s|\\$|\\/|' <<< ".
  .
    .
/
/\/" 

直截了当执行挑战。(请注意,||最后两个正则表达式之间的or,可能很难阅读,因此,三个正则表达式分别是s/\./ ./,和s|/$|/\\|,和s|\\$|\\/|



1

PowerShell v2 +,59 58 52 51字节

param($n)(" $n","$n/","$n\")['.\/'.IndexOf($n[-1])]

接受输入$n,将其转储为数组索引操作。我们选择基于索引数组的元素['.\/'.IndexOf($n[-1])-即根据所输入的最后一个字符$n,这将导致012。这对应于数组的适当字符串。无论如何,结果字符串都留在管道上,并且打印是隐式的。

测试用例

PS C:\Tools\Scripts\golfing> 0..7|%{' '*$_+'.'}|%{"$_ => "+(.\wave-particle-duality.ps1 "$_")}
. =>  .
 . =>   .
  . =>    .
   . =>     .
    . =>      .
     . =>       .
      . =>        .
       . =>         .

PS C:\Tools\Scripts\golfing> '/,\,/\,\/,/\/,\/\,/\/\,\/\/'-split','|%{"$_ => "+(.\wave-particle-duality.ps1 "$_")}
/ => /\
\ => \/
/\ => /\/
\/ => \/\
/\/ => /\/\
\/\ => \/\/
/\/\ => /\/\/
\/\/ => \/\/\


1

Linux上的ARM机器代码,50字节

十六进制转储:

b580 1e41 f811 2f01 2a00 d1fb 3901 780b 1a0a 4601 2001 2704 df00 2000 a103 2202 f013 0303 2b03 4159 df00 bd80 2e202f5c 5c2f

在这里的第一篇文章,希望我做对了。这是32位ARM程序集,特别是Thumb-2。输入字符串是通过r0传入的NUL终止字符串,输出将输出到stdout。在C语法中,该函数的原型为void func_name(char * string)。这是AAPCS(ARM调用约定)投诉,如果不是,则可以减少2个字节。

这是等效的程序集,其中的注释说明了发生的情况:

    @Input: r0 is char* (the string)
    @Output: Modified string to console
    push {r7,lr} @Save r7 and the link register
    subs r1,r0,#1 @Make a copy of the char*, subtracting because we're
    @going to pre-increment.
    loop: @This loop is a little strlen routine
            ldrb r2,[r1,#1]! @In C-syntax, r2=*++r1;
            cmp r2,#0
            bne loop
    @Now r1 points to the null character that terminates the string
    subs r1,r1,#1 @Make r1 point to the last character
    ldrb r3,[r1] @Load the last character into r3
    subs r2,r1,r0 @r2=length(r0) - 1;
    mov  r1,r0 @r0 holds the original char*
    movs r0,#1 @1 is the file descriptor for stdout
    movs r7,#4 @4 is write
    swi #0

    @Now all the characters from the initial string have been printed,
    @except for the last one, which is currently in r3.

    movs r0,#1 @1 is stdout, have to reload this since the system call
    @returns in r0.
    adr r1,msg @Load msg into r1 (the pointer to the string)
    movs r2,#2 @We're going to print two more characters.

    @Now the bit magic. The ascii codes for '\', '.', and '/' map onto
    @0, 2, and 3 when bitwise anded with 3 (0b11).
    @This will be the offset into our string. However, since we must print
    @2 characters, we need our offsets to be 0, 2, and 4.
    @Therefore, we only set the carry if our value is >=3, then add with
    @carry (adcs). Thus we get the correct offset into the string msg.
    ands r3,r3,#3
    cmp r3,#3 @Sets carry if r3>=3
    adcs r1,r1,r3 @Add the offset to r1
    swi #0 @Make the system call
    pop {r7,pc} @Return and restore r7
msg:
    .ascii "\\/ ./\\" @The three different sequences of 2 characters that
    @can go at the end.

1

ECMAScript 6/2015(JavaScript),41个字节

s=>s<'/'?' '+s:s+'\\/'[s.slice(-1)>'/'|0]

好抓住尼尔。


您的输出似乎不正确。对于斜杠,您的代码应附加下一个斜杠,而不是在其前面。
丹尼斯

调整后的答案。
TylerY86 '16

为什么不+(s+1)呢?
尼尔

更好的是s<'/'
尼尔

1

R,119字节

a=scan(,"");if((q=strsplit(a,"")[[1]][nchar(a)])=="."){cat(" ",a,sep="")}else{s=switch(q,"/"="\\","/");cat(a,s,sep="")}

松散

a=scan(,"")
if((q=strsplit(a,"")[[1]][nchar(a)])==".")
    cat(" ",a,sep="")

else
s=switch(q,"/"="\\","/")
cat(a,s,sep="")

1

SED,41 36 27

保存7感谢charlie

 s|\.| .|;s|/$|/\\|;t;s|$|/|

使用3所取代:
s/\./ ./增加了一个空间,如果有一个.
s|/$|/\\|s|$|/|添加适当的斜线到端
用途|,而不是/作为分隔符

t 如果第二个正则表达式匹配,则分支到末尾,因此不会添加其他斜杠


我只是得出了几乎相同的解决方案:s/\./ ./;s./$./\\.;t;s.$./.-它是27个字节。第三次替换得到简化,在我的系统上-re不需要。另外,我使用.而不是#视觉上停留在输入空间中。; o)
查理

1

Turtlèd,32字节(非竞争)

l!-[*+.r_]l(/r'\r)(\r'/)(." .")$

说明:

[implicit]                       first cell is an asterisk

l                                move left, off the asterisk, so the '[*+.r_]' loop runs
 !                               take input into string var, char pointer=0, 1st char
  -                              decrement char pointer, mod length input             

   [*    ]                       while current cell isn't *:
     +.                          increment string pointer, and write the pointed char
       r_                        move right, write * if pointed char is last char, else " "

          l                      move left

           (/    )               if the current cell is /
             r'\r                move right, write /, move right

                  (\   )         If the current cell is \
                    r'/          move right, write /

                        (.    )  If the current cell is .
                          " ."   Write " .", the first space overwriting the existing '.'

                               $ Program won't remove leading spaces when printing

    [implicit]                   Program prints grid after finishing execution

1

Java 7,76字节

String c(String i){return i.contains(".")?" "+i:i+(i.endsWith("/")?92:'/');}

非常简单。

取消测试的代码:

在这里尝试。

class M{
  static String c(String i){
    return i.contains(".")
            ? " " + i
            : i + (i.endsWith("/")
                    ? 92
                    : '/');
  }

  public static void main(String[] a){
    System.out.println(c(" ."));
    System.out.println(c("  ."));
    System.out.println(c("   ."));
    System.out.println(c("    ."));
    System.out.println(c("     ."));
    System.out.println(c("      ."));
    System.out.println(c("       ."));
    System.out.println(c("        ."));
    System.out.println(c("/"));
    System.out.println(c("\\"));
    System.out.println(c("/\\"));
    System.out.println(c("\\/"));
    System.out.println(c("/\\/"));
    System.out.println(c("\\/\\"));
    System.out.println(c("/\\/\\"));
    System.out.println(c("\\/\\/"));
  }
}

输出:

  .
   .
    .
     .
      .
       .
        .
         .
/\
\/
/\/
\/\
/\/\
\/\/
/\/\/
\/\/\
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.