在单词2上签名!


17

在单词2上签名!

不久前,我发布了一个名为Sign that word的挑战。在挑战中,您必须找到单词的签名,即按顺序排列的字母(例如,thisis 的签名hist)。现在,这个挑战做得很好,但是存在一个关键问题:这太简单了(请参阅GolfScript答案)。因此,我也发布了类似的挑战,但是规则更多,PPCG用户在上一个难题的评论中建议了大多数规则。所以,我们开始!

规则

  1. 您的程序必须接受输入,然后将签名输出到STDOUT或任何您使用的语言的等效语言。
  2. 您不允许使用内置的排序功能,因此不允许使用$GolfScript之类的东西。
  3. 必须支持大写字母-您的程序必须将大写和小写字母组合在一起。因此,的签名HelloeHllo,而不是Hello第一个版本的GolfScript回答所给的签名。
  4. 您的程序必须有一个免费的解释器/编译器,您应该链接到该解释器/编译器。

计分

您的分数就是字节数。最低字节数获胜。

排行榜

这是一个堆栈片段,用于按语言生成常规排行榜和获胜者概述。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

# Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以通过打败旧分数保持标题。例如:

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


2
是否必须订购小写和大写?例如,对于ThHihs,我们可以输出hHhist还是我们要输出hhHistHhhist
致命

2
@Kslkgh我不想安装GolfScript解释器来理解该问题。要求应在问题本身中明确说明。
feersum

1
@feersum不需要。答案中有指向在线口译员的链接。但我会更清楚地说明。

8
正确处理Unicode中的小写/大写是令人恐惧的,因此,这个问题是否自愿限于ASCII字母:[a-zA-Z]?
Matthieu M.

3
您忘记了“查看此GolfScript答案”后的括号。xkcd.com/859
nyuszika7h,2015年

Answers:


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

Haskell,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 2015年

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
伟大的编程语言的标志:所有命令均使用法语,官方网站上显示“发送徽标,但看起来很笨”。
Alex A.

@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的评论)

Edit Too过去常常用逗号组成单个表达式,以避免“返回”。这里需要输出,因此我可以使用简单的方法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(''))

这与“ golfed”相去甚远,但我现在有点忙,只是对其进行了编辑以删除排序。


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

Python 3、64

Sp3000的答案进行了小幅改进,它使用了迭代字符索引的想法,并且对于每个索引,都对输入进行了迭代以获取匹配大小写的字符。

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

这使用一个循环,循环输入26次。分隔符~用于知道何时转到下一个字符索引c。为了确定字符是否dc大小写匹配,将的位值的最后五位与d进行异或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长度数组中是否存在char(用于包括AZ和az范围),然后对其进行迭代以获取非零条目。
效率低下,但比强行强制执行效率更高(但:()更长)。

测试它

<< HelloWorldhi
>> deHhillloorW

当我与运行它时HelloWorldhi,我会得到['d', 'e', 'H', 'h', 'i', 'lll', 'oo', 'r', 'W']
Blue

@muddyfish糟糕!在尝试一些操作时,我粘贴了错误的代码。谢谢你:)
Kamehameha

您都不需要if l[j]
蓝色

@muddyfish不错,它们变成空字符串(在joined 时被删除)。-8个字节。谢谢:)
Kamehameha

1
@SirParselot是的,但这似乎就像修改问题中给出的输入一样,所以没有那样做
Kamehameha 2015年

3

PHP,275270字节

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


任何建议,我们将不胜感激。


大写字母不起作用...需要解决此问题。
jrenk

修复了当输入具有大写字母时代码也可以工作的问题。
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字节,想象一下!谢谢@毛里斯。


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')&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中调用Julia,它将显示为字符串输出。如果必须打印到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@_

只是一个简单的冒泡排序。使用-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

两个注意事项:

  • 空间是必要的;否则,序列AZO将扫描为A ZO而不是AZ O
  • 该程序不输出尾随换行符。要添加一个,x在代码的末尾添加一个(从而在循环完成后打印一个空字符串)。

样品运行(使用x变体):

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.