Подпишите это слово 2!


17

Подпишите это слово 2!

Не так давно я отправил вызов под названием « Подпиши это слово»! , В задании вы должны найти подпись слова, то есть буквы, расположенные по порядку (например, подпись thisis hist). Теперь, этот вызов прошел хорошо, но была одна ключевая проблема: это было слишком легко (см. Ответ GolfScript ). Итак, я опубликовал аналогичный вызов, но с большим количеством правил, большинство из которых были предложены пользователями PPCG в комментариях к предыдущей головоломке. Итак, поехали!

правила

  1. Ваша программа должна принять входные данные, а затем вывести подпись в STDOUT или эквивалент на любом языке, который вы используете.
  2. Вы не можете использовать встроенные функции сортировки, поэтому такие вещи, как $в GolfScript, не допускаются.
  3. Должна поддерживаться многозначность - ваша программа должна группировать буквы как в верхнем, так и в нижнем регистре. Таким образом, подпись Hello- это eHlloне то, Helloчто вам дает ответ GolfScript по первой версии.
  4. Для вашей программы должен быть бесплатный интерпретатор / компилятор, на который вы должны ссылаться.

счет

Ваш счет - ваш счетчик байтов. Побеждает младший счетчик байтов.

Leaderboard

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

# Ruby, <s>104</s> <s>101</s> 96 bytes


2
Нужно ли заказывать строчные и прописные буквы? Например, для ThHihs, мы можем вывести hHhistили мы должны вывести hhHistили Hhhist?
Роковая

2
@Kslkgh Я не хочу устанавливать переводчик GolfScript, чтобы понять вопрос. Требования должны быть четко указаны в самом вопросе.
feersum

1
@feersum Тебе не нужно. В ответе есть ссылка на онлайн-переводчика. Но я сделаю это яснее.

8
Правильная обработка строчных и прописных букв в Юникоде пугает, поэтому этот вопрос добровольно ограничен буквами ASCII: [a-zA-Z]?
Матье М.

3
Вы забыли закрыть скобки после "увидеть этот ответ GolfScript". xkcd.com/859
nyuszika7h

Ответы:


11

Pyth, 10 байт

sm@+drd1zG

Попробуйте онлайн: демонстрация

Объяснение:

             implicit: z = input string
 m       G   map each letter (variable d) of the alphabet to:
   +drd1        d + upper(d)
  @     z       filter z for these two letters
s            sum, join to a string

5

Хаскелл, 51

f s=[x|(a,b)<-zip['a'..'z']['A'..],x<-s,x==a||x==b]

zipСоздает список пар символов [('a','A'), ...('z','Z')]. Из-за усечения вторая конечная точка указывать не нужно. Для каждой пары в списке мы берем буквы во входной строке, sкоторые являются одним из двух символов в паре.


5

Python 3, 72 70 байт

s=input()
print("".join(d*(ord(d)&31==c)for c in range(27)for d in s))

Предполагается, что вход состоит только из [a-zA-Z].

(-2 байта благодаря @xnor)


Я думаю , что вы можете сделать "".join(c*b ...)для "".join(c ... if b) того же образом sum(n ... if b)может быть sum(n*b ...).
xnor

Объединение двух циклов в один цикл со стражем и сжатие проверки на равенство: c=1 for d in(input()+'~')*26:print(d[ord(d)&32^c:],end='');c+=d>'z'(67)
xnor

@xnor Я добавил первый совет (спасибо!), но я думаю, что вы должны опубликовать второй
совет

4

GOTO ++, 531 байт

