Sortir-a-angka. Agak


19

Terinspirasi oleh sorting-a-number-digit-digit-tanpa-menggunakan-an-array , tapi saya pikir itu membuat kode golf yang lebih baik daripada pertanyaan SO.

Diberikan bilangan bulat positif, urutkan digit dalam bilangan bulat itu.

Menang skor terendah!

  1. Mulai dengan 0 poin.
  2. Tambahkan satu titik per karakter.
  3. Tambahkan 20 poin untuk setiap larik yang Anda gunakan.
  4. Tambahkan 10 poin untuk setiap string multi-karakter dalam kode Anda. (Kecuali input awal selama itu dikonversi ke integer tanpa operasi lain yang dilakukan di dalamnya.)
  5. Tambahkan 32 poin jika jumlah digit maksimum yang dapat ditangani oleh program Anda dibatasi oleh program Anda (sebagai lawan dari mesin).
  6. Kurangi 10 poin jika kode Anda dapat mengubah arah pengurutan yang diberikan argumen lain (apa pun yang Anda inginkan, tetapi misalnya 0 untuk pengurutan menurun dan 1 untuk pengurasan.)

Setiap bahasa berbeda, tetapi idenya adalah untuk menghindari segala jenis peretasan yang berulang-ulang.

Contoh:

Input : 52146729

Output : 97654221 atau 12245679

Catatan:

  1. Gunakan kemampuan penyortiran bawaan yang disediakan oleh bahasa pemrograman Anda, tetapi jika fitur semacam itu melibatkan string atau array, ambil penalti!
  2. Anda bisa menulis solusi sebagai fungsi yang mengambil integer secara langsung, atau sebagai program yang mengambil argumen dari argv, file atau stream dan mengubahnya menjadi integer. Selama Anda mengonversinya menjadi integer segera dan membuang input char * asli tanpa melakukan operasi lebih lanjut padanya, tidak ada penalti yang berlaku.
  3. Hukuman tidak hanya berlaku untuk string literal dalam teks program Anda, tetapi bagian mana pun dari fitur program Anda yang dapat menginput atau menghasilkan string atau dapat diubah. Misalnya, JavaScript String.prototype.splitmemiliki setidaknya satu string sebagai input ( this) dan Array sebagai output, jadi +30 untuk menggunakannya.
  4. Saya sudah mencoba membuat aturan ini memandu prinsip desain algoritma, bukan inisial / akhir I / O (karenanya catatan # 2). Saya tidak berpikir hukuman harus diterapkan int(input())bahkan jika inputtanda tangan mengatakan itu mengembalikan string, selama ungkapan itu adalah titik awal masuknya program. Demikian juga, jika hasil akhir dari program adalah print(x)dan xharus berupa string, penalti tidak berlaku untuk operasi casting string parit terakhir. Semua yang dikatakan, saya secara eksplisit tidak pernah mengatakan bahwa ini harus menjadi program atau dari mana I / O harus datang atau pergi. Fungsi yang mengambil intdan mengembalikan intakan berfungsi, dan tidak akan menderita dari ambiguitas ini.

1
Apakah " "dihitung sebagai string multi karakter? Satu karakter tidak akan dianggap sebagai "multi" ...
WallyWest

4
Menurut saya seperti implementasi sleepsort yang mudah.
user12205

1
Anda tidak melarang fungsi penyortiran bahasa.
user80551

1
Saya akan menulis lebih baik aturan tentang fungsi built-in, juga hukumannya terlalu rendah: ini mengurangi penggunaan array daripada metode alternatif (mungkin lebih lama).
Antonio Ragagnin

1
@AntonioRagagnin Saya tidak ingin mengubah hukuman ex post facto, tapi saya mengklarifikasi aturan seputar fungsi bawaan.
kojiro

Jawaban:


13

GolfScript, 11 4

(4 + 10 (string) - 10 (opsi mundur))

Masukan pada STDIN.

~`$%

Format input adalah ini:

(1 or -1) (the number)

1untuk menyortir secara normal, -1untuk membalikkan. 4 karakter - 10 untuk opsi mundur = skor -6.

Input secara teknis adalah string, jadi saya tidak yakin apakah itu diperhitungkan dengan +10. Saya menafsirkan aturan sebagai "string yang dideklarasikan dalam program Anda" (karena dikatakan "dalam kode Anda").


Jawaban lama (skor 11):

$

3
String secara teknis array di GS, hanya untuk benar-benar menyulitkan debat penilaian.
Peter Taylor

Ya, input string (yang tidak segera dikonversi menjadi integer) adalah +10.
kojiro

@kojiro ~segera mengonversi ke integer. Tapi kemudian diubah kembali menjadi string dengan `. Apakah mengonversikannya menjadi string? Karena terkadang string mungkin bukan multicharacter (input 1 digit)
Gagang Pintu

Ya, mengonversi string menjadi penting kecuali fungsi (atau apa pun) hanya dapat menghasilkan string satu karakter. Ini harus dinilai berdasarkan fungsi tanda tangan atau dokumentasi. Jika itu dirancang untuk menghasilkan satu karakter (seperti chr), tidak apa-apa.
kojiro

14

Haskell 106

t=10;d=divMod;s z|z<w z=s$w z|t>0=z
w x|x<t=x|y>z=(q*t+y)*t+z|t>0=y+t*(w v)where{(v,y)=d x t;(q,z)=d v t}

contoh:

ghci> s 502010406072952146729521467295214672952146729
999997777766666555554444422222222221111100000

Jawaban yang tidak menghindari pertanyaan.

Diminta penjelasan, ini dia ungolfed. Ini semacam gelembung yang sangat tidak efisien.

-- t=10 - alias for 10. d=divMod - alias for divMod.
-- The alias for '10' turns out to be unnecessary; inlining it
-- and using '1>0' for True has the same character count. It's
-- a relic of earlier versions of the code.

-- 's': if no digits need swapped, return the number,
-- otherwise return 's' applied to the number with
-- that pair of digits swapped.
sort z=
  let temp=sort_pair z
  -- because we are sorting in descending order,
  -- sorting a pair of digits always increases the number.
  -- testing > costs one less char than ==.
  if z<temp then
    -- golfed version uses guards instead of if/else to save space.
    -- t>0 is '10 > 0', which is 'True', in fewer chars.
    sort temp
  else
    z
-- 'w': recursively swap one pair of out of order digits, or
-- return the original number if no pairs needed swapped.
sort_pair x=
  -- haskell does the assignments below lazily, they aren't
  -- calculated unless I use them. 'divMod' lets me do this
  -- with fewer chars.
  let y = x `mod` 10 -- last digit
      v = x `div` 10 -- all but last digit
      z = v `mod` 10 -- second last digit
      q = v `div` 10 -- all but last 2 digits
  in
  if x < 10 then
    x
  else if y > z then
    -- last 2 digits are out of order. swap them & return
    -- This is rearranged using Horner's method to save space
    -- http://en.wikipedia.org/wiki/Horner%27s_method
    -- ... although it turns out not to save anything, it's a relic.
    (q * 10 + y)*10 + z
  else
    -- last digit is ok, so try sort_pair on remaining digits
    let temp = sort_pair v in
    -- put last digit back on the end and return
    -- having the bracketed expression last here
    -- let me remove a space before 'where'
    y+(10*temp)

Jawaban yang lebih pendek ada di Haskell, setara dengan beberapa yang lain diposting, misalnya:

import Data.List;s=read.sort.show::Integer->Integer

... skor 52 + 20 = 72, atau ini, skor 45 + 20 = 65:

import Data.List;main=interact(reverse.sort)

... tetapi semangat pertanyaan - tidak ada array, string, atau karakter - lebih menarik.


2
Bisakah Anda menambahkan penjelasan?
user80551

Anda harus mendapatkan pengurangan poin bonus karena ukuran input bilangan bulat bahkan tidak dibatasi oleh mesin karena bilangan bulat presisi implisit acak Haskell.
recursion.ninja

@awashburn Yah, dia mendapatkannya (yaitu dia tidak menambahkan 32 poin!) Dan konon, begitu juga saya (di sini )
Hungry Blue Dev

@ambigram_maker Saya pikir maksudnya milik Anda, misalnya, tidak dapat mengambil input lebih besar dari-itu Integer.MAX_VALUEmembutuhkan int. Tambang, dan beberapa yang lain, menerima ukuran input-jenis input syaitu Integer, setara dalam BigDecimaldi Jawa. Tapi bukan itu yang saya maksud dengan pertanyaan itu, saya pikir itu menghukum jawaban yang 'mengurutkan' hanya satu digit angka.
bazzargh

1
Itu mudah diubah. Saya pikir ini bukan masalah besar.
bazzargh

13

Perakitan C + x86, 636

Saya tahu ini tidak akan menang tetapi rasanya sangat tidak wajar dan memutar sehingga saya harus membagikannya. Tidak ada array atau string (selama Anda tidak menghitung argumen input). Jumlah digit dibatasi oleh kisaran 32 bit.

Jadi, inilah sedikit penjelasan tentang apa yang saya lakukan:

Saya pikir saya akan melakukan ini tanpa menggunakan array atau string, dan kemudian rekursi muncul dalam pikiran, tetapi tentu saja, dengan rekursi saya tidak akan dapat menukar nilai dari panggilan rekursif lainnya ... dan saat itulah saya menyadari bahwa ada suatu cara. Menghubungkan program C saya dengan fungsi perakitan Saya bisa melompat di tumpukan dan mengembalikan pointer ke pointer dasar panggilan yang diinginkan, itulah yang fungsi "recursionStackAt" tidak. Tentu saja recursionStackAt adalah fungsi yang sangat jelek, hasilnya tidak hanya bergantung pada input atau keadaan program tetapi pada pemanggil itu sendiri. Perhatikan bahwa itulah yang membuat saya mengubah indeks dari 0 berbasis menjadi 1 berbasis.

Tanpa basa-basi lagi, inilah kodenya:

#include <stdio.h>
#include <stdlib.h>

int numberToSort;
int totalLength = 0;
int decreasing;

int* recursionStackAt(int pos); //Here's the magic

void swapAtStack(int pos1, int pos2) {
    int a = *(recursionStackAt(pos1)+3);
    *(recursionStackAt(pos1)+3) = *(recursionStackAt(pos2)+3);
    *(recursionStackAt(pos2)+3) = a;
}

int getAt(i) {
    return *(recursionStackAt(i)+3);
}

void printNumber(int len) {
    int i = 0;
    for(i = 1; i <= len; ++i) {
        printf("%d",*(recursionStackAt(i)+3));
    }
    printf("\n");
}

void computeNextDigit(int remainingNumber, int nextDigit) {

    if(remainingNumber == 0) {
        //Bubble sort cause I was lazy and it's quite compact
        ++totalLength;

        int i, j;

        for(i = 1; i <= totalLength; ++i)
            for(j = 1; j <= totalLength-1; ++j) {
                if(decreasing) {
                    if(getAt(j) > getAt(j+1)) 
                        swapAtStack(j,j+1);
                }
                else { 
                    if(getAt(j) < getAt(j+1))
                        swapAtStack(j,j+1);
                }
            }

        printNumber(totalLength);   
    }
    else {
        ++totalLength;
        computeNextDigit(remainingNumber/10, remainingNumber%10);
    }
}

int main(int argc, char* argv[]) {
    if(argc == 3) {
        numberToSort = atoi(argv[1]);
        decreasing = atoi(argv[2]);
    }
    else exit(1);
    computeNextDigit(numberToSort/10, numberToSort%10);
} 

Dan tentu saja kode perakitan x86 (AT&T sintax, btw) untuk fungsi recursionStackAt:

.text
    .align 4
    .globl  recursionStackAt
    .type   recursionStackAt, @function
recursionStackAt:
        pushl %ebp
        movl %esp,%ebp
        pushl %esi
        movl $0, %esi #i = 0
        movl (%ebp), %eax #pointer
while:  
        cmp %esi, 8(%ebp)
        je endwhile
        movl (%eax),%eax
        incl %esi
        jmp while
endwhile:
        popl %esi
        movl %ebp, %esp
        popl %ebp
        ret

Beberapa contoh pada output: (1 berarti meningkat dan 0 menurun)

$ ./sortasort 6543210 1
0123456
$ ./sortasort 32507345 1
02334557
$ ./sortasort 32507345 0
75543320

Inilah versi yang dikaburkan (yang tidak dapat dibaca tetapi berfungsi dengan baik):

http://pastebin.com/XkYt9DLy (kode C) http://pastebin.com/h0S0dfeU (kode x86)

Jadi, jika LibreOffice tidak berbohong, kode saya yang kabur terdiri dari 646 karakter (tanpa spasi, haruskah saya menghitungnya?) Dan dengan semua persyaratan lain bertemu, saya mendapatkan -10 untuk pilihan yang bertambah / berkurang.

Oh, dan untuk mengkompilasi ini Anda harus melakukan (Pada sistem Unix-like)

gcc -c [-m32] recursionStackAt.s 
gcc -o sortasort [-m32] sortasort.c recursionStackAt.o

Perhatikan bahwa flag -m32 hanya jika Anda menggunakan mesin 64 bit. Anda juga membutuhkan pustaka 32 bit untuk mengkompilasinya.


Saya pikir spasi yang diperlukan biasanya dihitung. Setidaknya itulah yang saya lakukan, setelah menghapus spasi yang tidak perlu. Siapa pun yang memiliki nyali untuk mengacaukan tumpukan seperti ini mendapat upvote saya! +1
Trauma Digital

9

Bash (echo) (0 + 7 + 0 + 0 + 32-10) = 29

Agak:

echo $*

Pemakaian:

sorta 5
5

Gunakan "-e" untuk mengurutkan secara terbalik:

sorta -e 3
3
  • menghasilkan hasil yang benar untuk bilangan bulat positif 1-9, ditambah 0
  • menghindari segala jenis peretasan yang berulang-ulang.
  • 7 karakter (+7)
  • tidak ada array
  • tidak ada string multi-karakter
  • jumlah digit maksimum yang dapat ditangani: 1 (+32)
  • secara opsional dapat membalikkan pengurutan (-10)

EDIT: ubah "cat" menjadi "echo" jadi itu benar-benar berfungsi. EDIT 2: Menambahkan "$ *" dan memasukkannya ke dalam skrip "sorta"


Ha ha; trik yang bagus, tetapi sejauh ini masih merupakan jawaban yang hilang dari semua (juga aturan yang menekuk) jawaban sejauh ini;)
Gagang Pintu

