Created
June 28, 2019 08:49
-
-
Save la10736/6ed948ca4e752f4e80eb9ca32f71244d to your computer and use it in GitHub Desktop.
Rusthero solution
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/target | |
**/*.rs.bk |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<project version="4"> | |
<component name="MarkdownProjectSettings" wasCopied="true"> | |
<PreviewSettings splitEditorLayout="SPLIT" splitEditorPreview="PREVIEW" useGrayscaleRendering="false" zoomFactor="1.0" maxImageWidth="0" showGitHubPageIfSynced="false" allowBrowsingInPreview="false" synchronizePreviewPosition="true" highlightPreviewType="LINE" highlightFadeOut="5" highlightOnTyping="true" synchronizeSourcePosition="true" verticallyAlignSourceAndPreviewSyncPosition="true" showSearchHighlightsInPreview="true" showSelectionInPreview="true" openRemoteLinks="true" replaceUnicodeEmoji="false" lastLayoutSetsDefault="false"> | |
<PanelProvider> | |
<provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.panel" providerName="Default - Swing" /> | |
</PanelProvider> | |
</PreviewSettings> | |
<ParserSettings gitHubSyntaxChange="false" emojiShortcuts="0" emojiImages="0"> | |
<PegdownExtensions> | |
<option name="ABBREVIATIONS" value="false" /> | |
<option name="ANCHORLINKS" value="true" /> | |
<option name="ASIDE" value="false" /> | |
<option name="ATXHEADERSPACE" value="true" /> | |
<option name="AUTOLINKS" value="true" /> | |
<option name="DEFINITIONS" value="false" /> | |
<option name="DEFINITION_BREAK_DOUBLE_BLANK_LINE" value="false" /> | |
<option name="FENCED_CODE_BLOCKS" value="true" /> | |
<option name="FOOTNOTES" value="false" /> | |
<option name="HARDWRAPS" value="false" /> | |
<option name="HTML_DEEP_PARSER" value="false" /> | |
<option name="INSERTED" value="false" /> | |
<option name="QUOTES" value="false" /> | |
<option name="RELAXEDHRULES" value="true" /> | |
<option name="SMARTS" value="false" /> | |
<option name="STRIKETHROUGH" value="true" /> | |
<option name="SUBSCRIPT" value="false" /> | |
<option name="SUPERSCRIPT" value="false" /> | |
<option name="SUPPRESS_HTML_BLOCKS" value="false" /> | |
<option name="SUPPRESS_INLINE_HTML" value="false" /> | |
<option name="TABLES" value="true" /> | |
<option name="TASKLISTITEMS" value="true" /> | |
<option name="TOC" value="false" /> | |
<option name="WIKILINKS" value="true" /> | |
</PegdownExtensions> | |
<ParserOptions> | |
<option name="ADMONITION_EXT" value="false" /> | |
<option name="ATTRIBUTES_EXT" value="false" /> | |
<option name="COMMONMARK_LISTS" value="false" /> | |
<option name="DUMMY" value="false" /> | |
<option name="EMOJI_SHORTCUTS" value="true" /> | |
<option name="ENUMERATED_REFERENCES_EXT" value="false" /> | |
<option name="FLEXMARK_FRONT_MATTER" value="false" /> | |
<option name="GFM_LOOSE_BLANK_LINE_AFTER_ITEM_PARA" value="false" /> | |
<option name="GFM_TABLE_RENDERING" value="true" /> | |
<option name="GITBOOK_URL_ENCODING" value="false" /> | |
<option name="GITHUB_LISTS" value="true" /> | |
<option name="GITHUB_WIKI_LINKS" value="true" /> | |
<option name="GITLAB_EXT" value="false" /> | |
<option name="GITLAB_MATH_EXT" value="false" /> | |
<option name="GITLAB_MERMAID_EXT" value="false" /> | |
<option name="HEADER_ID_NON_ASCII_TO_LOWERCASE" value="false" /> | |
<option name="HEADER_ID_NO_DUPED_DASHES" value="false" /> | |
<option name="JEKYLL_FRONT_MATTER" value="false" /> | |
<option name="MACROS_EXT" value="false" /> | |
<option name="NO_TEXT_ATTRIBUTES" value="false" /> | |
<option name="PARSE_HTML_ANCHOR_ID" value="false" /> | |
<option name="PLANTUML_FENCED_CODE" value="false" /> | |
<option name="PUML_FENCED_CODE" value="false" /> | |
<option name="SIM_TOC_BLANK_LINE_SPACER" value="true" /> | |
</ParserOptions> | |
</ParserSettings> | |
<HtmlSettings headerTopEnabled="false" headerBottomEnabled="false" bodyTopEnabled="false" bodyBottomEnabled="false" embedUrlContent="false" addPageHeader="true" embedImages="false" embedHttpImages="false" imageUriSerials="false" addDocTypeHtml="true" noParaTags="false" plantUmlConversion="0" mathConversion="-1"> | |
<GeneratorProvider> | |
<provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.generator" providerName="Default Swing HTML Generator" /> | |
</GeneratorProvider> | |
<headerTop /> | |
<headerBottom /> | |
<bodyTop /> | |
<bodyBottom /> | |
</HtmlSettings> | |
<CssSettings previewScheme="UI_SCHEME" cssUri="" isCssUriEnabled="false" isCssUriSerial="true" isCssTextEnabled="false" isDynamicPageWidth="true"> | |
<StylesheetProvider> | |
<provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.css" providerName="Default Swing Stylesheet" /> | |
</StylesheetProvider> | |
<ScriptProviders /> | |
<cssText /> | |
<cssUriHistory /> | |
</CssSettings> | |
<AnnotatorSettings targetHasSpaces="true" linkCaseMismatch="true" wikiCaseMismatch="true" wikiLinkHasDashes="true" notUnderWikiHome="true" targetNotWikiPageExt="true" notUnderSourceWikiHome="true" targetNameHasAnchor="true" targetPathHasAnchor="true" wikiLinkHasSlash="true" wikiLinkHasSubdir="true" wikiLinkHasOnlyAnchor="true" linkTargetsWikiHasExt="true" linkTargetsWikiHasBadExt="true" notUnderSameRepo="true" targetNotUnderVcs="false" linkNeedsExt="true" linkHasBadExt="true" linkTargetNeedsExt="true" linkTargetHasBadExt="true" wikiLinkNotInWiki="true" imageTargetNotInRaw="true" repoRelativeAcrossVcsRoots="true" multipleWikiTargetsMatch="true" unresolvedLinkReference="true" linkIsIgnored="true" anchorIsIgnored="true" anchorIsUnresolved="true" anchorLineReferenceIsUnresolved="true" anchorLineReferenceFormat="true" anchorHasDuplicates="true" abbreviationDuplicates="true" abbreviationNotUsed="true" attributeIdDuplicateDefinition="true" attributeIdNotUsed="true" footnoteDuplicateDefinition="true" footnoteUnresolved="true" footnoteDuplicates="true" footnoteNotUsed="true" macroDuplicateDefinition="true" macroUnresolved="true" macroDuplicates="true" macroNotUsed="true" referenceDuplicateDefinition="true" referenceUnresolved="true" referenceDuplicates="true" referenceNotUsed="true" referenceUnresolvedNumericId="true" enumRefDuplicateDefinition="true" enumRefUnresolved="true" enumRefDuplicates="true" enumRefNotUsed="true" enumRefLinkUnresolved="true" enumRefLinkDuplicates="true" simTocUpdateNeeded="true" simTocTitleSpaceNeeded="true" /> | |
<HtmlExportSettings updateOnSave="false" parentDir="$ProjectFileDir$" targetDir="$ProjectFileDir$" cssDir="$ProjectFileDir$/css" scriptDir="$ProjectFileDir$/js" plainHtml="false" imageDir="" copyLinkedImages="false" imageUniquifyType="0" targetPathType="2" targetExt="" useTargetExt="false" noCssNoScripts="false" useElementStyleAttribute="false" linkToExportedHtml="true" exportOnSettingsChange="true" regenerateOnProjectOpen="false" linkFormatType="HTTP_ABSOLUTE" /> | |
<LinkMapSettings> | |
<textMaps /> | |
</LinkMapSettings> | |
</component> | |
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="Android 5.1.1 Google APIs" project-jdk-type="Android SDK"> | |
<output url="file://$PROJECT_DIR$/out" /> | |
</component> | |
</project> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<project version="4"> | |
<component name="ProjectModuleManager"> | |
<modules> | |
<module fileurl="file://$PROJECT_DIR$/encoder.iml" filepath="$PROJECT_DIR$/encoder.iml" /> | |
</modules> | |
</component> | |
</project> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<project version="4"> | |
<component name="VcsDirectoryMappings"> | |
<mapping directory="" vcs="Git" /> | |
</component> | |
</project> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This file is automatically @generated by Cargo. | |
# It is not intended for manual editing. | |
[[package]] | |
name = "encoder" | |
version = "0.1.0" | |
dependencies = [ | |
"rstest 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", | |
] | |
[[package]] | |
name = "proc-macro2" | |
version = "0.4.30" | |
source = "registry+https://github.com/rust-lang/crates.io-index" | |
dependencies = [ | |
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", | |
] | |
[[package]] | |
name = "quote" | |
version = "0.6.12" | |
source = "registry+https://github.com/rust-lang/crates.io-index" | |
dependencies = [ | |
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", | |
] | |
[[package]] | |
name = "rstest" | |
version = "0.2.2" | |
source = "registry+https://github.com/rust-lang/crates.io-index" | |
dependencies = [ | |
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", | |
"quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", | |
"syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)", | |
] | |
[[package]] | |
name = "syn" | |
version = "0.14.9" | |
source = "registry+https://github.com/rust-lang/crates.io-index" | |
dependencies = [ | |
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", | |
"quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", | |
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", | |
] | |
[[package]] | |
name = "unicode-xid" | |
version = "0.1.0" | |
source = "registry+https://github.com/rust-lang/crates.io-index" | |
[metadata] | |
"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" | |
"checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" | |
"checksum rstest 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "17060b44b74f0aed4e7ee6c970e57b5e51adbd3aecd814e1ab38a27e00901d67" | |
"checksum syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)" = "261ae9ecaa397c42b960649561949d69311f08eeaea86a65696e6e46517cf741" | |
"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[package] | |
name = "encoder" | |
version = "0.1.0" | |
authors = ["michele <[email protected]>"] | |
edition = "2018" | |
[dependencies] | |
[dev-dependencies] | |
rstest = "0.2.2" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<module type="RUST_MODULE" version="4"> | |
<component name="NewModuleRootManager" inherit-compiler-output="true"> | |
<exclude-output /> | |
<content url="file://$MODULE_DIR$"> | |
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /> | |
<sourceFolder url="file://$MODULE_DIR$/examples" isTestSource="false" /> | |
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" /> | |
<sourceFolder url="file://$MODULE_DIR$/benches" isTestSource="true" /> | |
<excludeFolder url="file://$MODULE_DIR$/target" /> | |
</content> | |
<orderEntry type="inheritedJdk" /> | |
<orderEntry type="sourceFolder" forTests="false" /> | |
</component> | |
</module> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
fn main() { | |
let mut data = "2216224441".to_owned(); | |
let steps = 40; | |
for _ in 0..steps { | |
data = encode(&data); | |
} | |
println!("New data after '{}' steps = {}", steps, data); | |
println!("Len = {}", data.len()); | |
} | |
struct CounterState { | |
char: char, | |
occurrences: usize | |
} | |
impl CounterState { | |
pub fn new(c: char) -> Self { | |
Self { char: c, occurrences: 1 } | |
} | |
fn increment(&mut self) { | |
self.occurrences += 1; | |
} | |
fn same(&self, other: char) -> bool { | |
self.char == other | |
} | |
} | |
struct Encoder<I: Iterator<Item=char>> { | |
stream: I, | |
state: Option<CounterState> | |
} | |
impl<I: Iterator<Item=char>> Encoder<I> { | |
pub fn new(stream: I) -> Self { | |
Self {stream, state: None } | |
} | |
fn replace_state(&mut self, c: char) -> Option<CounterState> { | |
std::mem::replace(&mut self.state, Some(CounterState::new(c))) | |
} | |
} | |
impl<I: Iterator<Item=char>> Iterator for Encoder<I> { | |
type Item = CounterState; | |
fn next(&mut self) -> Option<Self::Item> { | |
while let Some(c) = self.stream.next() { | |
match self.state { | |
None => self.state = Some(CounterState::new(c)), | |
Some(ref mut cs) if cs.same(c) => { cs.increment(); }, | |
_ => return self.replace_state(c) | |
} | |
}; | |
std::mem::replace(&mut self.state, None) | |
} | |
} | |
pub fn encode(input: &str) -> String { | |
Encoder::new(input.chars()). | |
map(|cs| format!("{}{}", cs.occurrences, cs.char)) | |
.collect() | |
} | |
#[cfg(test)] | |
mod test { | |
use super::*; | |
use rstest::rstest_parametrize; | |
#[rstest_parametrize(input, expected, | |
case("1", "11"), | |
case("2", "12"), | |
case("11", "21"), | |
case("31", "1311"), | |
case("3211", "131221"), | |
case("111223", "312213"), | |
case("2216224441", "221116223411"), | |
)] | |
fn standard_cases(input: &str, expected: &str) { | |
assert_eq!(&encode(input), expected) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment