Биржевая капитализация


35

Передавая две строки букв, перенесите шаблон заглавных букв каждой строки на другую. Побеждает несколько байтов.

Input:   CodeGolf xxPPCGxx  
Output:  coDEGOlf XxppCgxx
  • Обе строки будут одинаковой длины и непустыми, только с буквами a..zи A..Z.
  • Вы можете вывести две результирующие строки в любом порядке относительно входных данных.
  • Вы можете представить пару строк как одну строку с однобуквенным разделителем символов для ввода и / или вывода.
  • Вы можете представить строку в виде списка символов или односимвольных строк, но не в виде последовательности значений кодовых точек, если это не просто строки на вашем языке.
  • Ваш ввод и вывод могут представлять строки по-разному.

Тестовые случаи:

CodeGolf xxPPCGxx -> coDEGOlf XxppCgxx
lower UPPER -> LOWER upper
MiXeD lower -> mixed LoWeR
A A -> A A
ABcd EfGh -> AbCd EFgh

Ответы:


14

Java (JDK 10) , 66 байт

a->b->{for(int i=a.length,t;i-->0;b[i]^=t)a[i]^=t=(a[i]^b[i])&32;}

Попробуйте онлайн!

Пояснения

a->b->{                           // Curried lambda
 for(int i=a.length,t;i-->0;      //  Descending loop on i,
                                  //  Declare t
     b[i]^=t                      //   Apply the case difference to b[i]
   )
  a[i]^=t=(a[i]^b[i])&32;         //   Assign the case difference of the two letters to t, and apply it to a[i].
}

9
Совершенно не связан с этим вашим ответом, но это проще, чем создать чат. ; p Вы заметили ошибку Java-10 TIO при использовании array[i++%n]+=...;? array[t=i++%n]=array[t]+...;работает отлично; и array[i%n]+=...;i++;прекрасно работает, но использование i++или ++iс модулем и +=добавление к строке в массиве не работает .. Вот Java 10 TIO в качестве примера, чтобы увидеть проблему. Это ошибка (или особенность: S) в Java 10 JDK или в компиляторе Java 10 TIO?
Кевин Круйссен,

1
@KevinCruijssen Я вижу проблему, но она кажется странной. Я вижу, что на TIO используется версия 10.0.0_46 (от 20-03-2018). Последняя версия 10.0.1. Возможно, нам следует попросить TIO обновить их версию Java.
Оливье Грегуар

3
@KevinCruijssen Деннис обновил версию до 10.0.1, и проблема все еще происходит (у меня еще не установлена ​​Java 10, поэтому я, как и вы, полагаюсь на TIO). Я спросил о переполнении стека, так как просто не знаю, что здесь происходит ... Это сбивает с толку!
Оливье Грегуар

5
@KevinCruijssen Это нормально, этот ответ не так привлекателен: P В любом случае ... Дело в том, что вы действительно обнаружили ошибку . Поскольку в спецификации сказано, что он должен действовать так, как вы думаете, продолжайте писать свой ответ таким образом, оптимизированный для Java 10, если вам это нужно. Таким образом, у вас есть правильный ответ на Java 10, но из-за этой ошибки он не тестируется. Просто напишите его и протестировать его в Java 8, а затем сделать соответствующие Java 10 изменений , как изменения Stringв var.
Оливье Грегуар

6
Я думаю, что это действительно здорово, что вы нашли ошибку в JDK 10. Хорошая работа:]
Poke

13

C (gcc) , 86 58 55 53 байта

c(a,s,e)char*a,*s;{for(;*s++^=e=(*s^*a)&32;)*a++^=e;}

Попробуйте онлайн!



@ Cowsquack Wow; большое спасибо.
Джонатан Фрех


@ OlivierGrégoire Спасибо.
Джонатан Фрех

8

Желе , 9 байт

O&32^/^OỌ

Попробуйте онлайн!

Как это работает

O&32^/^OỌ  Main link. Argument: [s, t] (pair of strings)

O          Ordinal; replace each character with its code point.
 &32       Perform bitwise AND with 32, yielding 32 for lowercase letters, 0 for
           uppercase ones.
    ^/     Reduce by XOR, yielding 32 for letter pairs with different 
           capitalizations, 0 for letter pair with matching capitalizations.
      ^O   XOR the result with each of the code points.
        Ọ  Unordinal; replace each code point with its character.

1
... мы знали, что это случится: D
Джонатан Аллан

7

APL (Dyalog Classic) , 13 12 байт

⊖⊖819⌶¨⍨∊∘⎕a

Попробуйте онлайн!

вход и выход - матрица символов 2 × N

⎕a это прописные буквы английского алфавита 'ABC...Z'

∊∘⎕a возвращает булеву матрицу, указывающую, какие буквы на входе являются заглавными

819⌶ преобразует свой правый аргумент в верхний или нижний регистр в зависимости от его логического левого аргумента («819» - leetspeak для «БОЛЬШОЙ»)

819⌶¨⍨делает это для каждого ¨символа ( ), swapping ( ) аргументы

означает перевернуть вертикально; один действует как левый аргумент, 819⌶а другой - последнее действие


1
"819" is leetspeak for "BIG"... Шутки в сторону? Это фактическое объяснение, почему это 819? 0_o
DLosc

@DLosc да :) смотрите чат
ngn

5

Pyth , 10 байт

rVV_mmrIk1

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

Пояснения и аккуратные трюки Pyth

  • rVV_mmrIk1- Полная программа. Ввод берется из STDIN в виде списка из двух строк, а вывод записывается в STDOUT в виде списка из двух списков символов.

  • mm - Для каждого символа в каждой из строк:

    • Ik - Проверьте, является ли он инвариантным по отношению к ...
    • r...1- ... Преобразование в верхний регистр. Выходит True для прописных символов и False для строчных.
  • _ - Переверните этот список.

  • VV - И дважды векторизовать следующую функцию над двумя списками:

    • r- Преобразовать в верхний регистр, если значение равно True(иначе 1), иначе преобразовать в нижний регистр.

Это представление злоупотребляет тем фактом, что r0и r1являются строчными и прописными функциями в Pyth, и мы используем значения истинности (значения, полученные путем проверки, является ли каждый символ заглавными и обратными), уступая Trueв верхнем и Falseнижнем регистре. Тот факт, что логические значения являются подклассами целых чисел в Python, очень удобен для подхода, который использует этот ответ. Портирование подходов Dennis и Jonathan's Jelly привело к получению более 18 байт, поэтому я вполне доволен используемыми здесь специфическими приемами Pyth.




3

J , 36 31 27 байт

-9 байт благодаря FrownyFrog!

(XOR"$32*[:~:/97>])&.(3&u:)

Попробуйте онлайн!

Предыдущее решение было:

J , 36 31 байт

-5 байт благодаря FrownyFrog!

|:@(XOR 32*0~:/@|:97>])&.(3&u:)

Попробуйте онлайн!

Как это работает:

                          (3&u:)  converts the strings to code points
   (                    )&.       then do the following and convert back to chars
                    97>]          check if they are uppercase letters 
             0~:/@|:              transpose and check if the two values are different
          32*                     multiply by 32 (32 if different, 0 otherwise)
      XOR                         xor the code point values with 32 or 0
 |:@                              and transpose

