Tanda tangani kata 2!


17

Tanda tangani kata 2!

Belum lama ini, saya memposting sebuah tantangan yang disebut Tanda kata itu! . Dalam tantangan, Anda harus menemukan tanda tangan dari kata, yang merupakan huruf dimasukkan ke dalam rangka (misalnya tanda tangan dari thisadalah hist). Nah, tantangan itu cukup baik, tetapi ada satu masalah utama: itu WAY terlalu mudah (lihat jawaban GolfScript ). Jadi, saya telah memposting tantangan serupa, tetapi dengan lebih banyak aturan, yang sebagian besar telah disarankan oleh pengguna PPCG di komentar pada teka-teki sebelumnya. Jadi, ini dia!

Aturan

  1. Program Anda harus mengambil input, lalu mengeluarkan tanda tangan ke STDOUT atau setara dalam bahasa apa pun yang Anda gunakan.
  2. Anda tidak diperbolehkan menggunakan fungsi penyortiran $bawaan , jadi hal-hal seperti di GolfScript tidak diperbolehkan.
  3. Multicase harus didukung - program Anda harus mengelompokkan huruf besar dan kecil sekaligus. Jadi tanda tangannya Helloadalah eHllo, tidak Helloseperti yang diberikan oleh jawaban GolfScript pada versi pertama.
  4. Harus ada juru bahasa / kompiler gratis untuk program Anda, yang harus Anda tautkan.

Mencetak gol

Skor Anda adalah jumlah byte Anda. Hitungan byte terendah menang.

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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


2
Haruskah huruf kecil dan besar dipesan? Sebagai contoh, untuk ThHihs, dapat kami output hHhistatau kita harus output hhHistatau Hhhist?
Fatalkan

2
@ Kslkgh Saya tidak ingin menginstal juru bahasa GolfScript untuk memahami pertanyaan. Persyaratan harus ditentukan dengan jelas dalam pertanyaan itu sendiri.
feersum

1
@feersum Anda tidak perlu melakukannya. Ada tautan dalam jawaban untuk juru bahasa online. Tapi saya akan membuatnya lebih jelas.

8
Menangani huruf kecil / huruf besar dengan benar di Unicode menakutkan, jadi apakah pertanyaan ini secara sukarela terbatas pada huruf ASCII: [a-zA-Z]?
Matthieu M.

3
Anda lupa menutup tanda kurung setelah "lihat jawaban GolfScript ini". xkcd.com/859
nyuszika7h

Jawaban:


11

Pyth, 10 byte

sm@+drd1zG

Cobalah online: Demonstrasi

Penjelasan:

             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]

The zipmenciptakan daftar pasangan karakter [('a','A'), ...('z','Z')]. Karena pemotongan, titik akhir kedua tidak perlu ditentukan. Untuk setiap pasangan dalam daftar, kami mengambil huruf dalam string input syang merupakan salah satu dari dua karakter dalam pasangan.


5

Python 3, 72 70 byte

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

Asumsikan input hanya terdiri dari [a-zA-Z].

(-2 byte terima kasih kepada @xnor)


Saya pikir Anda dapat melakukan "".join(c*b ...)untuk "".join(c ... if b) dengan cara yang sama sum(n ... if b)bisa sum(n*b ...).
xnor

Runtuhkan kedua loop menjadi satu loop dengan sentinel, dan tekan cek kesetaraan: c=1 for d in(input()+'~')*26:print(d[ord(d)&32^c:],end='');c+=d>'z'(67)
xnor

@ xnor Saya telah menambahkan tip pertama (terima kasih!) tapi saya pikir Anda harus memposting yang kedua sebagai jawaban terpisah :)
Sp3000

4

GOTO ++, 531 byte

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

Halaman Proyek GOTO ++