niveaugourou 0
s=ENTRETONTEXTE()
§2 a=LeCaracNumero()&s *(1)
n=*(1)
costaud i=*(2)/&i infeg NombreDeLettres(&s)/i=+*(1)
b=LeCaracNumero()&s &i
c=&b
d=&a
GOTONULPOURLESNULS %4 }&b sup *(96){
c=-*(32)
§4 GOTONULPOURLESNULS %5 }&a sup *(96){
d=-*(32)
§5 GOTONULPOURLESNULS %1 }&c inf &d{
a=&b
n=&i
§1 faiblard
GOTOPRINTDUTEXTE()&a
s=Marijuana()}BOITEAPINGOUINS()}PrendsUnMorceau()&s *(0) &n{ }PrendsUnMorceau()&s }&n+*(1){ *(0){{ «»
GOTONONNULPOURLESNULS %3 }NombreDeLettres(&s) eg *(1){
GOTOPASMALIN %2
§3 GOTOPRINTDUTEXTE()&s

GOTO ++ Страница проекта

Вот немного более читаемая и прокомментированная версия кода (обратите внимание, что GOTOкомментарий начинается с GOTO ++):

niveaugourou 0                                          GOTO Allow every keyword to be used
s=ENTRETONTEXTE()                                       GOTO Read from STDIN
§2 a=LeCaracNumero()&s *(1)                             GOTO Get first char in s
n=*(1)                                                  
costaud i=*(2)/&i infeg NombreDeLettres(&s)/i=+*(1)     GOTO Loop on every char of s
b=LeCaracNumero()&s &i                                  GOTO b = i-th char
c=&b                                            
d=&a
GOTONULPOURLESNULS %4 }&b sup *(96){                    GOTO If b is uppercase, goto §4 
c=-*(32)                                                GOTO Get the uppercase ASCII value of b
§4 GOTONULPOURLESNULS %5 }&a sup *(96){                 GOTO same as above but with a
d=-*(32)                                                
§5 GOTONULPOURLESNULS %1 }&c inf &d{                    GOTO If b is after a in alphabetical order, goto §1 (next loop iteration)
a=&b                                                    GOTO Else replace a by b
n=&i                                                                
§1 faiblard                                             GOTO End loop
GOTOPRINTDUTEXTE()&a                                    GOTO Print the value of a
t=PrendsUnMorceau()&s *(0) &n                           GOTO Get the part of s before a
u=PrendsUnMorceau()&s }&n+*(1){ *(0)                    GOTO Get the part of s after a
e=BOITEAPINGOUINS()&t &u                                GOTO Create an array of penguins containing the two substrings
s=Marijuana()&e «»                                      GOTO Concatenate the penguins in the array
GOTONONNULPOURLESNULS %3 }NombreDeLettres(&s) eg *(1){  GOTO If s is one char long, goto §3
GOTOPASMALIN %2                                         GOTO Else goto §2
§3 GOTOPRINTDUTEXTE()&s                                 GOTO Print the last char

2
Знаки отличного языка программирования: все команды написаны на французском языке, а на официальном сайте написано: «Отправь свой логотип и выглядишь глупо».
Алекс А.

@AlexA. Знак отличного языка программирования: function(arg)и function() argоба действительны. Кроме того, приоритетные скобки есть, } {а не скучные( )
Fatalize

4

Pyth, 15 14 байтов

s*V/LzJ.irG1GJ

Спасибо за isaacg для удаления 1 байта.

Я пока мало знаю о Пите, так что, возможно, это не очень удачно.

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


Один легкий гольф: sтакой же, как jkв списке строк.
Исаак

4

JavaScript (ES6), 71 74

Ограничено A-Za-z (см. Комментарий @Matthieu M)

Edit Слишком часто используется для составления одного выражения с запятыми, чтобы избежать возврата. Здесь требуется вывод, поэтому я могу использовать простую forи забыть о запятых.

При использовании массива количество байтов равно 73, но это больше не является допустимым EcmaScript 6

Обычное примечание: тестирование запуска сниппета в любом браузере, совместимом с EcmaScript 6 (особенно не Chrome и не MSIE. Я тестировал на Firefox, Safari 9 мог пойти)

f=w=>{v=[];for(c of w)v[n=parseInt(c,36)]=(v[n]||'')+c;alert(v.join``)}
<input id=I value='Hellzapoppin'><button onclick=f(I.value)>-></button>


4

Javascript, 112 194 байта

r=[];t=[];a=s.split('').map(function(x){t[i=parseInt(x,36)]?t[i].push(x):t[i]=[x];return i;});while(l=a.length)r[l-1]=t[a.splice(a.indexOf(Math.max.apply({},a)),1)].pop();console.log(r.join(''))

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


1
@frikinside Хотя это может не помочь этому решению, поскольку сортировка запрещена, функции стрелок Javascript ES6 могут помочь сократить это. (Пока не все браузеры поддерживают ES6, попробуйте Firefox). Может быть, это поможет вашим будущим решениям, хотя! :) Пример того, как это может выглядеть:console.log(input.split('').sort((a,b)=>a.toLowerCase().localeCompare(b.toLowerCase())).join(''))
jrich

@UndefinedFunction На самом деле я предпочитаю использовать простой javascript специально для «испытаний», но большое спасибо за хорошее предложение!
Фрикинсайд

@ edc65 На самом деле я знал об этом в предыдущем комментарии (как вы сказали), и я не забыл об этом, у меня не было времени до сих пор.
Фрикинсайд

4

Python 3, 64

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

c=1
for d in(input__+'~')*26:print(end=d[ord(d)&31^c:]);c+=d>'z'

При этом используется один цикл, проходящий через вход 26 раз. Разделитель ~используется, чтобы знать, когда перейти к следующему символьному индексу c. В зависимости от того, dсоответствует ли символ значению с cточностью до регистра, последние пять битов битового значения записываются с помощью dx c, где 0 обозначает совпадение.

Затем символ dпечатается точно, когда результат 0, с пустой строкой в ​​противном случае.


3

Python 2.7, 114 106 байт

l=[0]*123
for e in raw_input():l[ord(e)]+=1
print''.join(chr(j)*l[j]for i in range(26)for j in(i+65,i+97))

Регистрирует присутствие символа в массиве длиной 123 (для включения диапазонов AZ и az), а затем перебирает его, чтобы получить ненулевые записи.
Неэффективно, но более эффективно, чем грубое принуждение (но дольше :().

Тестирование

<< HelloWorldhi
>> deHhillloorW

Когда я запускаю его HelloWorldhi, я получаю['d', 'e', 'H', 'h', 'i', 'lll', 'oo', 'r', 'W']
Blue

@muddyfish ой мой плохой. Я вставил неправильный код, пытаясь сделать несколько вещей. Спасибо за это :)
Kamehameha

Вам не нужно if l[j]ни того, ни другого.
Голубой

@muddyfish Хорошо, они становятся пустыми строками (и удаляются при редактировании join). -8 байт. Благодарность :)
Камехамеха

1
@SirParselot Да, но это похоже на изменение входных данных, как указано в вопросе, поэтому не делайте этого
Kamehameha

3

PHP, 275 270 байт

<?php
for($i=65;$i<123;$i++){$v[$i]=chr($i);}foreach(str_split($argv[1])as$c){$a=array_search($c,$v);if($a<97){$p[]=($a+32);$z[]=$a;}else{$p[]=$a;}}foreach($p as$chr){$m=min($p);if($z[0]+32==$m){echo chr($m-32);unset($z[0]);}else{echo chr($m);}unset($p[array_search($m,$p)]);}


Объяснение:
Код генерирует массив с каждой буквой в алфавите, который имеет значение ASCII в качестве ключа массива. После этого код генерирует новый массив, который содержит значения ASCII входных данных. Затем самое низкое значение распечатывается и удаляется.

Использование:
Вызов сценария с аргументом: php -d error_reporting=0 script.php Hello

Ungolfed Версия:

<?php
$input = $argv[1];
$valueArray = [];
for($i=65;$i<123;$i++) {
    $valueArray[$i] = chr($i);
}
$new = str_split($input);
foreach($new as $char) {
    if(array_search($char, $valueArray)<97) {
        $newArray[] = (array_search($char, $valueArray)+32);
        $checkArray[] = array_search($char, $valueArray);
    } else {
        $newArray[] = array_search($char, $valueArray);
    }
}
foreach($newArray as $chr) {
    if($checkArray[0]+32 == min($newArray)) {
        $string .= chr(min($newArray)-32);
        unset($checkArray[0]);
    } else {
        $string .= chr(min($newArray));
    }
    $key = array_search(min($newArray), $newArray);
    unset($newArray[$key]);
}

echo $string;


Любые советы с благодарностью.


Прописные буквы не работают ... нужно это исправить.
Джренк

Исправлено, что код также работает, когда ввод имеет заглавные буквы.
Джренк

3

Haskell, 83 53 байта

import Data.Char
f y=[c|x<-[' '..],c<-y,toLower c==x]

Использование: f "HelloWorldhi"-> "deHhillloorW".

Как это работает: пусть yбудет входной строкой

[ |x<-[' '..]                  ]  -- for every x from Space to the last Unicode character
             ,c<-y                -- loop through all character c from the input string
 c                ,toLower c==x   -- and keep those where the lowercase version equals x

Редактировать: 30 байтов сохранено, представьте это! Спасибо @Mauris.


2
Почему не просто import Data.Char;f y=[c|x<-[' '..],c<-y,toLower c==x](53 байта)? (Это займет некоторое время, чтобы прекратить, потому что length [' '..] == 1114080- но это конечно.)
Линн

1
@Mauris: Ух ты! Кстати: 8,5 с на 4-летнем ноутбуке не слишком долго.
Ними

3

Python 3, 61 байт

Новый ответ для другой техники!

z=['']*42
for c in input():z[ord(c)&31]+=c
print(*z,sep='')

Отмечая то ord('a')&31==ord('A')&31и это ord('z')&31==ord('Z')&31, мы можем просто создать массив пустых строк и для каждого символа добавить его в индекс массива своего значения ASCII &31. Когда вы распечатаете его, он будет отсортирован.

Ограничено для ввода a-zA-Z.


2

Python 3, 97 92 байта

from itertools import*;print(*min(permutations(input()),key=lambda z:str(z).lower()),sep='')

Лучший способ сортировки - это сгенерировать все перестановки, а затем выбрать минимум, который просто сортируется :)

Строки в нижнем регистре перед сравнением должны соответствовать правилам учета регистра.

Предупреждение: может быть очень медленным с большими строками.

Переводчик находится здесь .


2

Python 3, 118 байт

i=input();i,x=map(list,(i,i.lower()))
while x:q=min(x);x.remove(q);q=[q.upper(),q][q in i];i.remove(q);print(q,end="")

Может быть в гольф намного короче, я знаю


Вы можете заменить if q not in i:на if~-(q in i):.
PurkkaKoodari

Я делаю, потому что я вызываю .remove()функцию на нем.
Голубой

2

Powershell, 164 байта

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

Код:

$a=[char[]]($args[0]);For($u=1;$u-lt$a.Count;$u++){$n=$a[$u];$l=$u;while(($l-gt0)-and((""+$a[$l-1]).CompareTo(""+$n)-gt0)){$a[$l]=$a[$l-1];$l--}$a[$l]=$n};$a-join''

Использование:

PS C:\scripts> .\sign-word-2.ps1 tTHhis
hHistT

Расширено и объяснено:

$a=[char[]]($args[0])               # Takes command-line argument, recasts as char array
For($u=1;$u-lt$a.Count;$u++){       # Performs a quick-n-dirty insertion sort
  $n=$a[$u]
  $l=$u
  while(($l-gt0)-and((""+$a[$l-1]).CompareTo(""+$n)-gt0)){
  # Ugly, ugly code here. String.CompareTo(String) is case-insensitive, but
  # because we cast as a char[], Char.CompareTo(Char) is case-sensitive ...
  # So, need to do an on-the-fly re-casting as a string with ""+
    $a[$l]=$a[$l-1]
    $l--
  }
  $a[$l]=$n
}
$a-join''             # Without the -join'', it would print out the chars with a space between

