Подвійність хвиль-частинок бічно програмно


30

Напишіть програму або функцію, яка містить непорожній однорядковий рядок. Рядок буде або нульовим, або кількома пробілами, після яких слід один період ( частинка ), наприклад, .або          ., або рядок буде послідовністю одного або декількох змінних передніх і зворотних косих рядків ( хвилі ), які можуть починатися з одного, такого як \або /\/або \/\/\/\/\/\/.

У будь-якому випадку розповсюджуйте частинку / хвилю вправо однією одиницею.

Зокрема, у випадку з частинками вставити пробіл перед ., перемістивши його на одне місце праворуч, а потім вивести отриманий рядок. Наприклад:

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

У випадку хвилі додайте /або \доречно або належним чином, щоб хвиля чергувалась, і довжина збільшується на одиницю, а потім виводить отриманий рядок. Наприклад:

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

У будь-якому випадку у висновку може не бути пробілів, але необов'язковий останній новий рядок дозволений.

Виграє найкоротший код у байтах.


Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
Денніс

Відповіді:


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 вхідного рядка і XOR позначає його кодом ASCII точки.

p^=p?93:3022856призведе до того , pщоб бути , p^93якщо код ASCII ні (тому) слеш, де p^46^93 == p^115, який буде перемикатися між задньою і передньою косою риси. Якщо pкрапка є, це натомість буде 3022856, що мало-ендіан "\b .".

printf("%s%s",s,&p);друкує вхідний рядок, за яким слідує ціле число p, інтерпретується як байт-рядок з малою ендіанською


1
Це чистий геній.
Leaky Nun

Ви можете зберегти один байти, замінюючи 3022856з '. \b', багатобайтові літерою. Дивовижна відповідь!
Квентін

Чи може хтось придумати версію цієї версії, яка не використовує жодних речей 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]

Замінює останній символ відповідним набором з двох символів. ideone ланка

(-2 байти завдяки коротшій функції відображення @ xsot)


-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 коли-небудь, вим не використовували насправді навіть.

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

Як це працює: Він приєднує /в кінці лінії, підводні човни //для /\, підводних човнів ./для .


Ви можете уникнути уникнення /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 байт

Збережено 9 байт завдяки dennis

Збережено ще 1 байт, також завдяки dennis

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'/+??
Dennis

1
Щоб перевірити, чи належить персонаж до рядка, ви можете перетинати їх &.
Денніс

Я так погано CJam лол
Zwei


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

Матлаб, 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>

Спробуйте в Інтернеті!

Перший рядок - це стандартний цикл введення. Другий рядок вибирає відповідний символ / \для додавання до рядка, виходячи з останнього символу введення. Крім того, якщо останнім символом введення було a ., два верхні елементи перемикаються. Нарешті, вміст стеку друкується зворотно.


2

JavaScript, 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]щоб зберегти кілька байт. Також це не працює для всіх тестових випадків. \/дає, наприклад, `/ \`.
користувач2428118

@ user2428118 Дякуємо, виправлено помилку та код скорочено!
kamoroso94

1
init bі iяк парами зі значенням за замовчуванням: (a,b=...,i=...)=>щоб уникнутиreturn
Чарлі

Ага так, я забув про цю нову особливість. З-за цього також вдалося зняти { }.
kamoroso94

насправді, зробивши ще кілька кроків, ви сходите до відповіді @ TylerY86
Чарлі


2

Haskell, 46 45 44 байт

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

Приймає перевага в тому , що < .< /< 0< \в таблиці ASCII , щоб зберегти два байта


1

Python 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

PowerShell v2 +, 59 58 52 51 байт

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

Бере введення $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

C #, 80 63 байти

s=>{var c=s[s.Length-1];retu‌​rn c<'/'?" "+s:c>'/'?s+"/":s+"\\‌​";}

Чи можете ви змусити його працювати, використовуючи лямбдаський вираз?
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

Додано 46-байтний конкурент для вас. :)
TylerY86

1

ARM машинний код на Linux, 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. Вхідний рядок - це NUL-закінчена рядок, взята через r0, вихід надрукується у stdout. У C-синтаксисі прототипом функції буде недійсне func_name (рядок char *). Це скарга AAPCS (ARM call convention), якби не 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]

Хороший улов Ніла.


Здається, ваш висновок невірний. Для косої риски ваш код повинен додавати наступну косу рису, а не додати її.
Денніс

Коригувана відповідь.
TylerY86

Чому ні +(s+1)?
Ніл

А ще краще, s<'/'.
Ніл

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

СЕД, 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

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

Вихід:

  .
   .
    .
     .
      .
       .
        .
         .
/\
\/
/\/
\/\
/\/\
\/\/
/\/\/
\/\/\
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.