横方向プログラムによる波動粒子双対性


30

空でない単一行の文字列を取り込むプログラムまたは関数を作成します。文字列は、ゼロまたはそれ以上のスペースが一の周期(続くであろう粒子のような).又は         .あるいは文字列が前方に交互に一つ以上のシーケンスとバックスラッシュ(あろういずれかで開始することができる)、そのような\または/\/または\/\/\/\/\/\/

どちらの場合でも、粒子/波を1単位だけ右に伝播します。

具体的には、パーティクルの場合、の前にスペースを挿入し、.1つ右に移動して、結果の文字列を出力します。例えば:

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

ウェーブの場合、ウェーブが交互になり、長さが1ずつ増加するように、いずれか/または\適切に追加して、結果のストリングを出力します。例えば:

//\
\\/
/\/\/
\/\/\
/\//\/\
\/\\/\/
/\/\/\/\/
\/\/\/\/\

どちらの場合でも、出力には末尾のスペースは含まれませんが、オプションの末尾の改行が許可されます。

バイト単位の最短コードが優先されます。


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
デニス

回答:


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:3022856ASCIIコードが(バック)スラッシュでない場合に発生pしますp^93。ここでp^46^93 == p^115、バックスラッシュとフォワードスラッシュを切り替えます。pがドットの場合、代わりにになります3022856。これはのリトルエンディアンです"\b ."

printf("%s%s",s,&p);入力文字列に続いてintegerを出力し、pリトルエンディアンのバイト文字列として解釈されます。


1
これは純粋な天才です。
リーキー修道女

マルチバイト文字リテラルで置き換えること3022856により'. \b'、1バイトを節約できます。素晴らしい答え!
クエンティン

誰もstdlibのものを使用しないこのバージョンを思い付くことができますか?:)
TylerY86

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
自己への注意:set unionの仕組みを学びます。これは、私のものと比較した場合、ほとんどのバイトが保存された場所のようです。
ツヴァイ

6

Python、41バイト

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

ケースワーク。ソートされた順序を使用し' ', '.', '/', '\'ます。スペースとピリオドの場合、スペースを追加します。それ以外の場合、最後の文字の反対側にスラッシュまたは黒スラッシュを追加します。


5

パイソン、44の 42バイト

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

最後の文字を対応する2文字のセットに置き換えます。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>

仕組み:/行末にa を、subs //for /\、subs ./forを追加します .


あなたはエスケープ回避することができ/ます。たとえば、別の区切り文字を使用する場合は秒s#//#/\\
m-chrzan

おかげで、私のような何のアイデア何が存在していなかった
破壊可能なレモン

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バイト

デニスのおかげで9バイト節約

デニスのおかげで、もう1バイト節約できました

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'/+??
Dennis

1
文字が文字列に属しているかどうかをテストするために、文字と文字列を交差させることができます&
デニス

私はCJamでとても悪いです笑
ツヴァイ

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)(最初の文字)に基づいて最後の2文字を計算します- \/ケースを処理しているかどうかを判断し、最後の文字s(end)を使用して\/文字の正しいタプルを作成します。



2

> <>、47バイト

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

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

最初の行は、標準の<>入力ループです。2行目/ \は、最後の入力文字に基づいて、文字列に追加する適切な文字を選択します。さらに、最後の入力文字がであった.場合、上位2つの要素が切り替えられます。最後に、スタックの内容が逆に印刷されます。


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

@ user2428118ありがとう、バグ修正とコード短縮!
kamoroso94

1
init bおよびiデフォルト値を持つパラメーターとして:(a,b=...,i=...)=>避けるためにreturn
チャーリー

ああ、私はその新機能を忘れていました。また{ }、このために同様に削除することができました。
kamoroso94

実際、さらにいくつかの手順を実行すると、@ TylerY86の答えに集中します。
チャーリー


2

ハスケル、46の 45 44バイト

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

事実を利用する< .< /< 0< \ASCIIテーブルでは、2つのバイトを保存します


1

Python 2、72バイト

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

もっとゴルフをするのを助けていただければ幸いです!

これは、入力の最後の文字を取得してASCIIコードに変換し、2文字のリスト内の対応するインデックスを取得します。これらの2つの文字は、最後の文字まで入力のすべての文字に追加されます。


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|\\$|\\/|' <<< ".
  .
    .
/
/\/" 

チャレンジの簡単な実装。(||最後の2つの正規表現の間はor、読みにくいかもしれませんので、3つの正規表現は、、、、s/\./ ./およびs|/$|/\\|であることに注意してくださいs|\\$|\\/|



1

PowerShell v2 +、59 58 52 51バイト

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

入力を受け取り$n、配列インデックス操作にダンプします。私たちは、インデックスに基づいて、配列の要素を選択する['.\/'.IndexOf($n[-1])、すなわち、入力の最後の文字に基づいて- $n、これはになります01または2。これは、配列の適切な文字列に対応します。いずれの場合でも、結果の文字列はパイプラインに残り、印刷は暗黙的に行われます。

テストケース

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終了文字列であり、出力は標準出力に出力されます。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

どうして+(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

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

3個の置換を使用します
s/\./ ./があればスペースを追加し.
s|/$|/\\|s|$|/|端部に適切なスラッシュ追加
用途を|代わりに/区切り文字として

t 2番目の正規表現が一致する場合は最後に分岐するため、他のスラッシュは追加されません


ほぼ同じ解決策にs/\./ ./;s./$./\\.;t;s.$./.たどり着きました。-27バイトです。3番目の置換は単純化されており、私のシステムで-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("\\/\\/"));
  }
}

出力:

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