Hitung Perubahan Saya


21

Tugas Anda adalah mengurutkan array yang berisi string "quarter", "dime", "nickel", dan "sen" berapa kali tanpa urutan tertentu dan mengurutkannya sehingga mereka berada dalam urutan ini: quarter dime nickel penny(dengan kata lain, terbesar ke nilai moneter paling kecil).


Aturan

  1. Program Anda harus mengambil array sebagai input yang berisi nama-nama koin AS dan mengurutkannya dari yang terbesar hingga yang paling kecil berdasarkan nilai moneter.
    • Bagi mereka yang bukan dari AS atau tidak menggunakan perubahan, nilai-nilai koin AS, dari yang terbesar hingga yang terkecil, adalah:
      • Kuartal: 25 sen
      • Dime: 10 sen
      • Nikel: 5 sen
      • Penny: 1 sen
  2. Anda dapat mengurutkan array ini dengan cara apa pun yang Anda inginkan, selama output diurutkan berdasarkan nilai moneter yang ditunjukkan di atas.
  3. Input dapat diambil dengan cara apa pun, baik itu argumen baris perintah atau STDIN.
  4. Array input adalah semua string huruf kecil, seperti ini:
    • quarter dime nickel nickel quarter dime penny penny
  5. Format input dan output yang sebenarnya terserah Anda.

Uji Kasus

"penny nickel dime quarter" 
-> "quarter dime nickel penny"

"nickel penny penny quarter quarter quarter dime dime dime dime"
-> "quarter quarter quarter dime dime dime dime nickel penny penny"

"quarter dime nickel nickel quarter dime penny penny"
-> "quarter quarter dime dime nickel nickel penny penny"

Ini adalah , jadi aturan & celah standar berlaku.



1
Semua kasus uji harus mencakup keluaran. Di ponsel kasus kedua dan ketiga ditampilkan dalam dua baris, jadi sepertinya baris kedua adalah output
Luis Mendo

4
saya kanada, dapatkah saya berasumsi input tidak memiliki uang? ;)
undergroundmonorail

1
@undergroundmonorail Sayangnya, tidak.
ckjbgames

1
Apa yang terjadi pada orang gila dan setengah dolar?
Adám

Jawaban:


26

Japt , 5 3 byte

ñg9

Uji secara online!

Penjelasan

Saya juga telah menambahkan fungsi penyortiran ke bahasa saya dalam beberapa minggu terakhir :-) ñmengambil array dan fungsi dan mengurutkan array seolah-olah setiap item telah dipetakan melalui fungsi itu.

The gfungsi pada string mengambil di sejumlah ndan kembali dengan narang th dalam string, pembungkus jika nnegatif atau melewati akhir string. String dengan demikian dapat disejajarkan sebagai berikut:

quarterquarter...
dimedimedimedi...
nickelnickelni...
pennypennypenn...

Karakter ke-9 (0-diindeks) dari setiap string telah disorot dalam huruf tebal. Ini dalam urutan yang benar, jadi yang harus kita lakukan adalah ñg9. (Meskipun sekarang aku melihatnya kembali, ñg5akan bekerja juga ...)


Ini juga harus bekerja dengan 5, saya pikir.
FlipTack

@FlipTack Ya, saya hanya memperhatikannya sendiri. Bukan berarti itu membuat perbedaan ;-)
ETHproduk

Ini. Tidak bisa. Menjadi. Dikalahkan.
ckjbgames

1
@ckjbgames Dennis tidak memposting jawaban apa pun ;-)
ETHproductions

1
@ ETHproductions Dia mungkin akan melakukannya. Tunjukkan saja kepadanya pertanyaan ini.
ckjbgames

8

V , 7 byte

ú/¨qu©¿

Cobalah online!

Ini menggunakan perintah sortir spiffy baru yang saya tambahkan ke V sekitar seminggu yang lalu ( ú). Waktu yang manis!

Cara kerjanya adalah dengan menyortir setiap baris dengan penyortiran default (nilai ASCII) tetapi mengabaikan kecocokan pertama dari regex tertentu. Dalam hal ini, regex adalah (qu)?, meskipun memiliki beberapa hal non-ASCII kotor untuk menghindari penggunaan backslash. Jika Anda mengabaikan dua huruf pertama dari "quarter", itu dimulai dengan 'a', dan kemudian semua koin sudah dalam urutan abjad.

