その言葉にサイン2!


17

その言葉にサイン2!

その少し前に、私はその言葉に署名というチャレンジを投稿しました。課題では、順番に入れ文字(の例えば署名である単語の署名、見つけなければならないthisですがhist)。さて、そのチャレンジは非常にうまくいきましたが、重要な問題が1つありました。それはとても簡単でした(GolfScriptの回答を参照)。そのため、同様の課題を投稿しましたが、より多くのルールがあり、そのほとんどは前のパズルのコメントでPPCGユーザーによって提案されています。だから、ここに行きます!

ルール

  1. プログラムは入力を受け取り、使用する言語に関係なくSTDOUTまたは同等のものに署名を出力する必要があります。
  2. 組み込みのソート関数を使用することは許可されていないため$、GolfScriptのようなものは許可されていません。
  3. マルチケースをサポートする必要があります-プログラムは大文字と小文字の両方の文字をグループ化する必要があります。したがって、の署名は、最初のバージョンのGolfScript回答で指定されたとおりでHelloeHlloありませんHello
  4. プログラム用の無料のインタープリター/コンパイラーが必要です。リンクする必要があります。

得点

スコアはバイトカウントです。最も少ないバイト数が優先されます。

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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


2
小文字と大文字を注文する必要がありますか?たとえば、の場合ThHihs、出力できるかhHhist、出力するhhHist必要がありHhhistますか?
15

2
@Kslkgh質問を理解するためにGolfScriptインタープリターをインストールしたくありません。要件は質問自体で明確に指定する必要があります。
feersum

1
@feersumする必要はありません。オンライン通訳への回答にリンクがあります。しかし、私はそれをより明確にします。

8
Unicodeで小文字/大文字を正しく処理するのは怖いので、この質問は自主的にASCII文字に限定されています:[a-zA-Z]?
マチューM.

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')]。切り捨てのため、2番目のエンドポイントを指定する必要はありません。リスト内の各ペアについて、ペア内sの2つの文字のいずれかである入力文字列の文字を使用します。


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]

(@xnorのおかげで2バイト)


私はあなたが行うことができると思う"".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最初のヒントを追加しました(ありがとう!)が、別の回答として2番目のヒントを投稿する必要があると思います:)
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 ++プロジェクトページ

以下は、コードのより読みやすくコメント付きのバージョンです(GOTOGOTO ++でコメントを開始することに注意してください):

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
優れたプログラミング言語のマーク:すべてのコマンドはフランス語であり、公式ウェブサイトには「ロゴを送信してください」と書かれています。
アレックスA.

@AlexA。優れたプログラミング言語のマーク:function(arg)そしてfunction() arg両方とも有効です。また、優先順位のブラケットは} {、退屈ではありません( )
致命的

4

Pyth、 15 14バイト

s*V/LzJ.irG1GJ

1バイトを削除してくれたisaacgに感謝します。

私はまだPythについてあまり知らないので、これはうまくゴルフされないかもしれません。

ここで試してみてください。


1つの簡単なゴルフ:文字列のリストsと同じjkです。
isaacg

4

JavaScript(ES6)、71 74

A-Za-zに限定(@Matthieu Mのコメントを参照)

「戻り」を回避するために、カンマを使用して単一の式を作成するために使用される編集が多すぎます。ここでは出力が必要なので、単純なものforを使用してコンマを忘れることができます。

配列内包表記を使用すると、バイトカウントは73になりますが、これは有効なEcmaScript 6ではなくなりました

通常のメモ:EcmaScript 6準拠のブラウザーでスニペットを実行してテストします(特にMSIEではなくChromeを使用します。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は実際、以前のコメント(uが言ったように)でそれを認識していました。それを忘れていませんでした。今まで時間がありませんでした。
frikinside

4

Python 3、64

Sp3000's answerの小さな改善。これは、文字インデックスの反復処理のアイデアを使用し、それぞれに対して、大文字と小文字が一致する文字を取得するために入力を反復処理します。

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

これは、入力を26回ループする単一のループを使用します。セパレータ~は、次の文字インデックスに移動するタイミングを知るために使用されますc。文字が大文字と小文字のd値に一致するかどうかに応じてc、ビット値の最後の5ビットdはxor-edで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範囲の両方を含む)にcharの存在を記録し、それを反復処理してゼロ以外のエントリを取得します。
効率的ではありませんが、ブルートフォースよりも効率的です(ただし、より長い:()。

それをテストする

<< HelloWorldhi
>> deHhillloorW

で実行するとHelloWorldhi、次のようになります['d', 'e', 'H', 'h', 'i', 'lll', 'oo', 'r', 'W']
-Blue

@muddyfishおっと。いくつかのことを試しているときに、間違ったコードを貼り付けました。それをありがとう:)
カメハメハ

if l[j]どちらも必要ありません。
ブルー

@muddyfishニース、それらは空の文字列になります(join編集時に削除されます)。-8バイト。ありがとう:)
カメハメハ

1
@SirParselotええ、しかしそれは質問で与えられたように入力を変更するように思えたので、それをしませんでした
カメハメハ

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値が配列キーとして含まれています。その後、コードは入力のASC​​II値を含む新しい配列を生成します。次に、最も低い値が出力され、削除されます。

使用法:
引数を指定してスクリプトを呼び出します: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;


アドバイスは大歓迎です。


大文字が機能していません...これを修正する必要があります。
-jrenk

入力に大文字が含まれている場合にもコードが機能するように修正しました。
-jrenk

3

Haskell、83 53バイト

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

使用法:f "HelloWorldhi"-> "deHhillloorW"

仕組み:letを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、それは有限だからです。)
Lynn

1
@モーリス:すごい!ところで:4歳のラップトップで8.5秒は長すぎません。
-nimi

3

Python 3、61バイト

別のテクニックの新しい答え!

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

それに注目しord('a')&31==ord('A')&31ord('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

Juliaは、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)))

ジュリアの通訳はこちらにあります。もう1つ、すでにコードを挿入していますが、こちらです。2番目のものでは、境界線を上にドラッグして、ターミナル(下部)を表示する必要があることに注意してください。「実行」をクリックすると、ターミナルで通常のコマンドラインで実行されます(したがって、printlnなしで呼び出された場合、出力は表示されません)。または、juliaターミナル自体に入力するだけで、表示されるREPL内のすべてを処理できます。

ちょっとした楽しみのために、他の実装をいくつか紹介します

Gnome Sort(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で実行、コマンドラインからの入力を受信し、標準出力に出力を印刷します。

サンプルセッション

コメント付きアセンブリ:

    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バイト

PipのGitHubリポジトリ

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

2つのメモ:

  • スペースが必要です。そうでない場合、シーケンスAZOはのA ZO代わりにスキャンしAZ Oます;
  • プログラムは末尾の改行を出力しません。xコードを追加するには、コードの最後にを追加します(ループが完了した後、空の文字列を出力します)。

サンプル実行(xバリアントを使用):

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.