Nhị nguyên sóng hạt theo chương trình


30

Viết chương trình hoặc hàm có trong một chuỗi đơn không trống. Chuỗi sẽ là 0 hoặc nhiều khoảng trắng theo sau một dấu chấm (một hạt ), chẳng hạn như .hoặc          ., hoặc chuỗi sẽ là một chuỗi gồm một hoặc nhiều dấu gạch chéo tiến và lùi xen kẽ (một sóng ) có thể bắt đầu bằng một, chẳng hạn như \hoặc /\/hoặc \/\/\/\/\/\/.

Trong cả hai trường hợp, truyền hạt / sóng sang phải bằng một đơn vị.

Cụ thể, trong trường hợp hạt, chèn một khoảng trắng trước dấu ., di chuyển nó một nơi sang phải, sau đó xuất chuỗi kết quả. Ví dụ:

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

Trong trường hợp sóng, nối thêm /hoặc \thích hợp để sóng tiếp tục xen kẽ và độ dài của nó tăng thêm một, sau đó xuất chuỗi kết quả. Ví dụ:

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

Trong cả hai trường hợp, đầu ra có thể không có dấu cách nhưng một dòng mới tùy chọn được cho phép.

Mã ngắn nhất tính bằng byte thắng.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Dennis

Câu trả lời:


16

C, 69 byte

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

Điều này đòi hỏi một máy cuối nhỏ và xuất ra thiết bị đầu cuối hỗ trợ mã thoát ASCII.

p=s[strlen(s)-1]^46 lấy mã ASCII cuối cùng của chuỗi đầu vào và XOR mã đó với mã ASCII của một dấu chấm.

p^=p?93:3022856sẽ gây ra pp^93nếu mã ASCII không phải là một (trở lại) slash, nơi p^46^93 == p^115, mà sẽ chuyển đổi giữa lưng và dấu gạch chéo. Nếu plà một dấu chấm, thay vào đó, nó sẽ 3022856là endian cho "\b .".

printf("%s%s",s,&p);in chuỗi đầu vào theo sau là số nguyên p, được hiểu là chuỗi byte cuối nhỏ.


1
Đây là thiên tài thuần túy.
Nữ tu bị rò rỉ

Bạn có thể lưu một byte bằng cách thay thế 3022856bằng '. \b', một ký tự nhiều chữ. Câu trả lời tuyệt vời!
Quentin

Bất cứ ai cũng có thể đưa ra một phiên bản này không sử dụng bất kỳ thứ stdlib nào? :)
TylerY86

12

Thạch , 17 14 byte

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

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

Ṫ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\}"\/"?|

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

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
Lưu ý đến bản thân: tìm hiểu cách thiết lập công đoàn. Đây dường như là nơi mà hầu hết các byte được lưu khi so sánh với của tôi.
Zwei

6

Python, 41 byte

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

Casework. Sử dụng thứ tự sắp xếp ' ', '.', '/', '\'. Đối với không gian và thời gian, chuẩn bị một không gian. Mặt khác, nối thêm dấu gạch chéo hoặc dấu gạch chéo ngược với ký tự cuối cùng.


5

Python, 44 42 byte

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

Thay thế ký tự cuối cùng bằng bộ hai ký tự tương ứng. liên kết ideone

(-2 byte nhờ chức năng ánh xạ ngắn hơn của @ xsot)


-ord(s[-1])&3cũng đưa ra 3 chỉ số khác nhau.
xsot

@xsot Ôi, tôi không nghĩ đến &!
Sp3000

Không có meme lần này? : '(
ThreeFx

5

Ngôn ngữ nhà sản xuất trò chơi, 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 tổ hợp phím

Câu trả lời vim đầu tiên chưa từng có, thậm chí còn chưa sử dụng vim.

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

Cách thức hoạt động: Nó nối thêm /ở cuối dòng, subs //for /\, subs ./cho .


Bạn có thể tránh thoát /s nếu bạn sử dụng một dấu phân cách khác, ví dụ s#//#/\\ .
m-chrzan 17/8/2016

Cảm ơn, tôi không biết bất cứ điều gì như thế tồn tại
Lemon

4

MATL , 19 byte

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

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

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

Đã lưu 9 byte nhờ dennis

Đã lưu thêm 1 byte, cũng nhờ dennis

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

Hãy thử trực tuyến!

Có lẽ chơi golf kém, nhưng tôi không quá quen thuộc với CJam. Có lẽ có một cách tốt hơn để kiểm tra xem một phần tử có nằm trong một mảng không, nhưng tôi không thể tìm thấy bất kỳ toán tử nào cho điều đó.

Giải trình:

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
Wban đầu -1?hoạt động cả với các khối và các mục ngăn xếp khác, vì vậy bạn có thể giảm mã của mình xuốngq:I'.#)SI+IW='/=I'\+I'/+??
Dennis

1
Để kiểm tra xem một ký tự có thuộc một chuỗi hay không, bạn có thể cắt chúng với &.
Dennis

Tôi rất tệ ở CJam lol
Zwei

3

05AB1E, 17 15 byte

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

Giải trình

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

Dùng thử trực tuyến


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

Ý tưởng

Tôi đã không ngủ khoảng 20 giờ, mã của tôi có thể bị đánh gôn rất nhiều.



2

Matlab, 74 71 62 57 byte

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

Nó tính toán hai ký tự cuối cùng dựa trên s(1)(ký tự đầu tiên) - để xác định xem chúng ta có xử lý \/vụ việc hay không và ký tự cuối cùng s(end)để tạo ra bộ dữ liệu chính xác cho các \/ký tự.


2

Võng mạc, 19 byte

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

^Hđại diện cho byte BS. Hãy thử trực tuyến!


