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


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.