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.


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.


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.

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

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.


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)


-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

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 .


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

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

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


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.



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.


2

Retina, 19 byte

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

^Hmewakili byte BS. Cobalah online!


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.


2

JavaScript, 79 70 65 58 byte

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

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


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.


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


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|\\$|\\/|)



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 "$_")}
/ => /\
\ => \/
/\ => /\/
\/ => \/\
/\/ => /\/\
\/\ => \/\/
/\/\ => /\/\/
\/\/ => \/\/\


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.

1

ECMAScript 6/2015 (JavaScript), 41 byte

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

Tangkapan bagus Neil.


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="")

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


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

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:

  .
   .
    .
     .
      .
       .
        .
         .
/\
\/
/\/
\/\
/\/\
\/\/
/\/\/
\/\/\
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.