Assine essa palavra 2!

17

Assine essa palavra 2!

Não faz muito tempo, publiquei um desafio chamado Assine essa palavra! . No desafio, você deve encontrar a assinatura da palavra, que são as letras colocadas em ordem (por exemplo, A assinatura de thisé hist). Agora, esse desafio foi muito bem, mas havia uma questão importante: era MUITO fácil (veja a resposta do GolfScript ). Portanto, publiquei um desafio semelhante, mas com mais regras, a maioria das quais foi sugerida pelos usuários do PPCG nos comentários do quebra-cabeça anterior. Aqui vamos nos!

Regras

  1. Seu programa deve receber uma entrada e enviar a assinatura para STDOUT ou equivalente em qualquer idioma que você esteja usando.
  2. Você não tem permissão para usar funções de classificação $internas ; portanto, coisas como no GolfScript não são permitidas.
  3. A multicase deve ser suportada - seu programa deve agrupar letras maiúsculas e minúsculas. Assim, a assinatura do Helloé eHllo, não Hellocomo você é dado pela resposta GolfScript na primeira versão.
  4. Deve haver um interpretador / compilador gratuito para o seu programa, ao qual você deve vincular.

Pontuação

Sua pontuação é sua contagem de bytes. O menor número de bytes vence.

Entre os melhores

Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

# Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

Comunidade
fonte
2
É necessário encomendar letras minúsculas e maiúsculas? Por exemplo, para ThHihs, podemos produzir hHhistou temos que produzir hhHistou Hhhist?
Fatalize
2
@Kslkgh Não desejo instalar um intérprete GolfScript para entender a pergunta. Os requisitos devem ser claramente especificados na própria pergunta.
precisa saber é
11
@feersum Você não precisa. Há um link na resposta para um intérprete online. Mas vou deixar mais claro.
8
O manuseio correto de letras maiúsculas / minúsculas no Unicode é assustador. Portanto, essa questão é voluntariamente limitada a letras ASCII: [a-zA-Z]?
Matthieu M.
3
Você esqueceu de fechar o parêntese depois de "ver esta resposta do GolfScript". xkcd.com/859
nyuszika7h

Respostas:

11

Pitão, 10 bytes

sm@+drd1zG

Experimente online: Demonstração

Explicação:

             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
Jakube
fonte
5

Haskell, 51

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

o zip cria uma lista de pares de caracteres [('a','A'), ...('z','Z')]. Por causa do truncamento, o segundo ponto de extremidade não precisa ser especificado. Para cada par da lista, pegamos as letras na sequência de entrada sque são um dos dois caracteres do par.

xnor
fonte
5

Python 3, 72 70 bytes

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

Assume que a entrada consiste apenas em [a-zA-Z] .

(-2 bytes graças a @xnor)

Sp3000
fonte
Eu acho que você pode fazer "".join(c*b ...)para "".join(c ... if b) o mesmo caminho sum(n ... if b)pode ser sum(n*b ...).
Xnor
Recolhendo os dois loops em um único loop com uma sentinela e compactando a verificação de igualdade: c=1 for d in(input()+'~')*26:print(d[ord(d)&32^c:],end='');c+=d>'z'(67)
xnor
@xnor Eu adicionei a primeira ponta (obrigado!), mas eu acho que você deve postar o segundo como uma resposta em separado :)
SP3000
4

GOTO ++, 531 bytes

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

Página do projeto GOTO ++

Aqui está uma versão ligeiramente mais legível e comentada do código (observe que GOTOinicia um comentário no 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
Fatalizar
fonte
2
Marcas de uma ótima linguagem de programação: todos os comandos são em francês e o site oficial diz "Envie seu logotipo e pareça idiota".
Alex A.
@AlexA. Marca de uma ótima linguagem de programação: function(arg)e function() argambas são válidas. Além disso, os suportes de prioridade são } {e não o chato( )
Fatalize
4

Pitão, 15 14 bytes

s*V/LzJ.irG1GJ

Obrigado por isaacg por remover 1 byte.

Ainda não sei muito sobre Pyth, então isso pode não ser muito bom.

Experimente aqui.

jimmy23013
fonte
Um golfe fácil: sé o mesmo que jkem uma lista de cordas.
Isaacg
4

JavaScript (ES6), 71 74

Limitado a A-Za-z (ver comentário por @Matthieu M)

Editar Muito usado para compor uma única expressão com vírgulas, para evitar 'retorno'. Aqui é necessária uma saída, para que eu possa usar um simples fore esquecer vírgulas.

Usando a compreensão da matriz, a contagem de bytes é 73, mas isso não é mais válido para o EcmaScript 6

Nota habitual: teste de execução do snippet em qualquer navegador compatível com EcmaScript 6 (principalmente o Chrome, não o MSIE. Eu testei no Firefox, o Safari 9 pode ir)

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>

edc65
fonte
4

Javascript, 112 194 bytes

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(''))

Isso está muito longe de "jogar golfe", mas agora estou um pouco ocupado, apenas editado para remover a classificação.

frikinside
fonte
11
@frikinside Embora possa não ajudar nesta solução, uma vez que a classificação não foi permitida, as funções de seta do Javascript ES6 podem ajudar a reduzi-la. (Nem todos os navegadores ainda oferecem suporte ao ES6, tente o Firefox). Talvez isso ajude suas soluções futuras! :) Um exemplo do que pode parecer:console.log(input.split('').sort((a,b)=>a.toLowerCase().localeCompare(b.toLowerCase())).join(''))
jrich
@UndefinedFunction Na verdade, eu escolho usar javascript simples de propósito, para o "desafio", mas muito para a boa sugestão!
Frikinside
@ edc65 na verdade, eu sabia disso em um comentário anterior (como você disse) e não esqueci, não tinha tempo até agora.
Frikinside
4

Python 3, 64

Uma pequena melhoria na resposta do Sp3000 , que usa a idéia de iterar os índices de caracteres e, para cada um, iterar através da entrada para obter caracteres que correspondam ao caso.

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

Isso usa um único loop, percorrendo a entrada 26 vezes. O separador ~é usado para saber quando ir para o próximo índice de caracteres c. Para se o caractere dcorresponde ao valor cem maiúsculas e minúsculas, os últimos cinco bits do valor de bits de dsão xoredados comc , com um 0 indicando uma correspondência.

Em seguida, o caractere dé impresso exatamente quando o resultado é 0, com uma string vazia caso contrário.

xnor
fonte
3

Python 2.7, 114 106 bytes

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))

Registra a presença de um caractere em uma matriz de 123 comprimentos (para incluir os intervalos AZ e az) e itera através dele para obter as entradas diferentes de zero.
Ineficiente, mas mais eficiente do que forçar o bruto (mas mais :().

Testando

<< HelloWorldhi
>> deHhillloorW
Kamehameha
fonte
Quando eu executá-lo com HelloWorldhi, eu fico['d', 'e', 'H', 'h', 'i', 'lll', 'oo', 'r', 'W']
Azul
@muddyfish oops meu mal. Colei o código errado enquanto tentava algumas coisas. Obrigado por isso :)
Kamehameha
Você também não precisa if l[j].
azul
@muddyfish Bom, eles se tornam cadeias vazias (e são removidas quando joineditadas). -8 bytes. Obrigado :)
Kamehameha
11
@SirParselot Sim, mas isso parecia modificar a entrada conforme indicado na pergunta, então não fez isso
Kamehameha
3

PHP, 275 270 bytes

<?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)]);}


Explicação:
O código gera uma matriz com todas as letras do alfabeto, que tem seu Valor ASCII como Chave de Matriz. Posteriormente, o código gera uma nova matriz que contém os valores ASCII da entrada. Em seguida, o menor valor é impresso e removido.

Uso:
Chame o script com um argumento: php -d error_reporting=0 script.php Hello

Versão 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;


Quaisquer conselhos são muito apreciados.

empurrão
fonte
Letras maiúsculas não estão funcionando ... precisa corrigir isso.
jrenk
Corrigido que o código também funciona quando a entrada possui letras maiúsculas.
jrenk
3

Haskell, 83 53 bytes

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

Uso: f "HelloWorldhi"-> "deHhillloorW".

Como funciona: deixe y seja a string de entrada

[ |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

Edit: 30 bytes salvos, imagine isso! Obrigado @Mauris.

nimi
fonte
2
Por que não apenas import Data.Char;f y=[c|x<-[' '..],c<-y,toLower c==x](53 bytes)? (Isso levará algum tempo para terminar, porque length [' '..] == 1114080- mas é finito).
Lynn
11
@Mauris: Uau! Btw: 8.5seg em um laptop de 4 anos não é muito longo.
nimi
3

Python 3, 61 bytes

Uma nova resposta para uma técnica diferente!

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

Observando isso ord('a')&31==ord('A')&31e aquilo ord('z')&31==ord('Z')&31, podemos simplesmente criar uma matriz de cadeias vazias e, para cada caractere, adicioná-la ao índice da matriz de seu valor ASCII &31. Quando você imprimi-lo, ele será classificado.

Limitado à entrada a-zA-Z.

Tryth
fonte
2

Python 3, 97 92 bytes

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

A melhor maneira de classificar é claramente gerar todas as permutações e depois escolher o mínimo, que por acaso é classificado :)