Versi yang tidak bersaing, 4 byte

ú!/.

Fitur ini sudah diterapkan, tetapi saya belum mengujinya secara luas sehingga memiliki bug yang saya sadari hanya karena tantangan ini. Tidak ada tautan TIO karena TIO sedikit ketinggalan.

Ini berfungsi dengan membalikkan menyortir setiap baris tetapi mengabaikan karakter pertama pada setiap baris.


8

Python, 36 byte

lambda a:a.sort(key=lambda x:x[-5:])

Fungsi tanpa nama yang mengurutkan daftar di tempat oleh fungsi kunci yang diberikan.

Irisan setiap nama koin kemudian, arter, dime, ickel, dan penny- yang dalam abjad (atau lebih penting, ordinal) order.


Oh oops - jika saya tidak mendapatkan jalan elyang salah di sekitar saya merindukan c: p
Jonathan Allan


6

Python 3 , 42 41 38 byte

Fungsi lambda tanpa nama yang mengambil input sebagai daftar string, diurutkan di tempat.

(Outgolfed oleh Jonathan Allan)

lambda x:x.sort(key=lambda s:(s*2)[5])

Cobalah online!

Solusi lain yang saya mainkan:

lambda x:x.sort(key=lambda s:s*(s<'q'))
lambda x:x.sort(key=lambda s:(s+'pi')[5])
lambda x:x.sort(key=lambda s:ord(s[3])%16)

5

PowerShell , 21 byte

$args|sort{($_*3)[9]}

Cobalah online!

Penjelasan

Tanpa malu-malu mencuri algoritma dalam jawaban ETHproductions (pada dasarnya). Saya mengalikan setiap string dengan 3, lalu mengurutkan berdasarkan karakter ke-9 dari string yang dihasilkan.


Apa yang ada $_di PowerShell?
ckjbgames

@ckjbgames Dalam pipeline, di dalam scriptblock, ini merujuk ke item saat ini. Jadi sesuatu seperti 1,2,3,4 | ForEach-Object { $_*2 }akan menampilkan setiap angka 2 kali; blok skrip dijalankan sekali per item input.
briantis

Itu masuk akal.
ckjbgames

5

Jelly , 4 byte

6ịµÞ

Cobalah online! (footer,,ÇYbergabung dengan daftar yang dihasilkan dengan umpan garis untuk hasil cetakan yang lebih bagus.)

Bagaimana?

6ịµÞ - Main link: list of strings
  µ  - monadic chain separation
   Þ - sort the list of strings by the monadic function:
6ị   - the sixth index - Jelly indexing is modular and 1-based

Indeks Nth dari daftar di Jelly adalah item N mulai dari kiri, dihitung dari 1, dan kembali ke awal ketika diperlukan. (Angka 0 di sebelah kanan, yang ke-1 di sebelah kiri dan seterusnya juga).

Jadi karakter keenam ['d','i','m','e']adalah 'i'karena enam kongruen dengan dua modulo empat.

Karakter keenam dari empat koin secara berurutan adalah quart er, d ime, nicke l, enny p. Ini dalam urutan abjad (atau lebih penting, ordinal).


Cara lain untuk mencapai hal yang sama akan urutkan berdasarkan string diputar dengan ṙ5µÞ, di mana berputar ke kanan, membuat string erquart, imed, lnicke, dan penny.


5

Python , 32 byte

lambda s:s.sort(key="npr".strip)

Cobalah online! Urutkan daftar di tempat.

Idenya adalah menggunakan fungsi kunci penyortiran tanpa a lambda. Calon yang baik adalah x.strip, yang mengambil string xdan menghilangkan sisi kiri dan kanan semua karakter dalam input. Sebagai contoh "abcdef".strip("faces") == "bcd",.

Metode ini "npr".stripmengambil:

quarter ->  np
dime    ->  npr
nickel  ->  pr
penny   ->  r

yang diurutkan secara leksikografis. Saya menemukan string nprdengan kekerasan. npudan nptjuga bekerja, dan tidak ada yang lebih pendek.


5

Bash (+ coreutils) 11 byte