2

Юлия, 61 байт

f=s->s>""?(k=indmax([s...]%32);f(s[k+1:end]s[1:k-1])s[k:k]):s

Джулия отобразит его как строковый вывод, если вы вызовете его в REPL. Если он должен распечатать в STDOUT, то ему нужно 78 байтов:

x->(f=s->s>""?(k=indmax([s...]%32);f(s[k+1:end]s[1:k-1])s[k:k]):s;print(f(x)))

Переводчик для Юлии можно найти здесь . Еще один, в который я уже поместил некоторый код, находится здесь . Обратите внимание, что со вторым вам нужно будет сделать терминал (внизу) видимым, перетаскивая границу вверх. Нажатие «выполнить» заставит его работать в терминале в обычной командной строке (и, следовательно, не будет отображать вывод, если он вызывается без println). В качестве альтернативы, вы можете просто набрать juliaв самом терминале, а затем обрабатывать все внутри REPL, который появится.

И для некоторого дополнительного удовольствия, вот некоторые другие реализации

Сортировка гномов (83 байта):

s->(for m=2:endof(s),n=m:-1:2 s[n]%32<s[n-1]%32&&(s=s[[1:n-2,n,n-1,n+1:end]])end;s)

Мой собственный алгоритм сортировки (84 байта):

s->(k=1;while length(k)>0 k=find(diff([s...]%32).<0);s=s[setdiff(1:end,k)]s[k]end;s)

2

Scala, 82 байта

print((""/:args(0)){case(s,c)=>val(a,b)=s.span(h=>{if(h<97)32 else 0}+h<c);a+c+b})

из командной строки:

$ scala -e 'print((""/:args(0)){case(s,c)=>val(a,b)=s.span(h=>{if(h<97)32 else 0}+h<c);a+c+b})' Hello
eHllo

Вероятно, можно немного продвинуться дальше ... просто внедряя сортировку вставкой с использованием Fold.


2

машинный код x86, 51 42 байта

