Підпишіть це слово 2!


17

Підпишіть це слово 2!

Не так давно я опублікував виклик під назвою Підписати це слово! . У виклику ви повинні знайти підпис слова, яке є порядками букв (наприклад, Підпис thisє hist). Тоді цей виклик пройшов досить добре, але виникло одне ключове питання: це було НАЙЧАЛЬНО легко (див. Відповідь GolfScript ). Отже, я розмістив подібний виклик, але з більшою кількістю правил, більшість із яких запропоновано користувачами PPCG у коментарях до попередньої головоломки. Отже, ось ми йдемо!

Правила

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

Оцінка балів

Ваш рахунок - це ваш байт. Виграє найменший байт.

Таблиця лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# 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
Правильне поводження з нижнього та верхнього регістру в Unicode є страшним, тому це питання добровільно обмежується літерами 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 Я додав першу пораду (спасибі!), але я думаю, ви повинні опублікувати другу як окрему відповідь :)
Sp3000

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 байта.

Я ще не знаю багато про Pyth, тому це може бути не в гольфі.

Спробуйте тут.


Один легкий гольф: sтакий самий, як jkу списку рядків.
isaacg

4

JavaScript (ES6), 71 74

Обмежено A-Za-z (див. Коментар @Matthieu M)

Редагувати Занадто використовується для складання одного виразу комами, щоб уникнути "повернення". Тут потрібен вихід, тому я можу використовувати простий 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 спеціально, для "виклику", але дуже багато для приємної пропозиції!
frikinside

@ edc65 насправді я знав про це в попередньому коментарі (як ти сказав), і я цього не забув, я не мав часу до цього часу.
frikinside

4

Пітон 3, 64

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

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

Для цього використовується один цикл, провівши через вхід 26 разів. Розділювач ~використовується, щоб знати, коли потрібно перейти до наступного індексу символів c. Незалежно від dзначення відповідності символів залежно cвід регістру, останні п’ять біт бітового значення dxor-ed з c0, що вказує на відповідність.

Потім символ 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 байт. Дякую :)
Kamehameha

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 Version:

<?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;


Будь-які поради високо цінуються.


Великі літери не працюють ... потрібно це виправити.
jrenk

Виправлено, що код також працює, коли в Input є великі літери.
jrenk

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: Нічого собі! Btw: 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

Джулія відобразить його як рядковий вихід, якщо ви зателефонуєте у відповідь. Якщо він має роздрукувати в 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)))

Перекладача Юлії можна знайти тут . Ще один, до якого я вже вклав якийсь код, є тут . Зверніть увагу, що з другим вам потрібно зробити термінал (внизу) видимим, перетягуючи межу вгору. Якщо натиснути "Execute", він запустить його в терміналі в звичайному командному рядку (і, таким чином, не буде показувати вихід, якщо викликається без println). Крім того, ви можете просто ввести juliaсам термінал, а потім обробити все, що знаходиться в системі REPL, що з'явиться.

І для трохи додаткової забави, ось кілька інших реалізацій

Сортування Gnome (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

напевно, можна пограти трохи далі ... просто реалізуючи сортування вставки, використовуючи складку.


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, отримує вхідні дані з командного рядка і виводить в стандартний висновок.

sample session

Коментована збірка:

    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@_

Просто простий сорт бульбашок. Для передачі тексту зателефонуйте з опцією -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

Здається, немає конкурентів з Pyth, але це досить респектабельно.

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в кінці коду (тим самим друкуючи порожній рядок після завершення циклу).

Sample run (using the x variant):

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

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