Bu kelimeyi imzala 2!


17

Bu kelimeyi imzala 2!

Çok uzun zaman önce, Bu kelimeyi imzala adlı bir meydan okuma yayınladım ! . Meydan, sen sıraya koymak harfler (ör imzadır kelimenin imzasını bulmak zorundadır thisolan hist). O zaman, bu meydan okuma oldukça iyi oldu, ancak önemli bir sorun vardı: WAY çok kolaydı ( GolfScript cevabına bakın ). Yani, benzer bir meydan okuma yayınladım, ancak daha fazla kuralla, bunların çoğu PPCG kullanıcıları tarafından önceki bulmacanın yorumlarında önerildi. İşte başlıyoruz!

kurallar

  1. Programınız bir girdi almalı, ardından imzayı STDOUT'a veya kullandığınız dilde eşdeğer bir çıktıya vermelidir.
  2. $Yerleşik sıralama işlevlerini kullanmanıza izin verilmediğinden , GolfScript'teki gibi şeylere izin verilmez.
  3. Çok nokta desteği desteklenmelidir - programınız hem büyük hem de küçük harfleri birlikte gruplamalıdır. Yani imzasıHello ise eHllo, değil Helloilk sürümü GolfScript cevap verdiği gibi.
  4. Programınız için bağlantı vermeniz gereken ücretsiz bir tercüman / derleyici olmalıdır.

puanlama

Puanınız bayt sayınızdır. En düşük bayt sayısı kazanır.

Liderler Sıralaması

İşte hem düzenli bir skor tablosu hem de kazananları dile göre gözden geçirmek için bir Yığın Parçacığı.

Yanıtınızın göründüğünden emin olmak için lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

# Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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


2
Küçük ve büyük harf sipariş edilmeli mi? İçin Örneğin ThHihs, biz çıktı edebilir hHhistya da biz çıkışa var hhHistya Hhhist?
ölümcül

2
@Kslkgh Soruyu anlamak için bir GolfScript yorumlayıcısı kurmak istemiyorum. Gereksinimler sorunun kendisinde açıkça belirtilmelidir.
feersum

1
@feersum Gerek yok. Yanıtta çevrimiçi tercümana bir bağlantı var. Ama bunu daha açık hale getireceğim.

8
Unicode'da küçük / büyük harfleri doğru şekilde kullanmak korkutucu, bu yüzden bu soru gönüllü olarak ASCII harfleriyle sınırlı mı: [a-zA-Z]?
Matthieu M.

3
"Bu GolfScript yanıtını görün" ifadesinden sonra parantezinizi kapatmayı unuttunuz. xkcd.com/859
nyuszika7h

Yanıtlar:


11

Pyth, 10 bayt

sm@+drd1zG

Çevrimiçi deneyin: Gösteri

Açıklama:

             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]

zipKarakter çiftlerinin bir listesini oluşturur [('a','A'), ...('z','Z')]. Kesme nedeniyle ikinci uç noktanın belirtilmesi gerekmez. Listedeki her bir çift için, giriş dizesindeki sçiftteki iki karakterden biri olan harfleri alırız .


5

Python 3, 72 70 bayt

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

Girdinin yalnızca oluştuğunu varsayar [a-zA-Z].

(@Xnor sayesinde -2 bayt)


Ne yapabilirim düşünüyorum "".join(c*b ...)için "".join(c ... if b) aynı şekilde sum(n ... if b)olabilir sum(n*b ...).
xnor

İki döngüyü bir nöbetçi ile tek bir döngüye daraltmak ve eşitlik kontrolünü sıkıştırmak: c=1 for d in(input()+'~')*26:print(d[ord(d)&32^c:],end='');c+=d>'z'(67)
xnor

@xnor İlk ipucunu ekledim (teşekkürler!) Ama sanırım ikincisini ayrı bir cevap olarak göndermelisin :)
Sp3000

4