4
Semuanya tidak layak; mengapa memilih penyortiran?
Glenn Randers-Pehrson

2
Penyalahgunaan aturan yang legendaris. +1
Trauma Digital

2
@ Kojiro: Misalnya, -edapat digunakan sebagai argumen untuk output terbalik.
Heiko Oberdiek

4
Sudahlah, Anda benar, "-e" akan bekerja sebaik "". Saya harus menulis ulang manual pengguna, dan untuk keterbelakangan mundur saya harus terus menerima "".
Glenn Randers-Pehrson

8

Python3

Fitur skrip saya:

Tidak ada array

Tanpa dawai

Kompleksitas adalah O (n): Saya menggunakan countingsort (dimodifikasi oleh saya untuk tidak menggunakan array, tetapi bilangan prima untuk menghitung kejadian)

Tidak ada batasan ukuran

Karakter: 260 234

n=int(input())
def C(n,k):
    return (n//(10**(k-1)))%10
P=lambda l:((((29-6*l%2,19-2*l%2)[l<9],13-2*l%2)[l<7],2*l-1)[l<5],2)[l==1]

p=1
while n>=1:
    c =C(n,1)
    p*=P(c+1)
    n=n//10
f=1
k=r=0
while p>2:
    if(p%P(f)==0):
        r+=(f-1)*10**k
        p=p//P(f)
        k+=1
    else: f+=1
print(r)

1
Saya bisa saja salah, tetapi saya pikir Anda dapat kehilangan parens di sekitar beberapa aritmatika untuk mencukur beberapa karakter.
kojiro

Saya sangat suka penggunaan bilangan prima di sini. Ini sangat aneh . Juga, saya pikir Pdapat ditulis lambda l:((((29-6*l%2,19-2*l%2)[l<9],13-2*l%2)[l<7],2*l-1)[l<5],2)[l==1], mencukur beberapa karakter. Saya mungkin telah mengacaukannya sedikit, tetapi idenya adalah untuk menggunakan versi bersarang dari sekolah lama Python ternary (sebelum Python memiliki sebuah ternary) (false_result, true_result)[boolean].
kojiro

Terima kasih pria acak dari internet! BTW Saya bersenang-senang dengan ini sekarang, cobalah untuk melihat apakah Anda suka: codegolf.stackexchange.com/a/25086/16992
Antonio Ragagnin

7

Bash + coreutils, 14 (24 karakter - 10 untuk mundur)

Saya pikir ini mungkin sedikit menekuk aturan, tapi ini dia, hari Jumat ...

Saya menganggap penggunaan perpustakaan standar diperbolehkan. Interpretasi saya untuk pustaka standar bashadalah coreutils:

fold -1|sort $1|tr -d\\n
  • Tidak ada array - stream digunakan sebagai gantinya
  • Tidak ada kutipan == tidak ada string multi-karakter
  • Tidak ada batasan untuk panjang input / output
  • arg opsional "-r" membalikkan output.

Masukan dari stdin. Digunakan:

$ declare -i i=52146729
$ ./ksort.sh <<< $i
12245679 $ 
$ ./ksort.sh -r <<< $i
97654221 $ 
$ 

Saya benar-benar berharap saya memasukkan aturan terhadap program yang bekerja dengan apa pun yang bukan bilangan bulat. Saya kira sudah terlambat sekarang.
kojiro

1
Jangan hitung baris baru setelah "\\ n" sehingga Anda mendapat skor 20 bukan 21.
Glenn Randers-Pehrson

Saya tidak menghitung baris baru, tetapi sebagai skrip yang disimpan dalam file, ia memiliki \ 0 di EOF yang disimpan oleh editor saya. Saya biasanya menghitung ini. Tapi saya bisa menghapusnya \ 0, dan skripnya masih berfungsi, jadi saya akan mengambilnya!
Digital Trauma

@ Kojiro Ia bekerja dengan bashide bilangan bulat juga (menyatakan -i). Diedit.
Digital Trauma

(BSD / OSX trtidak menyukai sintaks Anda, yang akan dikenakan biaya satu karakter pada sistem tersebut.) Bagaimanapun, saya berpendapat bahwa ini masih semua operasi string di hati. declare -itidak membuat nama integer, itu hanya membuat shell menggunakan konteks aritmatika di atasnya pada ekspresi tugas RHS.
kojiro

7

C - 64 karakter, 64 poin

main(int a,char**b){b++;qsort(*b,strlen(*b),1,strcmp);puts(*b);}

Anda mungkin bertanya-tanya bagaimana saya menjalankan ini tanpa header. Sederhana, kompilasi dengan:

gcc -include stdio.h stdlib.h string.h test.c -o test --std=gnu11 -Wall -g -O3

Tidak golf:

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>

main(int a, char **b)
{
    b++;
    qsort(*b, strlen(*b), sizeof(char), strcmp);  // sizeof(char) is guaranteed to be 1 by standards
    puts(*b);
}

Saya juga memutuskan untuk memasukkan pemilahan karakter, hanya karena saya bisa.

Tes berjalan:

$ ./test 132815
112358
$ ./test 423791
123479
$ ./test 1234767189728975213132471243985123957120837412
0111111112222222233333344445556777777788889999
$ ./test 4789359uihjasvb8ygohq9poi3n4jiouy58g
3344557888999abgghhiiijjnooopqsuuvyy

1
Sedikit melakukan "golf" dengan baik: D
ProgrammerDan

Saya tidak bisa mengkompilasi ini di Ubuntu 14.04 tapi saya bisa mengkompilasi main(int a,char**b){b++;qsort(*b,strlen(*b),1,strcmp);puts(*b);}mana yang lebih pendek.
gmatht

@ gmatht Saya tidak yakin mengapa itu tidak bisa dikompilasi, itu bisa di sistem saya baik-baik saja. Terima kasih atas petunjuknya BTW!
syb0rg

Tidak suka c(*a, versi gcc saya bersikeras bahwa kita perlu melakukan c(char*asebaliknya.
gmatht

7

fungsi c (lengkung little-endian), 131 108 karakter

Tidak ada tantangan penyortiran yang lengkap tanpa jawaban sleepsort . Yang ini akan memakan waktu hingga 10 detik untuk kembali, tetapi itu berhasil, dan saya pikir itu sepenuhnya dalam spesifikasi. Fungsi ini mengambil param int tunggal dan mengembalikan int dengan digit desimal diurutkan:

c=0,d;
k(i){
    for(;i;i/=10,fork()?c++:(sleep(d),exit(d)))
        d=i%10;
    for(;c--;i=i*10+(d>>8&255))
        wait(&d);
    return i;
}

baris baru dan lekukan ditambahkan agar mudah dibaca

Panggil sebagai berikut:

int main (int argc, char **argv) {
    int i = 52146729;

    printf("%d\n", k(i));
    return (0);
}

2
Bagus. Tapi saya pikir Anda bisa menggunakan variabel global untuk menyimpan beberapa karakter. Selain itu, Anda dapat menggunakannya ?:sebagai gantinya if-else. fork()?c++:(sleep(d),exit(d));
user12205

@ace Terima kasih atas tipsnya! Saya mencoba operator ternary sebelumnya tetapi tergelincir pada (,).
Digital Trauma

6

Jawa: 262 poin

Ya, ya saya tahu, tidak ada harapan, tapi masih ..

class G{Object m(StringBuffer s,int o){for(int i=1;i<s.length();i++){int j=i-1,t=s.charAt(i),u=s.charAt(j);boolean c=o==0?t>u:t<u;for(;j>-1&c;){s.setCharAt(j+1,s.charAt(j));c=--j>-1;c=c?(o==0?t>s.charAt(j):t<s.charAt(j)):c;}s.setCharAt(++j,(char)t);}return s;}}

Analisis (penandaan):

  1. Dimulai dengan 0. (skor = 0)
  2. Total 262 karakter. (skor = 0 + 262 = 262)
  3. +10 - untuk menggunakan StringBuffer(saya menggunakannya karena lebih pendek dari StringBuilder) (skor = 262 + 10 = 272)
  4. -10 - untuk membuat output fleksibel. Saya telah mempertimbangkan 0 = turun , 1 = naik , jadi kembali ke 262!

Pemakaian:

Ketika Anda mencoba dan mengkompilasi G.javafile di command prompt, itu menghasilkan banyak sekali masalah (kesalahan). Jadi solusinya?

Kompilasi G.javakelas dalam IDE suka NetBeansatau Eclipseatau bahkan BlueJ. Itu harus dikompilasi tanpa masalah (mengabaikan peringatan).

Kemudian, kelas ini harus dipanggil dengan main()metode dari kelas lain (atau bahkan kelas itu sendiri). Saya menempatkan kelas lain, jadi saya tidak menambahkannya ke jumlah karakter saya. Kompilasi kelas lain dengan cara yang sama (tanpa menggunakan cmd). Sekarang main()metode di kelas lain harus seperti:

public static void main(String[]a){
    System.out.println(new G().m(new StringBuffer(a[0]),1));
    //for descending, put '0' instead of '1'
}

Tidak termasuk spasi yang tidak perlu, komentar dan jeda baris, ini adalah 93 karakter lainnya. Saya tidak menambahkannya ke karakter saya karena ini hanya untuk demonstrasi melalui konsol.

Keluaran:

NOL yaitu 0dipertimbangkan. Misalkan kelas eksternal Helper.java, dan telah berhasil dikompilasi, beberapa contoh melalui konsol adalah:

INPUT :C: ...> java Helper 008321
OUTPUT:001238

INPUT :C: ...> java Helper 79359105
OUTPUT:01355799

Saat diubah ke 0yaitu menurun ...

INPUT :C: ...> java Helper 008321
OUTPUT:832100

INPUT :C: ...> java Helper 79359105
OUTPUT:99755310

CATATAN:

  1. Saya tidak secara eksplisit mendeklarasikan array apa pun di G.java. Itu adalah kelas inti .
  2. Saya menggunakan jenis penyisipan untuk mengurutkan angka-bijaksana.
  3. Jumlahnya bisa dari panjang maksimum - Integer.MAX_VALUEkarena itu adalah ukuran maksimum yang bisa dimiliki oleh array apa pun (dalam Java).
  4. Jawaban ini dapat dipersingkat (saya percaya) jadi tolong bantu saya (tingkatkan jawaban pertama saya).
  5. Sialkanlah para Dewa besar yang secara tidak sengaja menciptakan bahasa yang begitu panjang namun hebat seperti Jawa (dan juga yang datang dengan konvensi kode)!

5

TeX / LaTeX (332)

Jika kode aktual dimasukkan ke dalam sebuah paket s, maka file LaTeX utama terlihat bagus dan mudah. Angka tersebut hanya diberikan sebagai matematika. Jika angkanya negatif, urutan pengurutan terbalik. Kode paket sjuga dapat digunakan dengan TeX biasa, contoh lebih lanjut di bawah ini.

\documentclass{book}
\usepackage{s}
\begin{document}
  $52146729$

  $-52146729$ % reversed ordering

  $277981468517523153773703292073191466142223027369188752287219582183$
\end{document}

Pakets (satu baris, ujung baris tidak diperlukan):

\TeXXeTstate1\everymath{\aftergroup\B\def~#1{\gdef#1{}\aftergroup#1}
~\a~\b~\c~\d~\e~\f~\g~\h~\i~\j\aftergroup\E\xdef\B{}\xdef\E{}}
\def~#1#2{\mathcode`#1"8000\lccode`~`#1\lowercase{\def~{\xdef#2{#2#1}}}}
~0\a~1\b~2\c~3\d~4\e~5\f~6\g~7\h~8\i~9\j\mathcode`-"8000\lccode`~`-
\lowercase{\def~{\xdef\B{\beginR}\xdef\E{\endR}}}

Hasil:

Hasil

Skor: tanpa harapan

  • Menggunakan TeX biasa dengan etexatau pdftex, file dapat dikurangi menjadi:

    <contents of s.sty>\rm\shipout\hbox{$<number>$}\bye

    Bytes: 318 bytes ( s.sty) + 24 bytes untuk sisanya tanpa nomor

  • Array tidak digunakan: 0

  • Saya tidak melihat string multi-karakter: 0

  • Jumlahnya tidak dibatasi oleh algoritma. Nomor TeX terbesar adalah 2 31 - 1 = 2147483647. Contoh ini menggunakan angka 66 digit, jauh lebih besar: 0

  • Jika minus diberikan, maka urutan penyortiran dikembalikan menjadi menurun: −10

0 + 318 + 24 + 0 + 0 - 10 = 332

Algoritma:

Digit dibuat karakter aktif dalam mode matematika. Setiap digit mengingat dan mengumpulkan setiap penggunaan dalam makro. Setelah mode matematika makro dihasilkan dengan angka dalam urutan menaik.

Perubahan arah dilakukan oleh teks kanan-ke-kiri, fitur e-TeX.

Versi degolfed kode dis.sty

\TeXXeTstate = 1 % enable mixed direction typesetting
\everymath{%
  % \B and \E surround the number, they will be redefined
  % with right-to-left primitives to output the reverted number
  \xdef\B{}
  \xdef\E{}
  \aftergroup\B
  % the active character ~ is defined as help macro;
  % the argument is the collector macro
  \def~#1{%
    \gdef#1{}% initially the macro is empty
    \aftergroup#1%
  }%
  % the ten macros \a to \j form the result number
  ~\a~\b~\c~\d~\e~\f~\g~\h~\i~\j
  \aftergroup\E
}
% the active ~ is used as helper macro;
% first argument is the digit, the second argument is the collector macro
\def~#1#2{%
  \mathcode `#1  = "8000 % make digit active in math mode
  \lccode `~ = `#1 % trick for defining the active digit 
  \lowercase{%
    \def~{%
      \xdef#2{#2#1}% the digit adds itself to its collector macro
    }%
  }%
}
~0\a~1\b~2\c~3\d~4\e~5\f~6\g~7\h~8\i~9\j
% Defining the minus character as switch for descending digits:
\mathcode `- = "8000 % minus sign active in math mode
\lccode `~ = `- % trick for defining the active minus
\lowercase{%
  % the minus sign redefines the wrapper macros \B and \E that
  % surround the result number. These macros now uses
  % primitives for right-to-left typesetting.
  \def~{%
    \xdef\B{\beginR}%
    \xdef\E{\endR}%
  }%
}

Mereproduksi

Ada beberapa kompiler LaTeX online, daftar dapat ditemukan di sini . Saya mencoba item pertama dalam daftar, LaTeX servlet di sciencesoft.at . Itu dapat digunakan tanpa menandatangani dan juga dapat membuat URL permanen: sumber dan hasil sebagai gambar .


Saya tidak punya daging LaTeX untuk menilai ini sendiri. Saya harus mengambil kata-kata Anda untuk itu. :)
kojiro

@kojiro: Ada beberapa kompiler online untuk LaTeX, lihat jawaban yang diperbarui untuk contoh.
Heiko Oberdiek

Ini mengerikan, Heiko. +1! XD
Sean Allred

5

C - 65

r,t,i;s(n){for(;++i;)for(t=n;t;t/=10)r=t%10-i?r:10*r+i;return r;}

Pengamat yang cerdik akan mencatat bahwa algoritma pengurutan ini berjalan dalam waktu O (n) pada jumlah digit di n .

Pengamat pragmatis akan mencatat bahwa algoritma pengurutan ini berjalan dalam waktu yang sebanding dengan kisaran bilangan bulat yang ditandatangani pada platform, bahwa itu mem mutasi negara global yang harus diinisialisasi ulang antara berjalan, dan bahwa banyak pengorbanan lainnya telah dilakukan demi brevity.

Versi ungolfed tidak persis sama, tetapi lebih baik menyampaikan algoritma yang sebenarnya terlibat.

int s(int n)
{
    int r = 0;
    int t;
    int i;
    for(i = 0; i < 10; i++)
    {
        for(t = n; t != 0; t /= 10)
        {
            if(t % 10 == i)
            {
                r = 10 * r + i;
            }
        }
    }
    return r;
}

Berikut ini adalah test harness untuk fungsinya:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    if(argc != 2) return 1;
    printf("%d\n", s(atoi(argv[1])));
    return 0;
}

4

Haskell - 96

96 karakter, tanpa array, tanpa string, tanpa batas integer, tidak dapat dibalik

d=(`divMod`10)
a&(0,0)=a
a&(y,z)=(z%d a)&d y
a%(y,z)|z>a=10*(a%d y)+z|1<3=100*y+10*z+a
s=(0&).d

Contoh:

λ: s 52146729
12245679
λ: s 502010406072952146729521467295214672952146729
1111122222222224444455555666667777799999
λ: s 100
1

Yang ini adalah jenis penyisipan, dilakukan langsung pada bilangan bulat itu sendiri. Ini mirip dengan entri Haskell lainnya yang merupakan semacam gelembung, meskipun saya bersumpah saya sedang mengerjakannya sebelum saya melihat yang itu.

Panduan singkat:

  • dmembagi angka menjadi satuan dan puluhan, yaitu: d 135adalah pasangan(13,5)
  • a%xdiurutkan penyisipan digit ake dalam angkax
  • a&xmengurutkan xdengan memasukkan digit unit ke dalama dan mengulangi hasil dan sisanya
  • s xmengurutkan x dengan memulai &rekursi pada 0 danx

Kuncinya adalah bahwa argumen kedua %dan &tidak xsecara langsung, tetapi xdivMod menggunakand


Bagus. Saya lupa menggunakan infix. Saya mungkin bisa mencukur beberapa karakter dengan cara itu, tetapi Anda mengalahkan saya. +1
bazzargh

3

Python3.3 61 poin

print(''.join(sorted(input())))

Program ini menerima input sebagai string, yang dianggap sebagai string karena tidak segera diubah ke integer. +10

String diurutkan menjadi array +10

Array ini bergabung bersama menjadi string +10

Catatan: The ''digunakan untuk bergabung isi array bukanlah string karakter multi-, sehingga 10 tidak ditambahkan ke skor.

Program ini terdiri dari 31 karakter. +31

31 + 10 + 10 + 10 = 61 poin


+1 meskipun data yang Anda proses tidak pernah berupa angka. (Itu bukan satu-satunya jawaban seperti itu, saya tahu.)
kojiro

Itu tidak secara eksplisit dinyatakan, meskipun dikatakan demikian. Kode asli saya adalah print(int(''.join(sorted(input())))), tetapi pemain untuk integer hanya menambahkan poin dan tidak membuat kode mengikuti aturan lebih dekat. Kurasa aku tidak benar-benar setia pada tantangan. Tapi dia menyatakan bahwa input bisa berupa string, dan outputnya bisa berupa string (untuk pernyataan cetak), dan tidak mengatakan apa-apa di antaranya:]
erdekhayser

3

Skor J, 10 karakter (+ 1 string) = 20

s=./:~&.":

Pemakaian:

   s 52146729
12245679

Bekerja untuk semua angka 32 bit.

Penjelasan:

/:~mengurutkan &.dalam ":format. Versi saya sebelumnya menggunakan array juga, tetapi harganya mahal jadi sekarang saya hanya perlu menggunakan string dan mengurutkan karakter berdasarkan abjad. ":mengonversi angka yang dimasukkan ke dalam string dan /:~mengurutkan digit ke dalam urutan menaik. Karena pengurutan dilakukan dalam format 'di bawah', ketika pengurutan selesai, string diubah kembali menjadi angka. Menambahkan kemampuan untuk membalikkan mungkin akan lebih mahal daripada menghemat, jadi saya tidak repot-repot.

Argumen dapat dibuat bahwa karena J, seperti APL dan K, adalah bahasa berbasis array, input tunggal adalah array dari 1 item, tetapi saya memilih untuk tidak mengambil pandangan yang keras saat menghitung skor saya.

Batas 32-bit diberlakukan oleh J, daripada program saya. Setiap yang lebih tinggi dan J mengalihkan angka ke notasi ilmiah. Tidak jelas dari pertanyaan apakah hukuman 32 poin berlaku dalam kasus ini, tetapi bahkan jika kedua hukuman sebelumnya berlaku (saya pikir mereka tidak seharusnya) skornya naik menjadi 72 dan masih dengan nyaman mengalahkan sebagian besar yang lain jawaban.


Bisakah Anda memberikan penjelasan? Ini terlihat seperti memformat angka sebagai string, membelah menjadi array, menyortir array, kemudian memformatnya sebagai string ... tidak adakah penalti untuk array & string?
bazzargh

@bazzargh Saya sengaja tidak menyatakan skor ketika saya mengirimkan jawaban saya karena dua alasan: 1) itu ditandai [kode-golf] sehingga bonus tidak benar-benar masuk akal, dan 2) tidak jelas bagi saya yang akan berlaku . Saya akan menambahkan penjelasan.
Gareth

Tag apa yang harus saya gunakan? Ini golf kode dengan penalti ...
kojiro

@kojiro - arahkan mouse ke tag kode-golf yang memberitahu Anda - tantangan kode.
bazzargh

3

Python 2.7: 174

import math
i=input()
d={n:0for n in xrange(10)}
for n in(i/10**c%10for c in xrange(1+math.log10(i))):d[n]+=1
print"".join(str(n)for n in xrange(10)for c in xrange(d[n]))
  • Tidak ada array (bukan iterator dan kamus yang digunakan)
  • Tidak ada string multi-karakter (kecuali output)
  • Tidak ada jumlah digit buatan maksimum
  • Tidak ada pembalikan

Ini bekerja dengan membuat kamus memetakan semua 10 digit menjadi 0. Kemudian ia mengulangi panjang angka ( log10(i)), mengekstraksi setiap digit ( (i / (10 ** c)) % 10), dan menambah penghitung untuk digit itu dalam kamus. Akhirnya ia menciptakan string yang dibuat dengan mengulangi semua 10 digit, dan untuk setiap digit menghasilkan satu instance dari digit sebagai string.

Saya bisa mengubah baris terakhir print"".join(d[n]*str(n)for n in xrange(10))yang kurang dari 16 karakter, tetapi akan menggunakan string multi-karakter.


i=int(input())dapat sama i=input()seperti input()secara otomatis evals nomor tersebut.
user80551

@ user80551: Ya, tentu saja! Panggilan yang bagus.
Gabe

3

C (hingga C90) atau C ++, 78 66 poin

Fungsi jadi semacam integer disebut s.

s(i){t=10,a=i?s(i/t):0,b=i%t,c=a%t;return c>b?t*s(a-c+b)+c:t*a+b;}

Mencetak:

  • 66 Karakter (+66)
  • 0 array (+0)
  • 0 string (+0)
  • Rentang yang ditentukan oleh mesin (ukuran int ) (+0)
  • Hanya satu arah penyortiran (-0)

Versi lama (78 poin, berfungsi juga dengan C ++ dan lebih banyak versi C modern)

int s(int i){int t=10,a=i?s(i/t):0,b=i%t,c=a%t;return c>b?t*s(a-c+b)+c:t*a+b;}

3

C # - 179

using System.Linq;class S{void Main(string[] a){Console.Write(string.Concat(string.Concat(a).Replace("-","").OrderBy(o=>a[0].Contains('-')?-o:o)));}}

Tidak bermain golf

using System.Linq;

class S
{
    void Main(string[] a)
    {
        Console.Write(string.Concat( 
            string.Concat(a)
                .Replace("-", "")
                .OrderBy(o => a[0].Contains('-') ? -o : o )));
    }
}

Uji

Normal:

app.exe 52313698

Terbalik:

app.exe 52313698-

Poin: (Saya harap saya mengerti sistem poin dengan benar - jangan ragu untuk memperbaiki)

  • Chars: 149
  • String: 10 + 10
  • Array: +20
  • Pesan: -10
  • Total: 149 + 10 + 20-10 = 179

C # dengan LINQPAD - 123

void Main(string[] a){Console.Write(string.Concat(string.Concat(a).Replace("-","").OrderBy(o=>a[0].Contains('-')?-o:o)));}

Uji

Normal:

lprun.exe sorta.linq 52313698

Terbalik:

lprun.exe sorta.linq 52313698-

Poin:

  • Chars: 122
  • String: 10 + 10
  • Array: +20
  • Pesan: -10
  • Total: 122 + 10 + 20-10 = 152

3

Jawa 1469

Solusi bebas string dan array di Jawa. 1437 karakter + 32 karena hanya membutuhkan waktu hingga Long.MAX_VALUE sebagai input. Dengan menggunakan Double, saya bisa menggunakan lebih dari 300 digit, tetapi itu terlalu membosankan untuk diterapkan. Apa pun yang lebih besar dari itu akan membutuhkan BigInteger dan AFAIK yang menggunakan array secara internal. Jika Anda menggunakan kurang dari 19 digit untuk input, output akan memiliki angka nol di depannya. Input negatif akan memberikan semua nol dan apa pun yang bukan angka akan menyebabkan pengecualian.

Untuk jenis yang saya gunakan paling mudah yang bisa saya pikirkan sehingga sangat tidak efisien. (harus O (n * n))

input:  9212458743185751943
output: 1112233444555778899

Saya tahu ini tidak benar-benar dibandingkan dengan solusi dalam bahasa lain tetapi saya merasa ini setidaknya adalah yang terpendek yang bisa saya dapatkan di Jawa. (jika ada yang tahu bagaimana cara mendapatkan ini lebih pendek merasa bebas untuk mengedit / komentar)

class D
{
    long c,d,e,f,g,h,k,l,m,n,o,p,q,r,s,t,u,v,w;
    long x;

    public D(Long a)
    {
        x = a;
        c = g();
        d = g();
        e = g();
        f = g();
        g = g();
        h = g();
        k = g();
        l = g();
        m = g();
        n = g();
        o = g();
        p = g();
        q = g();
        r = g();
        s = g();
        t = g();
        u = g();
        v = g();
        w = g();
        int i=0;
        while(i++ < 19) s();
        System.out.printf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",c,d,e,f,g,h,k,l,m,n,o,p,q,r,s,t,u,v,w);
    }

    long g()
    {
        if( x <= 0 ) return 0;
        long b = x % 10;
        x = x / 10; 
        return b;
    }

    void s()
    {
        if(c > d) {c += d; d = c - d; c -= d;}
        if(d > e) {d += e; e = d - e; d -= e;}
        if(e > f) {e += f; f = e - f; e -= f;}
        if(f > g) {f += g; g = f - g; f -= g;}
        if(g > h) {g += h; h = g - h; g -= h;}
        if(h > k) {h += k; k = h - k; h -= k;}
        if(k > l) {k += l; l = k - l; k -= l;}
        if(l > m) {l += m; m = l - m; l -= m;}
        if(m > n) {m += n; n = m - n; m -= n;}
        if(n > o) {n += o; o = n - o; n -= o;}
        if(o > p) {o += p; p = o - p; o -= p;}
        if(p > q) {p += q; q = p - q; p -= q;}
        if(q > r) {q += r; r = q - r; q -= r;}
        if(r > s) {r += s; s = r - s; r -= s;}
        if(s > t) {s += t; t = s - t; s -= t;}
        if(t > u) {t += u; u = t - u; t -= u;}
        if(u > v) {u += v; v = u - v; u -= v;}
        if(v > w) {v += w; w = v - w; v -= w;}
    }

    public static void main(String[] y)
    {
        D d = new D(Long.parseLong(y[0]));
    }
}

2

AWK - 101

File 'x':

BEGIN{n=ARGV[1]
r=ARGV[2]
for(d=r;d<10;d++)for(p=1;p<=length(n);p++){D=r?d:9-d
if(D==substr(n,p,1))printf D}print}

Lari:

$ awk -f x 52146729
97654221
$ awk -f x 52146729 0
97654221
$ awk -f x 52146729 1
12245679
$ awk -f x 1234567890123456789012345678901234567890
9999888877776666555544443333222211110000
$ awk -f x 1234567890123456789012345678901234567890 1
111122223333444455556666777788889999

Satu-satunya array yang digunakan adalah ARGV dan ini tidak membantu dalam penyortiran, itu hanya akses ke parameter commandline dan nilai-nilai ini dalam variabel non-array di mana sebenarnya diperlukan untuk perhitungan. Saya pikir ini tidak akan dihitung terhadap solusi ini. Perhitungan berikut ini tidak memperhitungkan ARGV-array:

111 (karakter) - 10 (dapat melakukan terbalik)


Terkadang satu-satunya jawaban yang masuk akal bagi dunia yang gila adalah kegilaan. - Fox Mulder
kojiro

:-D Memang! :-D

2

Saya tidak melihat apa-apa tentang fungsi penyortiran dalam pertanyaan, jadi ... (Saya akan menghapus jawaban jika itu membengkokkan atau melanggar aturan, beri tahu saya)

JavaScript 56 96

function s(){alert(+prompt().split('').sort().join(''))}

JavaScript 69 109 (dapat dibalik)

function s(r){x=prompt().split('').sort();x=r?x.reverse():x;alert(+x.join(''))}

Dapat diturunkan sedikit menggunakan fungsi panah EcmaScript 6 :

ES6 50 90

s=()=>{alert(+prompt().split('').sort().join(''))}

ES6 63 103 (dapat dibalik) (73-10)

s=(r)=>{x=prompt().split('').sort();x=r?x.reverse():x;alert(+x.join(''))}

promptmengembalikan sebuah string (yang tidak segera Anda konversi menjadi integer): +10; splitmengembalikan array: +20; sortmelakukan sortir di tempat (jadi masih array yang sama); joinmengembalikan string baru, +10. Total: 96.
kojiro

Bagaimana aturan itu dituliskan membuat saya mengerti bahwa hanya literal yang dihitung. Memperbarui skor, pokoknya.
Niccolò Campolungo

2

SED 67 Chars (skor 67 atau 107)

s/$/;0123456789/;:a;s/\(.\)\(.\)\(.*;.*\2.*\1\)/\2\1\3/;ta;s/;.*//;

Ini menggunakan semacam gelembung untuk singkatnya. Skor akan menjadi 107 jika setiap pola ekspresi reguler dan jumlah penggantian sebagai string (yaitu 67 + (10 * 4))

Jumlah digit yang ditangani dibatasi oleh memori (dan mungkin kesabaran)


2

Fungsi python lambda (reversibel), 69

lambda n,d:''.join(sorted(n,reverse=d))
  • 39 karakter (+39)
  • Dua string multi-char: n(input) dan''.join(...) (+20)
  • Satu daftar: sorted(...) (+20)
  • Dapat membalikkan arah tergantung pada parameter d (-10)

Fungsi python lambda (tidak dapat dibalik), 67

lambda n:''.join(sorted(n))

EDIT: Input harus berupa string. Saya sedang mempertimbangkan hukuman menggunakan string itu secara langsung.


Saya mengklarifikasi permainan sedikit di atas, terutama tentang menggunakan jenis bawaan. Generator mungkin OK, tetapi bantuan Python (untuk 2 dan 3 keduanya) dengan jelas menyatakan raw_input([prompt]) -> string, demikian sorted(raw_input())juga +10. Juga sorted -> new sorted list, jadi +20. Lalu,, S.join -> stringjadi +10 lagi. Notasi slice juga menyiratkan string, jadi +10 (apa pun yang mendukung notasi slice bisa jadi +20). Jadi saya menghitung masing-masing 73 dan 108.
kojiro

@kojiro Tolong jelaskan: Dapatkah saya menggunakan fungsi yang mengambil string nomor sebagai argumen (Saya menerima penalti). Bisakah saya menggunakan fungsi yang printbukan return?
user80551

Silakan lihat catatan 4. (Meskipun pada catatan khusus, saya ingin tahu mengapa Anda tidak menggunakan di lambdasini.)
kojiro

1
@ Kojiro Masalah utama saya tentang print / return adalah itu print lebih pendek dan tidak memerlukan pembungkus. Saya tidak tahu bahwa Anda akan mengizinkan fungsi lambda. Agak facepalmed ketika saya membaca itu. Apakah ini benar?
user80551

''.join(sorted(str(n))).bisakah Anda memberi tahu saya mengapa ini tidak dianggap sebagai jawaban? Saya agak baru
Alok

2

Gangguan Umum - 126

(defun s(n p)(labels((a(n)(if(= 0 n)()(cons(mod n 10)(a (floor n 10)))))(b(a)(if(null a)0(+(car a)(* 10(b(cdr a)))))))(b(sort(a n) p))))

Versi ungolfified (gaya dan leksikal, tetapi identik):

(defun sorta (n p)
  (labels ((digits (n)
             (unless (zerop n)
               (multiple-value-bind (quotient remainder)
                   (truncate n 10)
                 (cons remainder (digits quotient)))))
           (digit-cat (digits)
             (if (null digits)
                 0
               (+ (car digits)
                  (* 10 (digit-cat (cdr digits)))))))
    (digit-cat (sort (digits n) p))))

Digit dari angka negatif diperlakukan sebagai memiliki nilai negatif, dan digit diurutkan paling tidak signifikan-pertama (yaitu, little-endian). Contoh:

CL-USER> (sorta 1234 #'<)
=> 4321
CL-USER> (sorta 12344321 #'<)
=> 44332211
CL-USER> (sorta 12344321 #'>)
=> 11223344
CL-USER> (sorta -12344321 #'>)
=> -44332211
CL-USER> (sorta 0 #'>)
=> 0
CL-USER> (sorta 8675309 #'<)
=> 9876530

Ada 136 karakter dalam versi golf, termasuk spasi. Ia tidak menggunakan string dan array, dan menangani bilangan bulat presisi arbitrer, termasuk bilangan bulat negatif. Penyortiran ini diparameterisasi pada predikat biner yang mendefinisikan pemesanan total pada bilangan bulat di [-9, 9], termasuk tetapi tidak terbatas pada <dan >:

CL-USER> (sorta 3546219870 (lambda (a b)
                             (cond ((and (evenp a)
                                         (oddp b))
                                    t)
                                   ((and (evenp b)
                                         (oddp a))
                                    nil)
                                   (t
                                    (< a b)))))
=> 9753186420

Ini memberikan skor 126.


2

JavaScript 416/185

Tanpa Array, tanpa String, tanpa batasan panjang sembarang ...

Tetapi mengurutkan atas / bawah akan menggunakan lebih dari 10 karakter ^^ Tapi saya menemukan ide untuk menghitung angka dan mencetaknya menarik - mungkin seseorang dapat menggunakan ide ini dalam GolfScript dan memenangkan hadiah ;-)

var x=window.prompt(),y=0,z=0,a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;
do
{
    z=x%10;
    x=(x-z)/10;
    if(!z)a++;
    if(z==1)b++;
    if(z==2)c++;
    if(z==3)d++;
    if(z==4)e++;
    if(z==5)f++;
    if(z==6)g++;
    if(z==7)h++;
    if(z==8)i++;
    if(z==9)j++;
}while(x);

while(a--)y=y*10;
while(b--)y=y*10+1;
while(c--)y=y*10+2;
while(d--)y=y*10+3;
while(e--)y=y*10+4;
while(f--)y=y*10+5;
while(g--)y=y*10+6;
while(h--)y=y*10+7;
while(i--)y=y*10+8;
while(j--)y=y*10+9;

alert(y);

Kode yang sama lebih pendek, menggunakan eval: (tapi itu kemungkinan akan dianggap menggunakan string ...)

var i = window.prompt(),o=0,i0=0,i1=0,i2=0,i3=0,i4=0,i5=0,i6=0,i7=0,i8=0,i9=0;
do
{
    eval("i"+i%10+"++");
    i = ~~(i/10);
} while (i > 0)

for(var j=0;j<10;j++) while (eval("i"+j+"--")>0) o = o*10+j;

alert(o);

Anda dapat mempersingkat versi yang lebih panjang hingga 30 byte dengan menggunakan nama 1-karakter, bukan iN.
Glenn Randers-Pehrson

@ GlennRanders-Pehrson Terima kasih :-)
Falco

Kenapa semua titik koma? Dan siapa yang peduli dengan indentasi?
CalculatorFeline

1

C (222)

static int a[10],r=1;o(n,c){while(n--)printf("%""i",c);}p(){int n;for(n=r<0?9:0;n>=0&&n<10;n+=r)o(a[n],n);}main(int _,char**v){char*s=v[1];if(*s=='-'){r=-1;++s;}do++a[*s-'0'];while(*++s);p();}

Poin:

  • 192 (192 Chars)
  • 40 (2 Array: argv (v) dan a)
  • 0 (tanpa string multi karakter)
  • 0 (tidak terbatas pada n digit)
  • -10 (sortir terbalik jika angka (argv [1]) negatif)

    = 222 Poin

Bendera yang dibutuhkan untuk menyingkirkan 1000 peringatan kompiler: gcc -Wno-implicit-function-declaration -Wno-return-type -Wno-implicit-int -Wno-char-subscripts -o count2 counta2.c

"Lebih baik" dapat dibaca:

static int a[10],r=1;
o(n,c){while(n--)printf("%""i",c);}
p(){int n;for(n=r<0?9:0;n>=0&&n<10;n+=r)o(a[n],n);}
main(int _,char**v){char*s=v[1];if(*s=='-'){r=-1;++s;}do++a[*s-'0'];while(*++s);p();}

Agak tidak terserang:

static int a[10],r=1;
o(n,c){
    while(n--) printf("%""i",c);
}
p(){
    int n;
    for(n=r<0?9:0;n>=0&&n<10;n+=r) o(a[n],n);
}
main(int _,char**v){
    char*s=v[1];
    if(*s=='-'){
        r=-1;
        ++s;
    }
    do ++a[*s-'0']; while(*++s);
    p();
}

Mengapa menggunakan "%""i"bukan "%i"? Mereka mengkompilasi untuk hal yang sama, jadi Anda hanya membuang dua karakter.
Gabe

@ Gabe Ya saya membuang 2 Chars tetapi "% i" adalah "multi char string" (10 Poin) di mana "%" "i" tidak ... setidaknya itulah yang diperdebatkan orang di sini ...
maks. haredoom

1

Apakah ada alasan saya tidak melihat solusi ini?

Rubi

pry(main)> 52146729.to_s.split("").sort.join.to_i
=> 12245679

Saya tidak yakin bagaimana cara mencetak ini. Perpecahan akan menghasilkan array, tetapi di luar itu tidak yakin .. 38 karakter + 2x20 untuk array? Atau haruskah itu mencakup semua array yang mungkin dibuat semacam itu secara internal?


1

VBScript - 76 (96?)

x = "7892347684578892348025023389054859034234"

for i=0 to 9:n=n&string(len(x)-len(replace(x,i,"")),""&i):next:x=n

' x -> 00002222233333344444455556777888888889999

66 karakter + 10 untuk penggunaan string n
(Tidak tahu apakah penggunaan replacefungsi danstring fungsi yang mengembalikan n jumlah karakter x dihitung sebagai string tambahan).

Ini menghitung jumlah digit tertentu dengan membandingkan panjang string asli dengan string yang sama dengan digit tertentu yang diganti. Kemudian ia menempelkan jumlah digit itu ke n.


1

Python 3 sleepsort (168)

Tanpa daftar atau loop, hanya generator.

import math, threading
n=input()
if any(threading.Timer(x,lambda x:print(x,end='',flush=1),(x,)).start()for x in(n//10**i%10for i in range(math.log10(n)//1+1))):pass

mungkin bisa ditingkatkan.


1

Raket 97

97 poin (87 +20 untuk dua string, -10 untuk pengurutan, tidak ada array)

(define(s n <)(string->number(list->string(sort(string->list(number->string n))<))))

Ini menggunakan daftar karakter sehingga Anda harus memberinya fungsi perbandingan karakter seperti char<?atau char>?. Saya merasa ini juga lulus sebagai ungolfed karena tidak banyak yang harus dilakukan selain menambah spasi dan menambah nama variabel. Versi lama saya mungkin lebih terhormat :)

Versi lama tanpa string:

110 poin (120 byte (utf-8) - 10 untuk memungkinkan perubahan urutan sortir. Tidak menggunakan string dan tidak ada array)

(define(S d <)(foldl(λ(x a)(+(* a 10)x))0(sort(let L((l'())(
d d))(if(= d 0)l(L(cons(modulo d 10)l)(quotient d 10))))<)))

Tidak Disatukan:

(define (number-digit-sort number <)
  (foldl (λ (x a) (+ (* a 10) x))
         0
         (sort (let loop ((acc '()) (number number))
                 (if (= number 0)
                     acc
                     (loop (cons (modulo number 10) acc)
                           (quotient number 10))))
               <)))

Saya mengujinya dengan nomor fibonacci 100.000:

(number-digit-sort (fibonacci 100000) <)
;==> 1111... basically it's the digits:
; 1 2135 times
; 2 2149 times
; 3 2096 times
; 4 2023 times
; 5 2053 times
; 6 2051 times
; 7 2034 times
; 8 2131 times
; 9 2118 times

Dan hal yang sama dalam urutan yang berlawanan:

(number-digit-sort (fibonacci 100000) >)
; ==> 999... and the digest is
; 9 2118 times
; 8 2131 times
; 7 2034 times
; 6 2051 times
; 5 2053 times
; 4 2023 times
; 3 2096 times
; 2 2149 times
; 1 2135 times
; 0 2109 times
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.