Tại sao nhân vật backspace?
Robert Fraser

Không có nó, sự thay thế tiếp theo sẽ phù hợp với dấu gạch chéo ngược. Ví dụ, đầu vào /sẽ trở thành /\/.
Dennis

2

> <> , 47 byte

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

Hãy thử trực tuyến!

Dòng đầu tiên là một vòng lặp tiêu chuẩn> <>. Dòng thứ hai chọn ký tự thích hợp / \để nối vào chuỗi, dựa trên ký tự đầu vào cuối cùng. Ngoài ra, nếu ký tự đầu vào cuối cùng là a ., hai phần tử trên cùng được chuyển đổi. Cuối cùng, nội dung ngăn xếp được in ngược lại.


2

JavaScript, 79 70 65 58 byte

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

1
Thay thế b.charAt(i+1)bằng b[i+1]để lưu một số byte. Ngoài ra, điều này không làm việc cho tất cả các trường hợp thử nghiệm. \/đưa ra `/ \`, chẳng hạn.
dùng2428118

@ user2428118 Cảm ơn, đã sửa lỗi và rút ngắn mã!
kamoroso94

1
init bidưới dạng params với giá trị mặc định: (a,b=...,i=...)=>để tránhreturn
charlie

À đúng rồi, tôi quên mất tính năng mới đó. Cũng có thể loại bỏ { }là tốt vì điều này.
kamoroso94

thực tế, với một vài bước nữa, bạn sẽ hội tụ câu trả lời của @ TylerY86
charlie


2

Haskell, 46 45 44 byte

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

Lợi dụng thực tế là < .< /< 0< \trong bảng ASCII để cứu hai byte


1

Python 2, 72 byte

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

Bất kỳ trợ giúp chơi golf nhiều hơn sẽ được đánh giá rất cao!

Điều này lấy ký tự cuối cùng trong đầu vào và chuyển đổi nó thành mã ASCII của nó để lấy chỉ mục tương ứng trong danh sách hai ký tự. Hai ký tự đó được thêm vào tất cả các ký tự đầu vào cho đến ký tự cuối cùng.


1

SQF, 91

Sử dụng định dạng hàm dưới dạng tệp:

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

Gọi như "STRING" call NAME_OF_COMPILED_FUNCTION


1

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

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

Nhu cầu -p-M5.010hoặc -Eđể chạy:

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

Thẳng tiến thực hiện thử thách. (Lưu ý rằng ||giữa hai regex cuối cùng là or, vì nó có thể khó đọc, vì vậy ba regex là : s/\./ ./, và s|/$|/\\|, và s|\\$|\\/|)


1

C #, 54 byte

s=>s.EndsWith(".")?" "+s:s+(s.EndsWith("/")?"\\":"/");

Cung cấp một đối thủ cạnh tranh 46 byte cho bạn. :)
TylerY86

1

PowerShell v2 +, 59 58 52 51 byte

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

Có đầu vào $n, bỏ nó một hoạt động chỉ mục mảng. Chúng tôi chọn phần tử của mảng dựa trên các chỉ số ['.\/'.IndexOf($n[-1])- tức là, dựa trên ký tự cuối cùng của đầu vào $n, điều này sẽ dẫn đến 0, 1hoặc 2. Điều đó tương ứng với chuỗi thích hợp của mảng. Trong mọi trường hợp, chuỗi kết quả được để lại trên đường ống và in ấn là ẩn.

Các trường hợp thử nghiệm

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

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


1

Mã máy ARM trên Linux, 50 byte

Đổ lục giác:

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

Bài viết đầu tiên ở đây, hy vọng tôi đang làm điều này đúng. Đây là bản lắp ráp ARM 32 bit, cụ thể là Thumb-2. Chuỗi đầu vào là một chuỗi kết thúc NUL được thực hiện thông qua r0, đầu ra được in ra thiết bị xuất chuẩn. Trong cú pháp C, nguyên mẫu cho hàm sẽ là void func_name (chuỗi char *). Đó là khiếu nại của AAPCS (quy ước gọi ARM), nếu không thì 2 byte có thể bị xóa.

Đây là hội đồng tương đương, với các bình luận giải thích những gì đang xảy ra:

    @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]

Neil bắt tốt.


Đầu ra của bạn dường như không chính xác. Đối với dấu gạch chéo, mã của bạn nên nối thêm dấu gạch chéo tiếp theo, không thêm vào dấu gạch chéo.
Dennis

Điều chỉnh câu trả lời.
TylerY86

Tại sao không +(s+1)?
Neil

Vẫn tốt hơn , 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="")}

Ung dung:

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

cứu 7 nhờ charlie

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

sử dụng 3 thay thế:
s/\./ ./thêm một khoảng trắng nếu có một .
s|/$|/\\|, s|$|/|thêm dấu gạch chéo thích hợp vào mục
đích sử dụng |thay vì /như dấu phân cách

t nhánh đến cuối nếu regex thứ hai khớp với nhau để nó không thêm dấu gạch chéo khác


Tôi vừa đi đến một giải pháp gần như giống hệt nhau: s/\./ ./;s./$./\\.;t;s.$./.- đó là 27 byte. Sự thay thế thứ 3 được đơn giản hóa và trên hệ thống của tôi -relà không cần thiết. Ngoài ra, tôi sử dụng .thay vì #để trực quan trong không gian đầu vào. ; o)
charlie

1

Turtlèd , 32 byte (không lọc )

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

Giải trình:

[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:'/');}

Khá đơn giản.

Mã thử nghiệm & mã hóa:

Hãy thử nó ở đây.

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

Đầu ra:

  .
   .
    .
     .
      .
       .
        .
         .
/\
\/
/\/
\/\
/\/\
\/\/
/\/\/
\/\/\
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.