Golf

sort -rk1.2

Bagaimana itu bekerja

Urutkan terbalik, dengan "tombol sortir" dari karakter kedua dari bidang pertama (kata) hingga akhir baris, yaitu:

uarter
ime
ickel
enny

Uji

>echo penny nickel dime quarter|tr ' ' '\n'|sort -rk1.2

quarter
dime
nickel
penny

Cobalah secara Online!


4

CJam , 8 byte

q~{5=}$p

Cobalah online!

Penjelasan

q~        Get and eval all input (array of coin names)
  {5=}$   Sort the array by the 5th index of each element (array indices loop in CJam)
       p  Print the result



3

V , 8 7 byte

1 byte disimpan berkat @DJMcMayhem

Úçq/:m0

[Coba online!]

Lihat jawaban @ DJMcMayhem dalam V ( 1 0 byte lebih pendek dari milik saya)

Cobalah online!

Ú                    " sort all lines "
 ç                   " globally "
  q/                 "  where there a q is matched, "
    :m0              "  move it to the top of the buffer "

Berikut adalah solusi yang lebih tua pada 1 byte lebih besar, tetapi saya sangat menyukainya.

V , 8 byte

Ú/q
dGHP

[Coba online!]

Cobalah online!

Penjelasan

Ú        " sorts the lines

Sekarang buffer akan berada dalam format ini:

dimes
nickels
pennies
quarters

Satu-satunya yang tersisa untuk dilakukan sekarang adalah memindahkan perempat ke atas.

/q      " search for a q "
dG      " delete everything from the first quarter to the end of buffer "
HP      " and paste it at the top of the buffer

Anda dapat melakukan :m0solusi alternatif Anda untuk menghemat satu byte (dan mengikat saya)Úçq/:m0
DJMcMayhem

@DJMcMayhem Terima kasih, TIL tentang:move
Kritixi Lithos


1

T-SQL, 41 36 34 byte

select*from @ order by right(a,5)

Penjelasan

Asumsikan input telah dimuat sebelumnya dalam variabel tabel bernama @, dengan satu kolom bernama a, di mana setiap nilai adalah satu koin yang akan diurutkan.

The select * from @Bagian adalah boiler-plate 'mendapatkan semua nilai untuk kembali'. Sihir yang nyata terjadi di order byklausa.

Menggunakan strategi yang sama seperti Johnathan Allan , saya urutkan berdasarkan lima karakter terakhir (SQL akan mengembalikan seluruh string kalau terlalu pendek): arter, dime, ickel, penny.


qadalah huruf berikutnya setelah itu p, jadi untuk mod sederhana untuk menghasilkan qkurang dari pnilai perlu menjadi faktor q, yang prima. Anda dapat mengurangi 1 terlebih dahulu dan kemudian modulus 7 akan bekerja, tetapi itu mungkin akan memakan waktu setidaknya sebanyak byte sebanyak 113.
Neil

