Tujuan: Mengeluarkan String yang berisi setiap bilangan bulat positif persis di bawah 1000.
Jawaban yang jelas adalah menyatukan mereka masing-masing, dan itu akan membuat String 2890 karakter (terima kasih manatwork), untuk menghindari jawaban mudah semacam ini, panjang string harus di bawah 1500 karakter. Berikut ini adalah kode Java langsung yang menghasilkan String 1.200 karakter.
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;
import static org.junit.Assert.assertTrue;
/**
* Created with IntelliJ IDEA.
* User: fab
* Date: 05/11/13
* Time: 09:53
* To change this template use File | Settings | File Templates.
*/
public class AStringToContainThemAll {
@Test
public void testsubStrings() throws Exception {
String a = generateNewString();
boolean cool = true;
for (int i = 0; i < 1000; i++) {
assertTrue(a.contains(Integer.toString(i)));
}
}
private String generateNewString() {
List<Integer> myTree = new ArrayList<Integer>();
String finalString = new String("100");
for (int i = 10; i < 1000; i++) {
myTree.add(i);
}
while (myTree.size() > 0) {
if (finalString.contains(Integer.toString(myTree.get(0)))) {
myTree.remove(0);
} else {
String substringLong = finalString.substring(finalString.length() - 2, finalString.length());
boolean found = false;
loop:
for (Integer integer : myTree) {
if (integer.toString().startsWith(substringLong) && !finalString.contains(integer.toString())) {
finalString = finalString.concat(integer.toString().substring(2, 3));
myTree.remove(integer);
found = true;
break loop;
}
}
if(! found){
finalString = finalString.concat(myTree.get(0).toString());
myTree.remove(0);
}
}
}
return finalString;
}
}
Kemenangan kode terpendek, poin bonus untuk String terpendek!
B(10, 3)
, tetapi karena Anda tidak mengizinkan pembungkus siklik, perlu mengulangi dua karakter pertama.Jawaban:
Golfscript - 13 byte, 1315 output
Di atas memilih angka-angka dari 0-990 yang digit pertama adalah digit terbesar dari angka, yaitu digit terakhir dari representasi string yang diurutkan secara leksikografis kurang dari string itu sendiri. Logikanya adalah sebagai berikut:
Untuk 3 digit angka abc , jika a bukan digit terbesar dari nomor tersebut, nomor saya akan dilewati, karena akan dicakup oleh salah satu dari dua kasus nanti:
b <c (mis. 123 )
Karena c adalah digit terbesar, jumlah taksi tidak akan dilewati. Dalam contoh ini 312 tidak akan dilewati, juga tidak akan nilai berikutnya 313 , yang ketika digabungkan ( 312 313 ) berisi 123 .
b ≥ c (mis 132 )
Karena b adalah digit terbesar, angka bca tidak akan dilewati. Dalam contoh ini 321 tidak akan dilewati, juga tidak akan nilai berikutnya 322 , yang ketika digabungkan ( 321 322 ) berisi 132 . Jika b = c (mis. 122 ), kasus ini juga berlaku. Nilai bca tidak akan dilewati, seperti sebelumnya, dan karena a harus kurang dari b , bc <a + 1> juga tidak akan dilewati. Dalam contoh ini, 221 222 berisi 122 .
Karena kode di atas menguji angka ketiga, alih-alih yang terakhir, semua nilai dari 0-99 dimasukkan dalam hasil. Nilai-nilai dari 1-99 dapat dilewati, karena jika setiap urutan 3 digit hadir, maka setiap urutan 1 digit dan 2 digit juga harus ada.
Nilai dari 991-999 juga dapat dilewati, karena dihasilkan oleh ( 909 910 , 919 920 , ... 989 990 ).
Pada output 1315 byte, ini nyaman di bawah spesifikasi masalah kurang dari 1500.
Keluaran:
Variasi # 1
14 byte, output 1233
Dengan memilih secara ketat digit terakhir untuk perbandingan, alih-alih yang ketiga, banyak nilai yang tidak perlu kurang dari 100 dihilangkan, memperpendek string yang dihasilkan.
Variasi # 2
16 byte, 1127 keluaran
Dengan mencabut semua nilai kurang dari 99 sebelumnya, string yang dihasilkan dapat dipersingkat bahkan lebih.
Golfscript - 19 byte, 1016 output
Nilai di atas dihitung dari 99 hingga 909 , menambahkan nilai apa pun yang belum muncul ( 909 biasanya akan menjadi nilai terakhir yang ditambahkan dengan cara ini). Memindahkan 99 ke depan adalah pengoptimalan untuk menghindari keharusan 910 di belakang.
Keluaran:
Golfscript 26 byte, 999 output
Perhatikan bahwa 1016 karakter string yang dihasilkan oleh solusi sebelumnya hampir optimal, kecuali untuk memiliki dua tambahan angka untuk setiap kelipatan 111 (yaitu
11111
bukan111
,22222
bukan222
, dll). Solusinya dapat dibuat optimal dengan menghapus digit tambahan ini (hanya memasukkan satu digit pada masing-masing nilai ini, bukan tiga), dan dengan memutar909
ke depan, menghilangkan a9
(ini berbeda dari versi sebelumnya, yang pindah9100
ke belakang sebagai gantinya ).Belum dibuka dan dikomentari:
Logika untuk memilih karakter mana yang ditambahkan mengikuti tiga kasus:
Nilai dari cek pertama adalah 1 , dan dari -1 kedua.
Irisan akan mulai mulai dari indeks 0 ; itu akan mengembalikan seluruh string.
Nilai dari cek pertama adalah 1 , dan dari yang kedua ≥ 2 .
Irisan akan mulai menatap dari indeks ≥ 3 ; itu akan mengembalikan string kosong.
Nilai dari cek pertama adalah 0 , dan dari -1 kedua.
Irisan akan mulai dari indeks -1 ; itu akan mengembalikan karakter terakhir saja.
Jumlah dari logika adalah bahwa nilai apa pun yang belum muncul akan ditambahkan secara keseluruhan - kecuali jika merupakan kelipatan dari 111 , dalam hal ini hanya satu karakter yang akan ditambahkan. Semua nilai lain akan diabaikan.
Perhatikan bahwa string yang dihasilkan berbeda dari yang optimal yang dihasilkan oleh jawaban Peter Taylor .
Sejarah:
Keluaran:
sumber
GolfScript (
35 3126 karakter)Output adalah
(1020 karakter) Ini adalah varian pada pendekatan gabungan kata Lyndon: alih-alih menggunakan kata 1-char primitif, kata ini menggunakan kelipatan 111 untuk kode yang lebih pendek tetapi kejadian berulang dari angka-angka itu; dan daripada menggunakan elemen minimal dari kelompok konjugasi, ia menggunakan elemen maksimal, karena itu memperpendek loop.
pada 40 karakter (mungkin masih bisa ditingkatkan) menghasilkan string yang optimal, yang panjangnya 999 karakter:
Mencoba membuat ini lakukan string terbalik mengalami masalah dengan menghilangkan kelipatan 111.
Untuk melihat bahwa 999 adalah panjang optimal (karena komentar singkat saya di atas tidak meyakinkan semua orang), mulailah dari urutan penuh de Bruijn yang (diambil sebagai string siklik) berisi setiap urutan karakter 3 digit dari 0 hingga 9. Sejak ada 1000 di antaranya, panjangnya minimal 1000 karakter; bahwa hal itu dapat tepatnya 1000 karakter biasanya dibuktikan dengan berjalan Euler pada grafik yang node adalah urutan dua digit
xy
dengan 10 tepi, masing-masing diberi label dengan satu digitz
, yang mengambilxy
untukyz
.Kita tidak perlu urutan mulai
0
, jadi mengingat urutan de Bruijn kita dapat memutar untuk menempatkan000
di akhir. Maka kita tidak perlu salah satu dari sekuens yang membungkus ke awal, tetapi kita perlu dua dari0
untuk menyelesaikan urutan dimulai dengan digit sebelumnya000
, jadi kita dapat menghapus salah satu dari mereka untuk mendapatkan string 999-karakter. Setiap sisa0
digunakan dalam angka yang tidak dimulai0
.sumber
10,:^{:x^>{x.@:&<+^>{x&@}/}/}/0.
Memvariasikan bahwa untuk kata-kata Lyndon yang sebenarnya berikan10,:^{:x^>{x.@:&<+^>{.x>{x&@}*}/}/}%3>0.
(40 karakter) untuk string optimal.GolfScript, 17 karakter
Pendekatan sederhana untuk menambahkan setiap nomor jika belum ada dalam string (catatan: 999 tidak dicentang atau ditambahkan, tetapi sudah terkandung dalam output).
Output adalah 1133 karakter:
sumber
Saya tidak memiliki kode apa pun, tetapi saya pikir seseorang mungkin menghargai bukti intuitif ini bahwa 999 karakter adalah batas bawah dari panjang keluaran:
Pertama, setiap angka 1- dan 2 digit adalah bagian dari angka 3 digit, jadi abaikan semua yang kurang dari 100. 100-999 inklusif adalah 900 angka 3 digit.
Cara paling optimal untuk menyelesaikan masalah adalah jika setiap karakter digunakan sebanyak mungkin. Itu berarti angkanya tumpang tindih sebanyak mungkin, seperti ini:
Karenanya angka pertama akan menambah 3 karakter, dan setiap angka selanjutnya akan menambah 1 karakter. Itu memberi 3 + 899 = 902 karakter sebagai batas bawah.
Namun, ketika ada nol, kami tidak dapat menggunakannya untuk memulai nomor 3 digit baru. Kami dapat menggunakannya kembali di tengah-tengah angka 3 digit lainnya, asalkan tidak diikuti oleh nol lain:
Tapi:
Oleh karena itu, setiap nol yang muncul dalam output memperpanjang output dengan 1 karakter - kecuali untuk dua karakter terakhir yang mungkin nol karena mereka tidak tumpang tindih dengan angka lebih lanjut:
Ada 81 angka dengan ketat satu nol di tengah (? 0?), 81 dengan ketat satu nol di akhir (?? 0), dan 9 dengan dua nol (? 00).
Setiap ?? 0 angka dapat berbagi nol dengan 0? nomor atau nomor? 00, tetapi tidak keduanya. ? 0? dan? 00 tidak pernah dapat membagikan nol, sehingga harus ada setidaknya 81 + 9 * 2 nol dalam output.
Ini memberi batas bawah 3 + 899 + 81 + 9 * 2 - 2 = 999 karakter.
Permintaan maaf jika ini dianggap di luar topik, tapi terlalu lama untuk dituangkan dalam komentar.
sumber
Perl,
37 34 3332 (11361132 karakter)untuk $ @ (1..999) {$ _. = $ @ if! / $ @ /} cetakuntuk $ i (1..999) {$ _. = $ i if! / $ i /} cetakuntuk (1..1e3) {$ s. = $ _ jika $ s! ~ / $ _ /} cetak $ sOutput:
String lebih pendek:
38 3734 (1020 karakter):untuk ($ @ = 1e3; $ @ -;) {$ _. = $ @ if! / $ @ /} cetakuntuk ($ i = 1e3; $ i -;) {$ _. = $ i jika! / $ i /} cetakOutput:
Masih tidak senang dengan duplikasi terutama 99999 di awal! Saya pikir lebih banyak cek akan membuat lebih banyak kode ...
Sunting: Menambahkan saran dari @Peter Taylor
Sunting 2: Beberapa saran hebat dari @primo! Terima kasih
sumber
$_.=$@if!/$@/
, Anda bisa menggunakan pengulangan string$_.=$@x!/$@/
. Thefor
dapat diganti denganwhile
sebagai pengubah pernyataan, menggunakan modulo a:...while$@=--$@%1e3
APL (20, output: 1020)
Penjelasan:
{∨/⍺⍷⍵:⍵⋄⍵,⍺}
: if⍺
is a substring⍵
, return⍵
, else return⍵,⍺
/
: kurangi⍕¨
: representasi string dari masing - masing⍳999
: bilangan bulat dari1
ke999
.Keluaran:
APL (41, output: 999)
Penjelasan:
⌽⍕¨100+⍳898
:('999' '998' ... '101')
(dalam urutan terbalik, karena pengurangan langsung ke kiri di APL, yaituF/a b c ≡ a F (b F c)
)/
: mengurangi⍵,⍺⍴⍨
: argumen kanan, diikuti olehN
karakter pertama dari argumen kiri, di manaN
adalah:3×~∨/⍺⍷⍵
:3
jika⍺
bukan substring⍵
, jika tidak0
(1=⍴∪⍺)
:1
jika⍺
hanya memiliki satu karakter unik, jika tidak0
∨
: pembagi umum terbesar dari dua nilai sebelumnya, jadi:1
jika⍺
belum ada⍵
dan hanya memiliki satu karakter unik,3
jika⍺
belum ada di dalam⍵
tetapi memiliki lebih dari satu karakter unik,0
jika tidak.'0',⍨
: tambahkan nol di akhir hasilKeluaran:
sumber
Ruby:
5046 karakter (keluaran 1020 karakter)Contoh dijalankan:
Uji coba:
Ruby:
10297 karakter (keluaran 999 karakter)Contoh dijalankan:
Uji coba:
sumber
(?0..?9*3).map{|i|$/[i]||($><<i;$/+=i)}
mungkin?JavaScript, 39
Output 1020 karakter:
Verifikasi:
for(i=0;i<1000;i++)console.assert(k.indexOf(i)>=0)
sumber
Mathematica (
6264 karakter, 1002 keluaran)Karena ini memanfaatkan fungsi asli, saya lebih menghargai keindahan dari solusi yang lebih pendek dari awal. Output adalah 1002 karakter.
sumber
DeBruijnSequence
mengasumsikan pembungkus siklik. Dengan menambahkan "79", dua digit terakhir, menyelesaikan masalah.Mathematica, 51 karakter
Output (1155 karakter):
sumber
{i, j, k}
manai
dari 0 hingga 9 danj
,k
lebih kecil darii
. Kemudian ia mengubah daftar menjadi string.Python - 53
63, Keluaran 1134Ini benar-benar kasar, tetapi ini valid. Ya itu memiliki nol di depan, tetapi menyimpan dua karakter dengan tidak memiliki
range(1,1000)
.Di atas melemparkan
DeprecationWarning
lebih dari penggunaan 1e3 dalamrange()
panggilan, tetapi menyimpan karakter lebih dari menggunakan 1000.Ada versi keluaran panjang yang sedikit lebih optimal juga, dengan membalikkan string dengan biaya
65 karakter (terima kasih kepada res dan filmor untuk tipsnya) :Output Python - 58, 1021
sumber
for i in range(999):s+=`i`*(not`i`in s)
range(999,99,-1)
alih-alihrange(1000)[::-1]
.str(i)*(str(i)not in s)
sedikit lebih pendek darii=str(i);s+=[i,''][i in s]
;)1e3
bukan1000
K, 33
Pada dasarnya sama dengan solusi Howards - 1133 karakter.
sumber
Java-
12698 chars (Java 6)Output (1020 karakter):
Dapat mencapai yang baik (menurut Peter Taylor , tetapi kemudian ia mengatakan 999 optimal) Panjang string dengan menambahkan beberapa karakter (+20 karakter untuk
147118):Output (1002 karakter):
Sunting : Terima kasih kepada Fabinout karena menunjukkan bahwa Java 6 dapat menyimpan 28 karakter.
sumber
public static void main(String[]a)
? (itu akan mengubah kode saya dari...public static void main(String[]c){...
ke...static{...
)Windows PowerShell - 40, 1020 Output
Keluaran:
sumber
Haskell, 75 byte - 1002 output
Pendekatan saringan yang mengembalikan solusi minimal.
Perhatikan bahwa solusi ini tidak praktis lambat.
sumber
Data.List
untukisInfixOf
, namun Anda masih dapat menyimpan 2 byte dengan memainkannya lagi: 1) Hardcoden = 1000
2) Gunakanall
lebihand
dan versi pointfree dari predikat 3) gunakan(!!0)
lebih darihead
4) Gunakan pemahaman daftar di atas kombinasimap
&filter
5) gunakan(<$>)
lebih darimap
:[s|s<-show<$>[1..],all((`isInfixOf`s).show)[1..1000]]!!0
Powershell, 36 byte, 1020 output
Keluaran:
Alternatif, 69 byte, 1000 keluaran
Keluaran:
Alternatif,
8273 byte, 999 output (minimum)Ini adalah algoritma yang disederhanakan dari Hasilkan De Bruijn terpendek yang diadaptasi untuk konstanta: alphabet =
9876543210
dan length =3
Keluaran:
Skrip uji:
sumber
05AB1E , 9 byte dan 1109 karakter
Output:
Coba online atau verifikasi mengandung semua angka di bawah 1000 .
Penjelasan:
sumber
Pyke, 13 byte (tidak bersaing), panjang string 1133
Pyke lebih baru daripada tantangan dan karenanya tidak kompetitif.
Coba di sini!
sumber
PHP,
4844 byteTerima kasih kepada @primo untuk mengingatkan saya pada
ereg
.atau
output: 1020 karakter. membutuhkan PHP <7
PHP 7, 48 byte:
ereg
telah dihapus di PHP 7Jika argumen kedua untuk
strstr
(ataustrpos
dan fungsi pencarian string lainnya) bukan string, itu akan digunakan sebagai kode ascii, jadi$i
perlu dilemparkan ke string.sumber
ereg($i,$s)
untuk 4 (saya juga akan memasukkan<?
dalam jumlah byte).ereg
dihapus, mungkin, karena nama fungsinya terlalu pendek, dan / atau tidak mengandung cukup garis bawah. Itusplit
juga dihapus sangat brilian.ereg
telah dihapus karena POSIX hanya berisi sebagian kemungkinan PCRE; dan mereka mungkin tidak ingin memelihara dua perpustakaan yang berbeda. Saya akan bertanya apakah saya akan bertemu Rasmus Lerdorf lagi.split
telah dihapus, tetapijoin
tetap (mungkin karena itu "hanya" alias). Maaf untuk kesedihan; tapi saya tahu orang yang tidak bisa mengenali ironi.Groovy, 49 karakter / byte
Saya tidak yakin apakah akan melakukan ini sebagai fungsi yang mengembalikan variabel string, atau mencetak hasilnya, jadi ini hanya mencetaknya ke stdout. Menggunakan pencocokan regex disimpan 2 byte, menggunakan operator ternary bukan "jika" disimpan byte lain. String output adalah 1133 karakter.
Keluaran:
sumber
Bahasa Game Maker, 1014 - String 1000
show_message(909910010110210310410510610710810911121131141151161171181191201221231241251261271281291301321331341351361371381391401421431441451461471481491501521531541551561571581591601621631641651661671681691701721731741751761771781791801821831841851861871881891901921931941951961971981992002022032042052062072082092223224225226227228229230233234235236237238239240243244245246247248249250253254255256257258259260263264265266267268269270273274275276277278279280283284285286287288289290293294295296297298299300303304305306307308309333433533633733833934034434534634734834935035435535635735835936036436536636736836937037437537637737837938038438538638738838939039439539639739839940040440540640740840944454464474484494504554564574584594604654664674684694704754764774784794804854864874884894904954964974984995005055065075085095556557558559560566567568569570576577578579580586587588589590596597598599600606607608609666766866967067767867968068768868969069769869970070770870977787797807887897907987998008088098889890899900)
Juga:
Ruby, 1003 - String 1000
p'909910010110210310410510610710810911121131141151161171181191201221231241251261271281291301321331341351361371381391401421431441451461471481491501521531541551561571581591601621631641651661671681691701721731741751761771781791801821831841851861871881891901921931941951961971981992002022032042052062072082092223224225226227228229230233234235236237238239240243244245246247248249250253254255256257258259260263264265266267268269270273274275276277278279280283284285286287288289290293294295296297298299300303304305306307308309333433533633733833934034434534634734834935035435535635735835936036436536636736836937037437537637737837938038438538638738838939039439539639739839940040440540640740840944454464474484494504554564574584594604654664674684694704754764774784794804854864874884894904954964974984995005055065075085095556557558559560566567568569570576577578579580586587588589590596597598599600606607608609666766866967067767867968068768868969069769869970070770870977787797807887897907987998008088098889890899900'
sumber
ruby
Kode dapat digunakanp
alih-alihputs
memberikannya parameter numerik.