Yanal olarak Programsal Olarak Dalga Parçacık İkiliği


30

Boş olmayan tek satırlı bir dize alan bir program veya işlev yazın. Dize sıfır veya daha fazla boşluk, ardından bir periyot (bir parçacık ), .veya gibi          ., veya dizi , veya bunlardan biriyle başlayabilen bir veya daha fazla alternatif ileri ve geri eğik çizginin (bir dalga ) bir sekansı olacaktır. olarak \ya da /\/ya da \/\/\/\/\/\/.

Her iki durumda da, parçacığı / dalgayı bir birim sağa doğru yayın .

Spesifik olarak, partikül halinde, önce bir boşluk .sağa hareket ettirmeden önce bir boşluk yerleştirin , ardından elde edilen dizgeyi çıkartın. Örneğin:

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

Dalga durumunda, dalganın değişmeye devam etmesi ve uzunluğu bir kat artacak şekilde ya /da \uygun bir şekilde ekleyin , ardından elde edilen dizgeyi çıktılayın. Örneğin:

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

Her iki durumda da, çıkışın izleyen boşlukları olmayabilir, ancak isteğe bağlı izleyen bir yeni satıra izin verilir.

Bayt cinsinden en kısa kod kazanır.


Yorumlar genişletilmiş tartışmalar için değildir; bu konuşma sohbete taşındı .
Dennis,

Yanıtlar:


16

C, 69 bayt

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

Bu küçük bir endian makinesi gerektirir ve ASCII çıkış kodlarını destekleyen bir terminale çıkış yapar.

p=s[strlen(s)-1]^46 giriş dizesinin son ASCII kodunu alır ve XOR bunu bir noktanın ASCII koduyla birlikte verir.

p^=p?93:3022856neden olacaktır polmaya p^93ASCII kodu (arka) eğik çizgi, değilse p^46^93 == p^115sırt ve eğik çizgi arasında geçiş olacak. Eğer pbir nokta ise, bunun yerine 3022856küçük-endian olacaktır."\b ." .

printf("%s%s",s,&p);giriş dizesini, ardından pküçük bir endian bayt dizisi olarak yorumlanan tam sayıyı izler .


1
Bu saf dahi.
Sızdıran Rahibe

Bir bayt'ı , çok baytlı karakter değişmezi 3022856ile değiştirerek kaydedebilirsiniz '. \b'. Müthiş cevap!
Quentin

Herhangi bir stdlib şey kullanmayan bir sürümü ile gelip kimse olabilir mi? :)
TylerY86

12

Jöle , 17 14 bayt

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

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

Ṫ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 bayt

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

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

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
Kendime not: Birliğin nasıl çalıştığını öğrenin. Bu, baytların çoğunun benimkine kıyasla kurtarıldığı yer gibi görünüyor.
Zwei

6

Python, 41 bayt

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

Casework. Sıralanmış sırayı kullanır ' ', '.', '/', '\'. Boşluk ve dönem için bir boşluk hazırlar. Aksi takdirde, son karakterin karşısına bir eğik çizgi veya kara eğik çizgi ekler.


5

Piton, 44 42 bayt

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

Son karakteri, karşılık gelen iki karakter kümesiyle değiştirir. ideone bağlantısı

