Gelombang-Partikel Dualitas Secara lateral Programatis

30

Tulis program atau fungsi yang menggunakan string baris tunggal kosong. String dapat berupa nol atau lebih banyak spasi diikuti oleh satu periode ( partikel ), seperti .atau          ., atau string akan menjadi urutan satu atau lebih garis miring ke depan dan belakang ( gelombang ) yang bisa dimulai dengan salah satu, seperti sebagai \atau /\/atau \/\/\/\/\/\/.

Dalam kedua kasus, perbanyak partikel / gelombang ke kanan dengan satu unit.

Secara khusus, dalam kasus partikel, masukkan spasi sebelum ., memindahkannya satu tempat ke kanan, lalu output string yang dihasilkan. Sebagai contoh:

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

Dalam kasus gelombang, tambahkan salah satu /atau secara \tepat sehingga gelombang terus bergantian dan panjangnya bertambah satu, lalu output string yang dihasilkan. Sebagai contoh:

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

Dalam kedua kasus, output mungkin tidak memiliki spasi tambahan tetapi baris tambahan opsional diizinkan.

Kode terpendek dalam byte menang.

Hobi Calvin
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Dennis

Jawaban:

16

C, 69 byte

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

Ini membutuhkan mesin little-endian, dan keluaran ke terminal yang mendukung kode pelarian ASCII.

p=s[strlen(s)-1]^46 ambil kode ASCII terakhir dari string input, dan XOR dengan kode ASCII titik.

p^=p?93:3022856akan menyebabkan pmenjadi p^93jika kode ASCII bukan (kembali) slash, di mana p^46^93 == p^115, yang akan beralih antara belakang dan garis miring. Jika psebuah titik, itu akan menjadi 3022856, yang merupakan little-endian untuk "\b .".

printf("%s%s",s,&p);mencetak string input diikuti oleh integer p, ditafsirkan sebagai string byte kecil-endian.

orlp
sumber
1
Ini jenius murni.
Leaky Nun
Anda dapat menyimpan satu byte dengan mengganti 3022856dengan '. \b', literal karakter multibyte. Jawaban yang luar biasa!
Quentin
Adakah yang bisa membuat versi ini yang tidak menggunakan barang stdlib? :)
TylerY86
12

Jelly , 17 14 byte

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

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

Ṫ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.
Dennis
sumber
7

CJam, 16 byte

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

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

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.
                    " " '.  | -> " ."
                    '/ "\/" | -> "/\"
                    '\ "\/" | -> "\/"
Dennis
sumber
1
Catatan untuk diri sendiri: pelajari cara kerja set union. Ini tampaknya menjadi tempat sebagian besar byte disimpan ketika dibandingkan dengan saya.
Zwei
6

Python, 41 byte

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

Kasus kerja. Menggunakan urutan yang diurutkan ' ', '.', '/', '\'. Untuk spasi dan titik, tambahkan spasi. Jika tidak, tambahkan garis miring atau garis hitam berlawanan dengan karakter terakhir.

Tidak
sumber
5

Python, 44 42 bytes

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

Mengganti karakter terakhir dengan set karakter yang sesuai. tautan ideone

(-2 byte berkat fungsi pemetaan yang lebih pendek dari @ xsot)

Sp3000
sumber
-ord(s[-1])&3juga memberikan 3 indeks berbeda.
xsot
@ xsot Oh bagus, saya tidak memikirkan &!
Sp3000
Tidak meme kali ini? : '(
ThreeFx
5

Bahasa Game Maker, 107 byte

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

Vim, 27 23 penekanan tombol

Jawaban vim pertama, belum pernah menggunakan vim sama sekali.

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

Cara kerjanya: Ini menambahkan a /di akhir baris, subs //untuk /\, subs ./untuk .

Lemon dirusak
sumber
Anda dapat menghindari melarikan diri /s jika Anda menggunakan pembatas yang berbeda, misalnya s#//#/\\ .
m-chrzan
Terima kasih, saya tidak tahu hal seperti itu ada
Destructible Lemon
4

MATL , 19 byte

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

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

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
Luis Mendo
sumber
3

CJam, 35 26 25 byte

Disimpan 9 byte berkat dennis

Disimpan 1 byte lagi, juga berkat dennis

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

Cobalah online!

Mungkin bermain golf dengan buruk, tapi saya tidak terlalu mengenal CJam. Mungkin ada cara yang lebih baik untuk memeriksa apakah suatu elemen ada dalam array, tetapi saya tidak dapat menemukan operator untuk itu.

Penjelasan:

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
Zwei
sumber
1
Wpada awalnya -1dan ?berfungsi baik dengan blok dan item tumpukan lainnya, sehingga Anda dapat mengurangi kode Anda menjadiq:I'.#)SI+IW='/=I'\+I'/+??
Dennis
1
Untuk menguji apakah karakter milik string, Anda dapat memotongnya dengan &.
Dennis
Saya sangat buruk di CJam lol
Zwei
3

05AB1E, 17 15 byte

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

Penjelasan

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

Cobalah online

Emigna
sumber
2

C, 85 byte

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

Ideone

Saya belum tidur selama sekitar 20 jam, kode saya mungkin bisa bermain golf banyak.

betseg
sumber
2

Brachylog , 35 byte

t~m["\/.":X]t:"/\ "rm:?{.h" "|r.}c.

Suite uji. (Sedikit dimodifikasi.)

Biarawati Bocor
sumber
2

Matlab, 74 71 62 57 byte

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

Ini menghitung dua karakter terakhir berdasarkan s(1) (karakter pertama) - untuk menentukan apakah kita berurusan dengan \/case, dan karakter terakhir s(end)untuk membuat tuple yang tepat untuk \/karakter.

pajonk
sumber
2

Retina, 19 byte

\.
 .
/$
/\^H
\\$
\/

^Hmewakili byte BS. Cobalah online!

Dennis
sumber
Mengapa karakter backspace?
Robert Fraser
Tanpa itu, penggantian berikutnya akan cocok dengan garis miring terbalik. Misalnya, input /akan menjadi /\/.
Dennis
2

> <> , 47 byte

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

Cobalah online!

Baris pertama adalah loop input standar> <>. Baris kedua memilih karakter yang sesuai dari / \untuk menambahkan ke string, berdasarkan pada karakter input terakhir. Selain itu, jika karakter input terakhir adalah a ., dua elemen teratas akan diaktifkan. Akhirnya, isi tumpukan dicetak secara terbalik.

Sok
sumber
2

JavaScript, 79 70 65 58 byte