GOTO ++, 531 bayt

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 ++ Proje sayfası

İşte kodun daha okunaklı ve yorumlanmış bir sürümü ( GOTOGOTO ++ 'da bir yorum başlatan not ):

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
Harika bir programlama dilinin işaretleri: tüm komutlar Fransızca'dır ve resmi web sitesinde "Logonuzu gönderin ve aptal görünün" yazıyor.
Alex A.

@AlexA. Harika bir programlama dilinin işareti: function(arg)ve function() argher ikisi de geçerlidir. Ayrıca, öncelikli parantezler } {sıkıcı değil( )
Fatalize

4

Pyth, 15 14 bayt

s*V/LzJ.irG1GJ

1 baytı kaldırdığınız için teşekkür ederiz.

Henüz Pyth hakkında çok şey bilmiyorum, bu yüzden bu iyi golf olmayabilir.

Burada deneyin.


Bir kolay golf: dizeler listesindeki ile saynıdır jk.
isaacg

4

JavaScript (ES6), 71 74

A-Za-z ile sınırlıdır (@Matthieu M'nin yorumuna bakınız)

Düzenle 'Dönüşü önlemek için virgülle tek bir ifade oluşturmak için çok kullanılır. Burada bir çıktı gereklidir, bu yüzden basit bir kullanabilir forve virgülleri unutabilirim.

Dizi tanıma kullanıldığında bayt sayısı 73'tür, ancak bu artık geçerli EcmaScript 6 değil

Genel not: snippet'i herhangi bir EcmaScript 6 uyumlu tarayıcıda çalıştırmayı test edin (özellikle Chrome MSIE değil. Firefox'ta test ettim, Safari 9 gidebilir)

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 bayt

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

This is far away from "golfed" but I'm a bit busy right now, just editted to remove sort.


1
@frikinside While it might not help this solution since sorting was disallowed, Javascript ES6 arrow functions could help shorten this. (Not all browsers support ES6 yet, try Firefox). Maybe it'll help your future solutions though! :) An example of what it might look like: console.log(input.split('').sort((a,b)=>a.toLowerCase().localeCompare(b.toLowerCase())).join(''))
jrich

@UndefinedFunction Actually I choose to use plain javascript on purpose, for the "challenge" but thx a lot for the nice suggestion!
frikinside

@edc65 actually I was aware of that in a previous comment (like u said) and I did not forget it, I wasn't have time until now.
frikinside

4

Python 3, 64

A small improvement on Sp3000's answer, which uses the idea of iterating iterating the character indices, and for each one, iterating through the input to take characters that match up to case.

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

This uses a single loop, looping through the input 26 times. The separator ~ is used to know when to go to the next character index c. To whether character d matches value c up to case, the last five bits of the bit-value of d are xor-ed with c, with a 0 indicating a match.

Then, the character d is printed exactly when the result is 0, with an empty string otherwise.


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

Logs the presence of a char in a 123 length array(for including both A-Z and a-z ranges) and then iterates through it to get the non-zero entries.
Inefficient, but more efficient than brute forcing it(but longer :().

Testing it-

<< HelloWorldhi
>> deHhillloorW

When I run it with HelloWorldhi, I get ['d', 'e', 'H', 'h', 'i', 'lll', 'oo', 'r', 'W']
Blue

@muddyfish oops my bad. I pasted the wrong code while trying out a couple of things. Thanks for that :)
Kamehameha

You don't need the if l[j] either.
Blue

@muddyfish Nice, they become empty strings(and are removed when joined). -8 bytes. Thanks :)
Kamehameha

1
@SirParselot Yeah, but that seemed like modifying the input as given in the question, so didn't do that
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)]);}


Explanation:
The code generates an array with every letter in the alphabet, which has its ASCII Value as Array Key. Afterwards the code generates a new array which contains the ASCII Values of the Input. Then the lowest Value gets printed out and gets removed.