00000000  b3 82 89 da 8b 07 80 fc  0d 74 12 b9 20 20 09 c1  |.........t..  ..|
00000010  38 e9 7e 06 86 c4 89 07  31 d2 43 eb e7 85 d2 74  |8.~.....1.C....t|
00000020  df c6 47 01 24 b4 09 cd  21 c3                    |..G.$...!.|
0000002a

Пузырьковая сортировка, с некоторыми трюками повторного использования в регистре, чтобы сбрить байты здесь и там; в .COM файл работает в DOSBox, получает входные данные из командной строки и выводит в стандартный вывод.

образец сессии

Комментируемая сборка:

    org 100h

section .text

start:
    ; bubble sort - external loop
ext:
    ; start from the first character (assume bh=0, true on every DOS)
    mov bl,82h
    ; "not-swapped" flag - 82h => no swaps in current iteration;
    ; 0 => a swap happened (the 82h will come in handy later)
    mov dx,bx
    ; bubble sort - internal loop
int:
    ; read 2 characters at time in the full ax
    mov ax,word[bx]   ; al     ah
                      ; ^[bx]  ^[bx+1]
    ; check if we are at the end (the command line is CR terminated)
    cmp ah,0dh
    je skip
    ; make uppercase in cx
    mov cx,2020h
    or cx,ax
    ; compare
    cmp cl,ch
    jle next
    ; wrong order - swap and rewrite
    xchg al,ah
    mov word[bx],ax
    ; mark that we did a swap
    xor dx,dx
next:
    ; next character
    inc bx
    jmp int
skip:
    ; loop as far as we swapped something
    test dx,dx
    jz ext
end:
    ; $-terminate the string
    mov byte[bx+1],'$'
    ; print
    ; dx already contains the location of the string, since that's the
    ; flag value we used for "no swaps"
    mov ah,9
    int 21h
    ret


1

Perl, 88 байт

@_=/./g;a:{for(0..@_-2){@_[$_,$_+1]=@_[$_+1,$_],redo a if uc$_[$_]gt uc$_[$_+1]}}print@_

Просто простая Bubble Sort. Вызовите с опцией -n, чтобы передать текст.

например:

echo "tThHiIsS" | perl -n sort2.pl

Выход:

hHiIsStT

1

PHP, 106 байт

Код:

$c=count_chars($argv[1]);$r=str_repeat;for($i=64;++$i<91;)echo$r(chr($i),$c[$i]),$r(chr($i+32),$c[$i+32]);

В коде нет ничего особенного; count_chars()создает массив, индексированный кодами ASCII, который содержит количество вхождений для каждого символа ASCII. Остальное - скучная итерация по этому массиву.

Пример исполнения:

$ php -d error_reporting=0 sign.php qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKasdfJHGFDSAZXCVBNM
AaaBbCcDddEeFffGgHhIiJjKkLlMmNnOoPpQqRrSssTtUuVvWwXxYyZz

Дополнительный байт можно сохранить с помощью PHP 7: заменить $c[$i]на ($c=count_chars($argv[1]))[$i]и удалить присвоение $cиз начала программы.


1

Haskell, 74 байта

l=(`mod`32).fromEnum
f=foldr(#)""
e#[]=[e]
e#a@(h:t)|l e<l h=e:a|1<2=h:e#t

Полностью отличается от моего другого ответа . На этот раз это простая вставка.


1

Пип, 18 14 байт

GitHub хранилище для Pip

Кажется, что нет конкуренции с Пифом, но это довольно респектабельно.

FcAZ OcQUC_FIa

Работает только на строки, содержащие a-zA-Z. Для каждой буквы алфавита используется операция фильтра для извлечения букв из входной строки, которые равны этой букве без учета регистра:

                    a <- cmdline arg, AZ <- string containing uppercase alphabet (implicit)
FcAZ                For each character c in AZ:
           FIa      Filter characters of a on the following lambda function:
      UC_           Uppercase of character...
         Qc         ... is equal to c
     O              Output the resulting list, joined on empty string by default

Две заметки:

  • Пространство необходимо; в противном случае последовательность AZOбудет сканироваться как A ZOвместо AZ O;
  • Программа не выводит завершающий перевод строки. Чтобы добавить его, поместите xв конце кода (таким образом, печатая пустую строку после завершения цикла).

Пробный прогон (с использованием xварианта):

dlosc@dlosc:~/pip$ pip -e "FcAZ OcQUC_FIax" "HelLo wOrld"
deHlLloOrw

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.