(a,b="/\\/",i=b.indexOf(a[a.length-1]))=>i<0?" "+a:a+b[i+1]
kamoroso94
sumber
1
Ganti b.charAt(i+1)dengan b[i+1]untuk menyimpan beberapa byte. Juga, ini tidak berfungsi untuk semua kasus uji. \/memberi `/ \`, misalnya.
user2428118
@ user2428118 Terima kasih, bug diperbaiki dan kode disingkat!
kamoroso94
1
init bdan isebagai params dengan nilai default: (a,b=...,i=...)=>to avoidreturn
charlie
Ah ya, saya lupa tentang fitur baru itu. Juga dapat menghapus { }juga karena ini.
kamoroso94
pada kenyataannya, dengan beberapa langkah lagi, Anda akan bertemu dengan jawaban @ TylerY86
charlie
2

Haskell, 46 45 44 byte

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

Mengambil keuntungan dari fakta bahwa < .< /< 0< \dalam tabel ASCII untuk menyimpan dua byte

BlackCap
sumber
1

Python 2, 72 byte

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

Setiap bantuan bermain golf akan sangat dihargai!

Ini mengambil karakter terakhir dalam input dan mengubahnya menjadi kode ASCII untuk mendapatkan indeks yang sesuai dalam daftar dua karakter. Kedua karakter tersebut ditambahkan ke semua karakter input hingga yang terakhir.

Daniel
sumber
1

SQF, 91

Menggunakan format fungsi-sebagai-file:

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

Sebut sebagai "STRING" call NAME_OF_COMPILED_FUNCTION

Suram
sumber
1

Perl, 30 + 1 ( -p) = 31 byte

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

Kebutuhan -pdan -M5.010atau -Euntuk dijalankan:

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

Implementasi tantangan yang lurus ke depan. (Perhatikan bahwa ||antara dua regex terakhir adalah or, karena mungkin sulit dibaca, jadi ketiga regex adalah:, s/\./ ./dan s|/$|/\\|, dan s|\\$|\\/|)

Dada
sumber
1

C #, 54 byte

s=>s.EndsWith(".")?" "+s:s+(s.EndsWith("/")?"\\":"/");
TheLethalCoder
sumber
Menyediakan pesaing 46 byte untuk Anda. :)
TylerY86
1

PowerShell v2 +, 59 58 52 51 byte

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

Mengambil input $n, membuangnya ke operasi indeks array. Kami memilih elemen dari array berdasarkan indeks ['.\/'.IndexOf($n[-1])- yaitu, berdasarkan karakter terakhir dari input $n, ini akan mengakibatkan 0, 1atau 2. Itu sesuai dengan string array yang sesuai. Dalam kasus apa pun, string yang dihasilkan ditinggalkan di jalur pipa dan pencetakan tersirat.

Uji kasus

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

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

C #, 80 63 byte

s=>{var c=s[s.Length-1];retu‌​rn c<'/'?" "+s:c>'/'?s+"/":s+"\\‌​";}
downrep_nation
sumber
Bisakah Anda membuatnya bekerja menggunakan ekspresi lambda?
TylerY86
s=>{var c=s[s.Length-1];return c<'/'?" "+s:c>'/'?s+"/":s+"\\";}63 dotnetfiddle.net/8x79az
TylerY86
s=>{var c=s[s.Length-1];return c<47?' '+s:s+(c>47?'/':'\\');}61 dotnetfiddle.net/ykKIL1
TylerY86
Menambahkan pesaing 46 byte untuk Anda. :)
TylerY86
1

Kode mesin ARM di Linux, 50 byte

Hex dump:

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

Posting pertama di sini, harap saya melakukan ini dengan benar. Ini adalah perakitan ARM 32-bit, khususnya Thumb-2. String input adalah string yang diakhiri NUL yang diambil melalui r0, output dicetak ke stdout. Dalam sintaks C, prototipe untuk fungsi tersebut akan menjadi void func_name (char * string). Ini adalah keluhan AAPCS (ARM calling convention), jika tidak maka 2 byte dapat dicukur habis.

Inilah kumpulan yang setara, dengan komentar yang menjelaskan apa yang terjadi:

    @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.
Ian Chew
sumber
1

ECMAScript 6/2015 (JavaScript), 41 byte

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

Tangkapan bagus Neil.

TylerY86
sumber
Output Anda tampaknya salah. Untuk garis miring, kode Anda harus menambahkan garis miring berikutnya, bukan menambahkannya.
Dennis
Jawaban yang disesuaikan.
TylerY86
Mengapa tidak +(s+1)?
Neil
Lebih baik lagi s<'/',.
Neil
1

R, 119 byte

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

Tidak Disatukan:

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

else
s=switch(q,"/"="\\","/")
cat(a,s,sep="")
Frédéric
sumber
1

SED, 41 36 27

disimpan 7 terima kasih ke charlie

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

menggunakan 3 substitusi:
s/\./ ./menambahkan spasi jika ada .
s|/$|/\\|, s|$|/|menambahkan garis miring yang tepat untuk akhir
penggunaan |bukan/ sebagai pembatas

t bercabang sampai akhir jika regex kedua cocok sehingga tidak menambahkan garis miring lainnya

Riley
sumber
Saya baru saja datang ke solusi yang hampir identik: s/\./ ./;s./$./\\.;t;s.$./.- ini 27 byte. Substitusi 3 disederhanakan dan pada sistem saya -retidak diperlukan. Selain itu, saya menggunakan .bukannya #tetap secara visual di ruang input. ; o)
charlie
1

Turtlèd , 32 byte (tidak bersaing)

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

Penjelasan:

[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
Lemon dirusak
sumber
1

Java 7, 76 byte

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

Cukup mudah.

Tidak digabungkan & kode uji:

Coba di sini.

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("\\/\\/"));
  }
}

Keluaran:

  .
   .
    .
     .
      .
       .
        .
         .
/\
\/
/\/
\/\
/\/\
\/\/
/\/\/
\/\/\
Kevin Cruijssen
sumber