@Neil Ya, saya menyadari bahwa menjadi yang utama menghancurkan upaya saya untuk mengurangi jumlah. Melakukan -1 dan kemudian mod 7 adalah lebih banyak byte (termasuk tanda kurung yang diperlukan.
Brian J

1

JavaScript (ES6), 35 33 byte

a=>a.sort(([,...a],[,...b])=>b>a)

Uji kasus


1

Befunge, 158 byte

~:0`v0v4<~_
9:%8_^>8*`^1p9\+1g
$:!#@_1-0" ynnep">:#,_>
1-0" lekcin">:#,_>$:!#^_
" emid">:#,_>$:!#^_1-0
>:#,_$1>-:!#^_0" retrauq"
*84g9< ^*84g91-*84g94-*84g96-

Cobalah online!

Pemrosesan string dan pemilahan bukan jenis hal yang biasanya ingin Anda coba di Befunge, tetapi solusi ini mengambil keuntungan dari pengamatan John Kasunich bahwa kita sebenarnya tidak perlu memilah apa pun. Kami hanya menghitung jumlah kemunculan dari setiap koin (yang dapat dengan mudah ditentukan dari karakter pertama), dan kemudian menampilkan banyak dari setiap nama koin dalam urutan yang sesuai.

Sama sekali tidak bersaing dengan bahasa lain dalam hal ukuran, tetapi pendekatan ini setidaknya lebih baik daripada jika kita mencoba menangani tantangan sebagai latihan menyortir string.



1

APL (Dyalog APL) , 11 byte

Mengambil dan mengembalikan daftar string.

{⍵[⍋↑5⌽¨⍵]}

Cobalah online!

{ fungsi anonim:

⍵[... ] argumen diindeks oleh

 indeks naik dari

 matriks yang barisnya adalah bantalan

5⌽ diputar lima langkah

¨⍵ item dari argumen

}



1

Sekam , 3 byte

Öṙ9

Cobalah online!

Diporting dari jawaban Brachylog saya, yang merobek jawaban Japt ETHproductions tetapi bukan terjemahan yang tepat karena menggunakan rotasi alih-alih sederhana mengakses elemen-n. Di sana, saya melakukannya karena tidak membiarkan Anda mengindeks melewati akhir input (yang mungkin cukup membantu dalam banyak keadaan karena sifat deklaratif bahasa). Dalam Husk, ! tidak membiarkan Anda indeks melewati ujung input, dengan membungkus di sekitar modular yang sama bahwa Japt ñg9menggunakan, tapi itu dari 1 sehingga program ini khususnya akan berakhir menjadi satu byte lagi: Ö!10.

Ö      Sort by
 ṙ     rotation by
  9    9.

0

Batch, 82 byte

@for %%c in (quarter dime nickel penny)do @for %%a in (%*)do @if %%a==%%c echo %%c

Membawa input sebagai argumen baris perintah dan output ke STDOUT. Berfungsi dengan menggabungkan daftar yang dihasilkan dari penyaringan daftar asli pada setiap koin.


0

Ruby, 34 byte

->m{m.sort_by{|c|c[1..2]}.reverse}

input dan output sebagai array string


0

Ruby, 31 byte

->s{s.sort_by{|i|i[1]}.reverse}

Ini tidak akan selalu mengurutkan "nikel" dan "dime" dengan benar.
daniero

0

Ruby, 30 byte

->m{m.sort_by{|s|s[3].ord^16}}

Angka ajaib ditemukan dengan coba-coba. Agak canggung, tetapi lebih pendek daripada menggunakan .reverse.


0

Perl 6 ,  40 36  34 byte

*.sort: {(<q d n p>Zxx 1..*).Bag{~m/./}}

Cobalah

*.sort: {%(<q d n p>Z=>1..*){~m/./}}

Cobalah

*.sort: {%(<q d n p>Z=>^4){~m/./}}

Cobalah

Diperluas:

*\            # WhateverCode lambda ( this is the parameter )

.sort:        # sort using the following code block

{             # bare block lambda with implicit parameter 「$_」

  %(          # treat this list as a hash

    <q d n p> # list of first characters
    Z[=>]     # zipped using pair constructor
    ^4        # Range from 0 up-to 4 ( excludes 4 )

  ){          # get the value associated with this key

    ~m/./     # regex which gets the first character ( implicitly from 「$_」 )

  }

}

0

Mathematica, 50 byte

Flatten@{Last@#,Most@#}&@Split@Sort@StringSplit@#&

0

RProgN , 18 byte

~{3mtt¢\3mtt¢>}$

Dijelaskan

~               # Zero Space Segment
 {            } # Anonymous Function
  3m            # Repeat the inputted string 3 times
    tt¢         # And take the tenth character of that
       \3mtt¢   # Do the same for the entry underneith
             >  # Compare the ascii value of the two
               $# Sort the input by the anonymous function.

Cobalah online!


0

java 8, 128 112 byte

Ini adalah ungkapan lambda untuk a java.util.function.Function<String[],String[]>

s->{String r="";for(String k:"q d c p".split(" "))for(String t:s)if(t.contains(k))r+=" "+t;return r.split(" ");}

Penjelasan: Untuk masing-masing dari 4 koin secara berurutan, periksalah input dan tambahkan nama koin ke hasil setiap kali ada kecocokan untuk karakter unik koin itu. Bagi hasil menjadi sebuah array dan kembalikan.


0

Ruby, 27 byte

->s{s.sort_by{|x|(x*2)[5]}}
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.