Волнообразно-частичная дуальность латерально программно


30

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

В любом случае распространяйте частицу / волну вправо на одну единицу.

В частности, в случае частиц вставьте пробел перед ., переместив его на одно место вправо, затем выведите получившуюся строку. Например:

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

В случае волны добавьте либо, /либо \соответствующим образом, чтобы волна продолжала чередоваться и ее длина увеличилась на единицу, а затем выведите получившуюся строку. Например:

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

В любом случае выходные данные могут не иметь конечных пробелов, но допускается дополнительная конечная новая строка.

Самый короткий код в байтах побеждает.


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

Ответы:


16

C 69 байтов

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

Для этого требуется машина с прямым порядком байтов и вывод на терминал, поддерживающий escape-коды 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
Это чистый гений.
Утренняя монахиня

Вы можете сохранить один байты, заменяя 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
Примечание для себя: узнайте, как работает set union. Похоже, именно здесь было сохранено большинство байтов по сравнению с моими.
Цвей

6

Python, 41 байт

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

Casework. Использует отсортированный порядок ' ', '.', '/', '\'. Для пробелов и точек, пробелы. В противном случае добавляется косая черта или черная косая черта напротив последнего символа.


5

Python, 44 42 байт

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

Заменяет последний символ соответствующим набором из двух символов. ссылка на идеон

(-2 байта благодаря более короткой функции отображения @ xsot)


-ord(s[-1])&3также дает 3 разных показателя.
xsot

@ xsot О, хорошо, я не думал об этом &!
Sp3000

Нет мема на этот раз? : '(
ThreeFx

5

Game Maker Language, 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>

Как это работает: он добавляет /в конце строки, сабы //для /\, сабы ./для .


/Например, вы можете избежать экранирования, если используете другой разделитель 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 байтов благодаря Денису

Сохранено еще 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
Чтобы проверить, принадлежит ли символ строке, вы можете пересечь их &.
Деннис

Я так плох в 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?"\\":"/");}

Ideone

Я не спал около 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

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]чтобы сохранить несколько байтов. Кроме того, это не работает для всех тестовых случаев. \/дает `/ \`, например.
user2428118

@ user2428118 Спасибо, ошибка исправлена ​​и код укорочен!
kamoroso94

1
init bи ias params со значением по умолчанию: (a,b=...,i=...)=>чтобы избежатьreturn
Чарли

Ах да, я забыл об этой новой функции. Также удалось удалить, { }а также из-за этого.
kamoroso94

на самом деле, сделав еще несколько шагов, вы сходитесь к ответу @ TylerY86
Чарли


2

Хаскелл, 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. Входная строка является строкой с нулевым символом в конце, принятой через r0, вывод выводится на стандартный вывод. В С-синтаксисе прототипом функции будет 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]

Хорошо поймать Нила.


Ваш вывод кажется неверным. Для слешей ваш код должен добавлять следующий слеш, а не предварять его.
Деннис

Скорректированный ответ.
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="")}

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

спас 7 благодаря Чарли

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

использует 3 замены:
s/\./ ./добавляет пробел, если есть .
s|/$|/\\|, s|$|/|добавляет соответствующую косую черту в конце
использования |вместо/ качестве разделителя

t ветвится до конца, если второе регулярное выражение совпадает, поэтому оно не добавляет другую косую черту


Я просто пришел к почти идентичному решению: s/\./ ./;s./$./\\.;t;s.$./.- это 27 байтов. 3-я замена упрощена и в моей системе -reне нужна. Кроме того, я использую .вместо того, #чтобы визуально оставаться в области ввода. ; о)
Чарли

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

Довольно просто.

Ungolfed & тестовый код:

Попробуй это здесь.

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.