Usage:
Call the script with an argument: 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;


Any advices are greatly appreciated.


Uppercase letters are not working ... need to fix this.
jrenk

Fixed that the code also works when the Input has Uppercase letters.
jrenk

3

Haskell, 83 53 bytes

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

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

How it works: let y be the input string

[ |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 saved, imagine that! Thanks @Mauris.


2
Why not just import Data.Char;f y=[c|x<-[' '..],c<-y,toLower c==x] (53 bytes)? (This will take some time to terminate, because length [' '..] == 1114080 -- but it's finite.)
Lynn

1
@Mauris: Wow! Btw: 8.5sec on a 4 year old laptop is not too long.
nimi

3

Python 3, 61 bytes

A new answer for a different technique!

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

Noting that ord('a')&31==ord('A')&31 and that ord('z')&31==ord('Z')&31, we can simply create an array of empty strings and for each character add it to the array index of its ASCII value &31. When you print it, it will be sorted.

Limited to input a-zA-Z.


2

Python 3, 97 92 bytes

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

The best way to sort is clearly to generate all permutations, and then pick the minimum, which just happens to be sorted :)

The strings are lowercased before comparison to abide by the 'case-aware' rules.

Warning: may be very slow with big strings.

An interpreter is located here.


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

Could be golfed much shorter, I know


You can replace if q not in i: with if~-(q in i):.
PurkkaKoodari

I do because I'm calling the .remove() function on it.
Blue

2

Powershell, 164 Bytes

I'm sure there's a cleaner way to do this, but I couldn't come up with anything else. Just takes the input as a character array, does an insertion sort, and spits out the output. Loses horribly, even to other non-golfing languages.

Code:

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

Usage:

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

Expanded & Explained:

$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

Julia, 61 bytes

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

Julia will display it as a string output if you call it in the REPL. If it has to print out to STDOUT, then it needs 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)))

An interpreter for Julia can be found here. Another one, which I've already put some code into, is here. Note that, with the second one, you will need to make the terminal (at the bottom) visible by dragging the boundary up. Clicking "execute" will make it run in the terminal at the normal command line (and thus won't show the output if called without println). Alternatively, you can just type julia into the terminal itself, then handle everything inside the REPL that will come up.

And for a bit of extra fun, here are some other implementations

Gnome Sort (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)

My own sorting algorithm (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)

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

from command line:

$ 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

probably can be golfed a bit further... just implementing insertion sort using fold.


2

x86 machine code, 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

Bubble sort, with some register reuse tricks to shave bytes here and there; the .COM file runs in DosBox, receives the input from command line and prints the output to standard output.

sample session

Commented assembly:

    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 bytes

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

Just a simple Bubble Sort. Call with -n option to pass the text.

e.g:

echo "tThHiIsS" | perl -n sort2.pl

Output:

hHiIsStT

1

PHP, 106 bytes

The code:

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

There is nothing special in the code; count_chars() produces an array indexed by ASCII codes that contains the number of occurrences for each ASCII character. The rest is a dull iteration over this array.

Example of execution:

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

An extra byte can be saved using PHP 7: replace $c[$i] with ($c=count_chars($argv[1]))[$i] and remove the assignment of $c from the beginning of the program.


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

Completely different from my other answer. This time it's a simple Insertion sort.


1

Pip, 18 14 bytes

GitHub repository for Pip

Seems there's no competing with Pyth, but this is pretty respectable.

FcAZ OcQUC_FIa

Works only on strings containing a-zA-Z. For each letter of the alphabet, uses a filter operation to grab the letters from the input string that equal that letter case-insensitively:

                    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

Two notes:

  • The space is necessary; otherwise, the sequence AZO would scan as A ZO instead of AZ O;
  • The program doesn't output a trailing newline. To add one, put an x at the end of the code (thereby printing an empty string after the loop is done).

Sample run (using the x variant):

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.