[:Может быть 0 и (22 b.)может быть XOR. &.(3&u:)сохраняет 1 байт.
FrownyFrog

@FrownyFrog Очень хорошие гольфы, спасибо! Ты действительно хорош!
Гален Иванов


@FrownyFrog Ух ты! Можете ли вы объяснить использование "и $? Благодарность!
Гален Иванов

Ввод сделан с ,:, есть 2 строки на левой стороне. Нам нужно, "(1)но "$тоже работает, потому что это означает "1 _. $ b.0дает ранг $ (монадическое, диадическое левое, диадическое правое).
FrownyFrog

3

R , 118 94 75 72 байта

m=sapply(scan(,""),utf8ToInt);w=m>96;apply(m-32*(w-w[,2:1]),2,intToUtf8)

Попробуйте онлайн!

Там должно быть гораздо лучше в гольф. -43 байта благодаря Джузеппе, который указал мне на решение MATL Луиса Мендо. Ссылка TIO содержит функциональное решение для того же количества байтов.

m=sapply(a<-scan(,""),utf8ToInt)    # Turns input into a matrix of bytecode (2 columns)
w=m>96                              # Predicate : which chars are lower?
apply(m-32*(w-w[,2:1]),2,intToUtf8) # -32*w turns the string to UPPER
                                    # +32*w[,2:1] swaps capitalization
                                    # intToUtf8 turns bytecode to strings

Бонус: выход является именованным вектором, имена которого являются исходными входными строками!


Вы должны быть в состоянии бросить, a<-так как вы не используете aгде-либо еще.
Джузеппе

@ Giuseppe Вы читали мои мысли? ;)
JayCe

3

машинный код x86-64, 14 байт

Вызывается из C (соглашение о вызовах SysV x86-64) с этим прототипом:

void casexchg(char *rdi, char *rsi);  // modify both strings in place

Версия с явной длиной с длиной в rcxимеет тот же размер. void casexchg(char *rdi, char *rsi, int dummy, size_t len);


При этом используется тот же алгоритм обмена битами, что и в ответах C и Java: если обе буквы имеют одинаковый регистр, их не нужно менять. Если они противоположны, они оба должны измениться.

Используйте XOR, чтобы отличить бит регистра двух строк. mask = (a XOR b) AND 0x200 для одинаковых или 0x20 для разных. a ^= mask; b ^= maskcaseflip обе буквы, если они противоположны (Потому что буквенные коды ASCII для верхнего и нижнего отличаются только в бите 5.)

Листинг NASM (с nasm -felf64 -l/dev/stdout). Используйте, cut -b 26- <casexchg.lst >casexchg.lstчтобы превратить это в то, что вы можете собрать.

   addr    machine
 6         code          global casexchg
 7         bytes         casexchg:
 8                       .loop:
 9 00000000 AC               lodsb                ; al=[rsi] ; rsi++
10 00000001 3207             xor   al, [rdi]
11 00000003 2420             and   al, 0x20       ; 0 if their cases were the same: no flipping needed
12                       
13 00000005 3007             xor   [rdi], al      ; caseflip both iff their cases were opposite
14 00000007 3046FF           xor   [rsi-1], al
15                       
16 0000000A AE               scasb                ; cmp al,[rdi] / inc rdi
17                           ; AL=0 or 0x20.
18                           ; At the terminating 0 in both strings, AL will be 0 so JNE will fall through.
19                           ; 0x20 is ASCII space, which isn't allowed, so AL=0x20 won't cause early exit
20 0000000B 75F3             jne  .loop
21                       ;    loop  .loop            ; caller passes explict length in RCX
22                       
23 0000000D C3               ret

  size = 0xe bytes = 14
24 0000000E 0E           db $ - casexchg_bitdiff

Медленная loopинструкция также 2 байта, так же, как короткая jcc. scasbвсе еще лучший способ увеличить rdiс помощью однобайтовой инструкции. Я думаю , мы могли бы xor al, [rdi]/ stosb. Это будет тот же размер, но, вероятно, быстрее для loopслучая (память src + store дешевле, чем память dst + reload). И все равно установил бы ZF соответственно для случая неявной длины!

Попробуйте онлайн! с _start, который вызывает его на argv [1], argv [2] и использует sys_write для результата





2

QBasic, 133 байта

INPUT a$,b$
FOR i=1TO LEN(a$)
c=ASC(MID$(a$,i,1))
d=ASC(MID$(b$,i,1))
s=32AND(c XOR d)
?CHR$(c XOR s);
r$=r$+CHR$(d XOR s)
NEXT
?
?r$

Принимает две строки через запятую и выводит результаты через новую строку. Использует алгоритм бит бит из ответа Денниса Желе . Кроме этого, основной трюк с гольфом заключается в том, что первая результирующая строка печатается напрямую, по одному символу за раз, что немного короче, чем сохранение обеих результирующих строк в переменных и печать их вне цикла.