Berikut ini adalah versi kode slighlty yang lebih mudah dibaca dan dikomentari (Catatan yang GOTOmemulai komentar di 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
Tanda bahasa pemrograman yang bagus: semua perintah dalam bahasa Prancis dan situs web resmi mengatakan "Kirim logo Anda dan terlihat bodoh."
Alex A.

@AlexA. Tanda bahasa pemrograman yang bagus: function(arg)dan function() argkeduanya valid. Juga, tanda kurung prioritas } {dan tidak membosankan( )
Fatalize

4

Pyth, 15 14 byte

s*V/LzJ.irG1GJ

Terima kasih atas isaacg untuk menghapus 1 byte.

Saya belum tahu banyak tentang Pyth, jadi ini mungkin tidak golf dengan baik.

Coba di sini.


Satu golf mudah: ssama dengan jkdaftar string.
isaacg

4

JavaScript (ES6), 71 74

Terbatas untuk A-Za-z (lihat komentar oleh @Matthieu M)

Sunting Terlalu digunakan untuk menulis satu ekspresi dengan koma, untuk menghindari 'kembali'. Di sini output diperlukan, jadi saya bisa menggunakan yang sederhana fordan melupakan koma.

Menggunakan pemahaman array, jumlah byte adalah 73, tetapi itu tidak valid EcmaScript 6 lagi

Catatan biasa: tes menjalankan snippet pada browser apa pun yang mendukung EcmaScript 6 (terutama bukan Chrome bukan MSIE. Saya menguji pada Firefox, Safari 9 bisa pergi)

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 byte

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

Ini jauh dari "golf" tetapi saya agak sibuk sekarang, hanya diedit untuk menghapus semacam.


1
@frikinside Meskipun mungkin tidak membantu solusi ini karena pengurutan tidak diizinkan, fungsi panah Javascript ES6 dapat membantu mempersingkat ini. (Belum semua browser mendukung ES6, coba Firefox). Mungkin itu akan membantu solusi masa depan Anda! :) Contoh tampilannya:console.log(input.split('').sort((a,b)=>a.toLowerCase().localeCompare(b.toLowerCase())).join(''))
jrich

@UndefinedFunction Sebenarnya saya memilih untuk menggunakan javascript polos dengan sengaja, untuk "tantangan" tetapi terima kasih banyak untuk saran yang bagus!
frikinside

@ edc65 sebenarnya saya menyadari hal itu dalam komentar sebelumnya (seperti yang Anda katakan) dan saya tidak melupakannya, saya tidak punya waktu sampai sekarang.
frikinside

4

Python 3, 64

Peningkatan kecil pada jawaban Sp3000 , yang menggunakan ide iterasi iterasi indeks karakter, dan untuk masing-masing, iterasi melalui input untuk mengambil karakter yang cocok dengan huruf besar-kecil.

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

Ini menggunakan satu loop, perulangan melalui input 26 kali. Pemisah ~digunakan untuk mengetahui kapan harus pergi ke indeks karakter berikutnyac . Untuk apakah karakter dcocok dengan nilai chingga kasus, lima bit terakhir dari nilai bit dadalah xor-ed dengan c, dengan 0 menunjukkan kecocokan.

Lalu, karakternya d dicetak tepat saat hasilnya 0, dengan string kosong sebaliknya.


3

Python 2.7, 114 106 byte

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

Log kehadiran char dalam array 123 panjang (untuk memasukkan rentang AZ dan az) dan kemudian beralih melalui itu untuk mendapatkan entri non-nol.
Tidak efisien, tetapi lebih efisien daripada memaksa kasar (tapi lebih lama :().

Menguji itu-

<< HelloWorldhi
>> deHhillloorW

Ketika saya menjalankannya HelloWorldhi, saya mendapatkan['d', 'e', 'H', 'h', 'i', 'lll', 'oo', 'r', 'W']
Biru

@muddyfish oops my bad. Saya menempelkan kode yang salah saat mencoba beberapa hal. Terima kasih untuk itu :)
Kamehameha

Anda tidak perlu if l[j]keduanya.
Biru

@muddyfish Bagus, mereka menjadi string kosong (dan dihapus saat joindiedit). -8 byte. Terima kasih :)
Kamehameha

1
@ SirParselot Ya, tapi itu seperti memodifikasi input seperti yang diberikan dalam pertanyaan, jadi jangan lakukan itu
Kamehameha

3

PHP, 275 270 byte

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


Penjelasan:
Kode menghasilkan sebuah array dengan setiap huruf dalam alfabet, yang memiliki Nilai ASCII sebagai Kunci Array. Setelah itu kode menghasilkan array baru yang berisi Nilai ASCII dari Input. Kemudian Nilai terendah akan dicetak dan dihapus.

Penggunaan:
Panggil skrip dengan argumen: php -d error_reporting=0 script.php Hello

Versi Tidak Digubah:

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


Setiap saran sangat dihargai.


Huruf besar tidak berfungsi ... perlu diperbaiki.
jrenk

Memperbaiki bahwa kode juga berfungsi ketika Input memiliki huruf besar.
jrenk

3

Haskell, 83 53 byte

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

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

Cara kerjanya: biarkan ymenjadi string input

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

Sunting: 30 byte disimpan, bayangkan itu! Terima kasih @Mauris.


2
Mengapa tidak adil import Data.Char;f y=[c|x<-[' '..],c<-y,toLower c==x](53 byte)? (Ini akan membutuhkan waktu untuk diakhiri, karena length [' '..] == 1114080- tapi itu terbatas.)
Lynn

