측면 적으로 프로그래밍 방식으로 웨이브 입자 이중성


30

비어 있지 않은 한 줄 문자열을받는 프로그램이나 함수를 작성하십시오. 문자열 중 하나의주기 (a 뒤에 0 이상의 공백 것이다 입자 등) .이나          ., 혹은 문자열은 하나의 시퀀스 이상의 순방향 교번 다시 슬래시 (a 것이다 웨이브 등 어느 하나를 시작할 수) 로 \또는 /\/\/\/\/\/\/\/.

두 경우 모두 입자 / 파 를 한 단위 씩 오른쪽으로 전파합니다 .

구체적으로 파티클의 경우, 앞에 공백을 삽입 .하고 오른쪽으로 한 칸 이동 한 다음 결과 문자열을 출력합니다. 예를 들면 다음과 같습니다.

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

웨이브 경우 APPEND하거나 /또는 \적절하므로 파 교번하여 하나의 길이가 증가함에 따라, 생성 된 문자열 다음 출력을 유지한다. 예를 들면 다음과 같습니다.

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

두 경우 모두 출력에 후행 공백이 없을 수 있지만 후행 줄 바꿈 옵션이 허용됩니다.

바이트 단위의 가장 짧은 코드가 이깁니다.


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Dennis

답변:


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);p리틀 엔디안 바이트 문자열로 해석 되는 입력 문자열 뒤에 integer를 인쇄합니다 .


1
이것은 순수한 천재입니다.
Leaky Nun

멀티 바이트 문자 리터럴 인 을 대체 3022856하여 1 바이트를 저장할 수 있습니다 '. \b'. 멋진 답변!
Quentin

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
자기주의 사항 : 노동 조합이 어떻게 작동하는지 배우십시오. 이것은 내 바이트와 비교할 때 대부분의 바이트가 저장된 곳 인 것 같습니다.
Zwei

6

파이썬, 41 바이트

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

사례. 정렬 된 순서를 사용합니다 ' ', '.', '/', '\'. 공백과 마침표에 공백을 추가합니다. 그렇지 않으면 마지막 문자와 반대로 슬래시 또는 블랙 슬래시를 추가합니다.


5

파이썬, 44 42 바이트

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

마지막 문자를 해당하는 두 문자 세트로 바꿉니다. 이데온 링크

(@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 이스케이프를 피할 수 있습니다 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 바이트

dennis 덕분에 9 바이트 절약

dennis 덕분에 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'/+??
데니스

1
문자가 문자열에 속하는지 테스트하기 위해 문자와 교차 할 수 있습니다 &.
Dennis

나는 CJam lol에 너무 나쁘다
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>

온라인으로 사용해보십시오!

첫 번째 줄은 표준> <> 입력 루프입니다. 두 번째 줄은 / \마지막 입력 문자를 기준으로 문자열에 추가 할 적절한 문자를 선택합니다 . 또한 마지막 입력 문자가 .인 경우 맨 위 두 요소가 전환됩니다. 마지막으로 스택 내용물이 반대로 인쇄됩니다.


2

자바 스크립트, 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 bi기본값으로 params로 : (a,b=...,i=...)=>피하기return
charlie

아 예, 그 새로운 기능을 잊었습니다. 또한 { }이것 때문에 를 제거 할 수있었습니다 .
kamoroso94

실제로 몇 단계를 더 거치면 @ TylerY86
charlie


2

하스켈, 46 45 44 바이트

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

사실을 활용하는 < .< /< 0< \2 바이트를 저장하는 ASCII 테이블


1

파이썬 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

C #, 54 바이트

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

당신을 위해 46 바이트 경쟁자를 제공했습니다. :)
TylerY86

1

PowerShell v2 +, 59 58 52 51 바이트

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

input을 가져 $n와서 배열 인덱스 작업을 덤프합니다. 우리는 지수에 따라 배열의 요소를 선택 ['.\/'.IndexOf($n[-1])- 즉, 입력의 마지막 문자에 기반을 $n,이 발생합니다 0, 1또는 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]

잘 잡아라 닐


출력이 올바르지 않은 것 같습니다. 슬래시의 경우, 코드 앞에 다음 슬래시를 추가해야합니다.
Dennis

조정 된 답변.
TylerY86

왜 안돼 +(s+1)?
Neil

더 나은, s<'/'.
Neil

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 두 번째 정규 표현식이 일치하면 끝까지 분기되어 다른 슬래시를 추가하지 않습니다.


방금 거의 동일한 해결책을 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

자바 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.