2

JavaScript, 77 74 73 байта

W=>W.map((w,x)=>w.map((c,i)=>W[+!x][i][`to${c>{}?'Low':'Upp'}erCase`]()))

Принимает массив char-массивов, выводит массив char-массивов.

-1 байт ( @Arnauld ): c>'Z'c>{}


1
Вы можете сохранить байт с помощью c>{}.
Арно

1

Сетчатка , 75 байт

^
¶
+`¶(([A-Z])|(.))(.*)¶(([A-Z])|(.))
$#6*$u$1$#7*$l$1¶$4$#2*$u$5$#3*$l$5¶

Попробуйте онлайн! Объяснение: Символы новой строки используются в качестве маркеров, чтобы определить, какая часть строки была обработана. Регулярное выражение пытается найти совпадение с заглавными буквами или с ошибкой в ​​любых символах. Если заглавная буква совпадает, то другой символ пишется в верхнем регистре, в противном случае он в нижнем регистре и наоборот, в то время как переводы строки переносятся на следующий символ.



1

Сборка (nasm, x64, Linux) , 25 байтов (источник 123 байта)

Шестнадцатеричные байты:

0x88, 0xE6, 0x30, 0xC6, 0x80, 0xE6, 0x20, 0x88
0xF2, 0x66, 0x31, 0xD0, 0x88, 0x26, 0xAA, 0xAC
0x8A, 0x26, 0x8A, 0x07, 0x08, 0xE4, 0x75, 0xE8, 0xC3

Точка входа в функцию at a, где строки передаются с использованием RDIи RSI.

b:MOV DH,AH
XOR DH,AL
AND DH,32
MOV DL,DH
XOR AX,DX
MOV [RSI],AH
STOSB
LODSB
a:MOV AH,[RSI]
MOV AL,[RDI]
OR AH,AH
JNZ b
RET

Попробуйте онлайн!


Я только что понял, что вы играете в исходники asm, а не размер машинного кода. Это обычно веселее, потому что иногда полезно в реальной жизни. (При прочих равных, чем меньше, тем лучше для внешней и кэш-плотности кэша.) Советы по игре в гольф в машинном коде x86 / x64 .
Питер Кордес

@PeterCordes Спасибо за совет. Я добавил шестнадцатеричные байты. Моя сборка немного ржавая (в последний раз мне пришлось написать небольшой драйвер устройства для DOS 3.3!), Но я думаю, что я получил большую часть оптимизаций.
ErikF

Да, это выглядит довольно хорошо. Интересные частичные регистрационные хаки. and al,32только 2 байта, используя специальную кодировку AL, imm8, которую имеет большинство инструкций ALU. Вы можете потребовать длину строки в RCX и использовать loop. Я собирался сказать, что вы должны это сделать, test ah,ahпотому что это более эффективно, чемor при одинаковой длине, но оно длиннее в исходном коде asm, поэтому старая идиома на самом деле имеет свои преимущества для игры в ас-исходный код: P
Peter Cordes

Используя целевую память xor и более плотную структуру цикла, моя версия заняла 14 байт машинного кода x86-64 . То же самое для количества строк неявной или явной длины. Его источник NASM, вероятно, тоже может быть заполнен короче, чем 123 байта. Я не уверен, что будет работать быстрее на современном процессоре, таком как Skylake или Ryzen (Ryzen не будет иметь никаких дополнительных затрат для слияния DH при чтении DX, но SKL потребуется дополнительный цикл для вставки слияния uop.)
Питер Кордес


0

Древесный уголь , 17 байт

Eθ⭆ι⎇№α§§θ¬κμ↥λ↧λ

Попробуйте онлайн! Ссылка на подробную версию кода. Принимает ввод как массив из двух строк. Объяснение:

 θ                  Input array
E                   Map over strings
   ι                Current string
  ⭆                 Map over characters
         θ          Input array
           κ        Outer loop index
          ¬         Logical Not
        §           Index into array
            μ       Inner loop index
       §            Index into array
      α             Uppercase characters
     №              Count number of matches
              λ λ   Current character
             ↥      Uppercase
               ↧    Lowercase
    ⎇               Ternary
                    Implicitly print

0

F #, 120 байтов

Мудак.

open System
let g=Seq.fold2(fun a x y->a+string(x|>if y>'Z'then Char.ToLower else Char.ToUpper))""
let b f s=g f s,g s f

Попробуйте онлайн!

Функция gпринимает две строки в качестве параметров. Seq.fold2применяет функцию с аккумулятором ( a) к каждому элементу ( xи y) в строках. Изначально aэто пустая строка, и она добавляет к ней преобразованный символ в каждой итерации.

bэто основная функция. Сначала он преобразуется по fотношению к s, а затем преобразует по sотношению к f. Затем он возвращает кортеж с обоими значениями.



0

Рубин , 74 69 байт

->a,b{a.zip(b).map{|x|x.one?{|y|y>?_}?x.map(&:swapcase):x}.transpose}

Попробуйте онлайн!

Ввод и вывод - это массивы символов, поэтому нижний колонтитул выполняет преобразования строк и обратно.

Я еще не уверен, является ли это хорошим подходом к проблеме, но этот вызов определенно выглядит как хороший сценарий использования swapcaseметода.


0

PHP 4.1.2 , 40 байт

Замените пару кавычек байтом A0 (в ISO-8859-1 или Windows-1252 это NBSP), чтобы отобразить счетчик байтов, затем запустите из веб-браузера (или из командной строки), предоставив строки в виде аргументы строки запроса (или переменные окружения) aи b.

<?=$a^$c=($a^$b)&str_pad("",2e5),_,$b^$c;

В этой версии PHP, register_globals включен по умолчанию, поэтому строки будут автоматически назначаться переменным $aи $b. Увеличьте значение 2e5(200000) при необходимости.

PHP 7.1+, 58 байт

Запустите в командной строке, используя php -r 'code here' string1 string2:

[,$a,$b]=$argv;echo("$b $a"^$a.=" $b")&str_pad("",3e5)^$a;

Значение 3e5 (300000) выбрано превышающим (MAX_ARG_STRLEN * 2 + 1) в большинстве систем Linux (в частности, x86 и других архитектурах, для которых PAGE_SIZE - 4096, а MAX_ARG_STRLEN - 131072), чтобы избежать проблем с любой возможной входной строкой. Увеличьте при необходимости.

Попробуйте онлайн!


0

Stax , 10 байт

▌Ö↑o╓→ì]yç

Запустите и отладьте его

Вот незагрязненное представление той же программы, чтобы показать, как она работает.

        Example
        ["Ab", "cd"]                    
:)      [["Ab", "cd"], ["cd", "Ab"]]    Get all rotations of input
m       ["cd", "Ab"]                    For each, run the rest of program; print result
  M     ["cA", "db"]                    Transpose matrix
  {     "cA"                            Begin block for mapping to result
    B   "A" 99                          "Pop" first element from string array; leave the rest
    96> "A" 1                           Is the character code > 96?
    :c  "a"                             Set case of string; 0 -> upper,  1 -> lower
  m     "ab"                            Perform the map using the block

Запустите этот


0

Crystal , 108 байт

def f(a,b)r=s=""
a.zip(b){|x,y|r+="`"<x<"{"?y.downcase: y.upcase
s+="`"<y<"{"?x.downcase: x.upcase}
{s,r}end

Попробуйте онлайн!

Как это работает?

def f(a, b)                       # Strings as list of characters
r = s = ""                        # Strings buffers initialization
a.zip(b) do |x, y|                # Join two arrays to paired tuples and iterate
r+="`"<x<"{"?y.downcase: y.upcase # Check if character is downcase using triple
s+="`"<y<"{"?x.downcase: x.upcase # comparison and ascii table. Then apply it to
end                               # the other character using String methods
{s, r}                            # Return two new strings using a tuple
end                               # PS: Tuples are inmutable structures in Crystal
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.