(@ Xsot'un daha kısa haritalama fonksiyonu sayesinde -2 bayt)


-ord(s[-1])&3ayrıca 3 farklı indeks verir.
xsot

@ xsot Oh güzel, düşünmedim &!
Sp3000

Bu sefer meme yok mu? : '(
ThreeFx

5

Oyun Yapımcı Dili, 107 bayt

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

5

Vim, 27 23 tuş vuruşlarını

İlk vim cevabı hiç, hatta hiç vim kullanmamış.

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

Nasıl çalışır: Bir ekler /satırın sonunda, subs //için /\, subs ./için .


/Örneğin, farklı bir sınırlayıcı kullanıyorsanız , s'den kaçmayı önleyebilirsiniz s#//#/\\ .
m-chrzan

Teşekkürler, böyle bir şeyin var olduğu hakkında hiçbir fikrim yoktu
Yıkılabilir Limon

4

MATL , 19 bayt

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

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

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 bayt

Dennis sayesinde 9 bayt kaydedildi

1 bayt daha kaydedildi, dennis sayesinde

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

Çevrimiçi deneyin!

Muhtemelen kötü golf oynadım, ama CJam'ı çok iyi tanımadım. Bir elementin dizide olup olmadığını kontrol etmenin muhtemelen daha iyi bir yolu vardır, ancak bunun için herhangi bir operatör bulamadım.

Açıklama:

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
Wbaşlangıçta -1ve ?hem bloklar hem de diğer yığın öğeleriyle birlikte çalışır, bu nedenle kodunuzu q:I'.#)SI+IW='/=I'\+I'/+??
Dennis

1
Bir karakterin bir dizgeye ait olup olmadığını test etmek için, onları kesişebilirsiniz &.
Dennis,

CJam lol de çok kötüyüm
Zwei

3

05AB1E, 17 15 bayt

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

açıklama

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

Çevrimiçi deneyin


2

C, 85 bayt

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

Ideone

Yaklaşık 20 saattir uyumamıştım, kodum muhtemelen çok fazla golf oynuyor olabilir.



2

Matlab, 74 71 62 57 bayt

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

Son iki karakteri s(1)(ilk karakter) temel alarak hesaplar - bu \/durumla başa s(end)çıkıp çıkmadığımızı ve \/karakterler için doğru dizgiyi oluşturmak için son karakteri belirler.



2

> <> , 47 bayt

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

Çevrimiçi deneyin!

İlk satır standart> <> giriş döngüsüdür. İkinci satır / \, son girdi karakterine bağlı olarak dizgeye eklenecek uygun karakteri seçer . Ayrıca, son giriş karakteri bir a .ise, ilk iki eleman değiştirilir. Son olarak, yığın içerikleri ters şekilde yazdırılır.


2

JavaScript, 79 70 65 58 bayt

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

1
Bazı baytları kaydetmek için b.charAt(i+1)ile değiştirin b[i+1]. Ayrıca, bu tüm test durumlarında işe yaramaz. \/Mesela `/ \` verir.
user2428118

@ user2428118 Teşekkürler, hata düzeltildi ve kod kısaltıldı!
kamoroso94

1
init bve ivarsayılan değeri olan params olarak: (a,b=...,i=...)=>önlemek içinreturn
charlie

Ah evet, o yeni özelliği unuttum. Ayrıca { }bu nedenle de kaldırmayı başardık .
kamoroso94

Aslında, birkaç adımla, @ TylerY86
charlie,


2

Haskell, 46 45 44 bayt

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

Aslında yararlanır bu < .< /< 0< \iki bayt kaydetmek için ASCII tablosundaki


1

Python 2,72 bayt

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

Daha fazla golf oynamak için herhangi bir yardım çok takdir edilecektir!

Bu, girdideki son karakteri alır ve karşılık gelen dizini iki karakter listesinde almak için ASCII koduna dönüştürür. Bu iki karakter, girişin sonuna kadar sonuna kadar olan tüm karakterlere eklenir.


1

SQF, 91

Dosya olarak işlevini kullanarak:

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

Ara "STRING" call NAME_OF_COMPILED_FUNCTION


1

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

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

İhtiyaçları -pve -M5.010veya -Eçalıştırmak:

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

Zorluğun doğrudan uygulanması. ( ||Son iki regex arasında or, okunması zor olabileceğinden, bu üç regex'in:, s/\./ ./ve s|/$|/\\|, ve s|\\$|\\/|) dikkat edin.



1

PowerShell v2 +, 59 58 52 51 bayt

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

Girdiyi alır $n, bir dizi indeks işlemini terk eder. Biz endeksine dayalı dizinin elemanını seçmek ['.\/'.IndexOf($n[-1])- yani girişin son karakterine dayalı $n, bu neden olacaktır 0, 1ya da 2. Bu dizinin uygun dize karşılık gelir. Her durumda, sonuçta elde edilen dize boru hattında bırakılır ve yazdırma işlemi örtüktür.

Test durumları

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

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


1

ARM machine code on Linux, 50 bytes

Hex dökümü:

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

İlk mesaj burada, umarım bu doğru yapıyorum. Bu, 32-bit ARM düzeneği, özellikle Thumb-2. Giriş dizisi, R0 içinden alınan NUL sonlandırılmış bir dizedir, çıktı stdout'a yazdırılır. C-sentaksında, fonksiyonun prototipi void func_name (char * string) olur. AAPCS (ARM çağrı sözleşmesi) şikayeti, eğer olmasaydı 2 baytlık bir şey tıraş edilebilirdi.

İşte neler olduğunu açıklayan yorumlarla eşdeğer derleme:

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

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

İyi Neil'i yakala.


Your output seems to be incorrect. For the slashes, your code should append the next slash, not prepend it.
Dennis

Adjusted answer.
TylerY86

Why not +(s+1)?
Neil

Better still, s<'/'.
Neil

1

R, 119 bytes

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

Ungolfed :

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

saved 7 thanks to charlie

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

3 ikamelerini kullanır:
s/\./ ./Bir varsa, bir boşluk ekler .
s|/$|/\\|, s|$|/|uç uygun kesiği
kullanım |yerine /ayırıcı olarak

t ikinci regex eşleşirse diğerine eğik çizgi eklemeyecek şekilde biterse


Neredeyse aynı bir çözüme geldim: s/\./ ./;s./$./\\.;t;s.$./.- 27 bayt. Üçüncü ikame basitleştirildi ve sistemimde -rebuna gerek yok. Ayrıca, giriş alanında görsel olarak kalmak .yerine kullanıyorum #. ; o)
charlie

1

Turtlèd , 32 bayt (rekabetçi değil)

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

Açıklama:

[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 bytes

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

Pretty straightforward.

Ungolfed & test code:

Try it here.

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

Output:

  .
   .
    .
     .
      .
       .
        .
         .
/\
\/
/\/
\/\
/\/\
\/\/
/\/\/
\/\/\
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.