As strings são minúsculas antes da comparação para obedecer às regras 'case-sensitive'.

Atenção: may be muito lento com cordas grandes.

Um intérprete está localizado aqui .

Tryth
fonte
2

Python 3, 118 bytes

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="")

Poderia ser jogado muito mais curto, eu sei

Azul
fonte
Você pode substituir if q not in i:por if~-(q in i):.
precisa saber é o seguinte
Eu faço porque estou chamando a .remove()função nele.
Blue
2

Powershell, 164 bytes

Tenho certeza de que há uma maneira mais limpa de fazer isso, mas não consegui pensar em mais nada. Apenas pega a entrada como uma matriz de caracteres, faz uma ordenação por inserção e cospe a saída. Perde terrivelmente, mesmo para outros idiomas que não são de golfe.

Código:

$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''

Uso:

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

Expandido e explicado:

$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
AdmBorkBork
fonte
2

Julia, 61 bytes

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

Julia exibirá isso como uma saída de sequência, se você chamá-lo no REPL. Se isso tem de imprimir para STDOUT, então ele precisa de 78 bytes:

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

Um intérprete para Julia pode ser encontrado aqui . Outro, no qual eu já coloquei algum código, é aqui . Observe que, com o segundo, você precisará tornar o terminal (na parte inferior) visível, arrastando o limite para cima. Clicar em "executar" fará com que seja executado no terminal na linha de comando normal (e, portanto, não mostrará a saída se for chamado sem println). Como alternativa, basta digitar juliao próprio terminal e lidar com tudo dentro do REPL que será exibido.

E para um pouco de diversão extra, aqui estão algumas outras implementações

Classificação do Gnome (83 bytes):

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)

Meu próprio algoritmo de classificação (84 bytes):

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

Scala, 82 bytes

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

da linha de comando:

$ 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

provavelmente pode ser um pouco mais avançado ... apenas implementando o tipo de inserção usando fold.

Gilad Hoch
fonte
2

código de máquina x86, 51 42 bytes

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

Classificação por bolha, com alguns truques de reutilização de registro para barbear bytes aqui e ali; o arquivo .COM é executado no DosBox, recebe a entrada da linha de comando e imprime a saída na saída padrão.

sessão de amostra

Montagem comentada:

    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
Matteo Italia
fonte
2

Java (JDK 10) , 125 bytes

s->{for(int i=s.length,j;i-->1;)for(j=i;j-->0;)s[i]^=(s[i]&95)<(s[j]&95)?s[j]^(s[j]=s[i]):0;System.out.print(new String(s));}

Experimente online!

Usando um tipo ingênuo.

Olivier Grégoire
fonte
1

Perl, 88 bytes

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

Apenas um simples Bubble Sort. Ligue com a opção -n para passar o texto.

por exemplo:

echo "tThHiIsS" | perl -n sort2.pl

Resultado:

hHiIsStT
samgak
fonte
1

PHP, 106 bytes

O código:

$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]);

Não há nada de especial no código; count_chars()produz uma matriz indexada por códigos ASCII que contém o número de ocorrências para cada caractere ASCII. O resto é uma iteração chata sobre essa matriz.

Exemplo de execução:

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

Um byte extra pode ser salvo usando o PHP 7: substitua $c[$i]por ($c=count_chars($argv[1]))[$i]e remova a atribuição de $cdesde o início do programa.

axiac
fonte
1

Haskell, 74 bytes

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

Completamente diferente da minha outra resposta . Desta vez, é uma classificação de inserção simples.

nimi
fonte
1

Pip, 18 14 bytes

Repositório do GitHub para Pip

Parece que não há como competir com Pyth, mas isso é bastante respeitável.

FcAZ OcQUC_FIa

Funciona apenas em cadeias contendo a-zA-Z. Para cada letra do alfabeto, usa uma operação de filtro para pegar as letras da sequência de entrada que é igual a essa letra sem distinção entre maiúsculas e minúsculas:

                    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

Duas notas:

  • O espaço é necessário; caso contrário, a sequência AZOseria digitalizada como em A ZOvez de AZ O;
  • O programa não gera uma nova linha à direita. Para adicionar um, coloque um xno final do código (imprimindo assim uma string vazia após a conclusão do loop).

Amostra de execução (usando a xvariante):

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