1
@Mauris: Wow! Btw: 8.5sec pada laptop berusia 4 tahun tidak terlalu lama.
nimi

3

Python 3, 61 byte

Jawaban baru untuk teknik yang berbeda!

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

Memperhatikan itu ord('a')&31==ord('A')&31dan itu ord('z')&31==ord('Z')&31, kita cukup membuat array string kosong dan untuk setiap karakter menambahkannya ke indeks array nilai ASCII-nya &31. Ketika Anda mencetaknya, itu akan diurutkan.

Terbatas untuk input a-zA-Z.


2

Python 3, 97 92 byte

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

Cara terbaik untuk mengurutkan adalah dengan jelas menghasilkan semua permutasi, lalu pilih minimum, yang kebetulan diurutkan :)

Senar diturunkan lebih rendah sebelum dibandingkan untuk mematuhi aturan 'sadar kasus'.

Peringatan: mungkin sangat lambat dengan string besar.

Seorang juru bahasa terletak di sini .


2

Python 3, 118 byte

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

Bisa bermain golf lebih pendek, saya tahu


Anda bisa menggantinya if q not in i:dengan if~-(q in i):.
PurkkaKoodari

Saya lakukan karena saya memanggil .remove()fungsi di atasnya.
Biru

2

Powershell, 164 Bytes

Saya yakin ada cara yang lebih bersih untuk melakukan ini, tetapi saya tidak bisa menemukan yang lain. Hanya mengambil input sebagai array karakter, melakukan penyisipan, dan memuntahkan output. Kehilangan mengerikan, bahkan untuk bahasa non-golf lainnya.

Kode:

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

Pemakaian:

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

Diperluas & Dijelaskan:

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

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

Julia akan menampilkannya sebagai output string jika Anda menyebutnya di REPL. Jika memiliki untuk mencetak ke stdout, maka perlu 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)))

Seorang juru bahasa untuk Julia dapat ditemukan di sini . Satu lagi, yang sudah saya masukkan beberapa kode, ada di sini . Perhatikan bahwa, dengan yang kedua, Anda harus membuat terminal (di bagian bawah) terlihat dengan menyeret batas ke atas. Mengklik "eksekusi" akan membuatnya berjalan di terminal pada baris perintah normal (dan dengan demikian tidak akan menampilkan output jika dipanggil tanpa println). Atau, Anda cukup mengetik juliake terminal itu sendiri, lalu menangani semua yang ada di dalam REPL yang akan muncul.

Dan untuk sedikit kesenangan ekstra, berikut adalah beberapa implementasi lainnya

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

Algoritma pengurutan saya sendiri (84 byte):

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 byte

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

dari baris perintah:

$ 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

mungkin bisa bermain golf sedikit lebih jauh ... hanya menerapkan penyisipan menggunakan lipatan.


2

kode mesin x86, 51 42 byte

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, dengan beberapa trik reuse register untuk mencukur byte di sana-sini; yang berkas COM berjalan di DosBox, menerima masukan dari baris perintah dan mencetak output ke output standar.

sesi sampel

Majelis yang dikomentari:

    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 byte

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

Hanya Sort Bubble sederhana. Panggil dengan opsi -n untuk mengirim teks.

misalnya:

echo "tThHiIsS" | perl -n sort2.pl

Keluaran:

hHiIsStT

1

PHP, 106 byte

Kode:

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

Tidak ada yang spesial dalam kode; count_chars()menghasilkan array yang diindeks oleh kode ASCII yang berisi jumlah kemunculan untuk setiap karakter ASCII. Sisanya adalah iterasi yang membosankan pada array ini.

Contoh eksekusi:

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

Byte tambahan dapat disimpan menggunakan PHP 7: ganti $c[$i]dengan ($c=count_chars($argv[1]))[$i]dan hapus tugas dari $cawal program.


1

Haskell, 74 byte

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

Sangat berbeda dari jawaban saya yang lain . Kali ini adalah jenis Penyisipan sederhana.


1

Pip, 18 14 byte

Repositori GitHub untuk Pip

Sepertinya tidak ada yang bersaing dengan Pyth, tapi ini cukup terhormat.

FcAZ OcQUC_FIa

Hanya berfungsi pada string yang berisi a-zA-Z. Untuk setiap huruf alfabet, gunakan operasi filter untuk mengambil huruf dari string input yang sama dengan huruf case-insensitive:

                    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

Dua catatan:

  • Ruang itu perlu; jika tidak, urutan AZOakan memindai sebagai A ZOgantinyaAZ O ;
  • Program tidak menghasilkan baris baru. Untuk menambahkan satu, masukkanx di akhir kode (dengan demikian mencetak string kosong setelah loop selesai).

Contoh dijalankan (menggunakan x varian):

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.