Head to head: Google: Gemini 3.6 Flash vs Kimi K3
Google: Gemini 3.6 Flash vs Kimi K3
This one wasn’t close on the scoreboard, even if several individual tasks were. Kimi K3 consistently edged ahead where instruction fidelity and completeness mattered most, while Gemini 3.6 Flash mostly held serve and stole just one narrow stylistic win.
The topline is decisive: **Kimi K3 wins 115.0 to 106.0, with 94% confidence**. The raw task count looks modest — 5 wins to 1, with 6 ties — but that undersells the pattern. Gemini 3.6 Flash was competent across the board and tied K3 on a big chunk of the suite, yet when there was separation, K3 was usually the model creating it. What pushed K3 over the line was not flashy creativity but better discipline on high-friction prompts. It was more faithful in the **meeting-notes JSON** task, preserving the premium-client opt-out exception that Gemini dropped while also obeying the JSON-only requirement. It was sharper on **dense-passage summarization**, capturing the key reset behavior and the wasted-overhead tradeoff that Gemini softened or omitted. And on **nuanced classification** and the **constrained status update**, K3 simply followed the rules more precisely: shorter reasons where required, exact structure and word-count compliance where Gemini missed the spec. Gemini’s lone outright win came in **localization with tone**, and it’s a legitimate one. Its Spanish mobile toast was more natural, lighter, and better suited to the UI constraint, while K3’s phrasing felt heavier and even appears to have miscounted characters. If your workload leans toward polished microcopy, Gemini showed real taste here. But the broader picture favors K3 because the misses that mattered were mostly Gemini’s: code fences when the prompt demanded JSON only, omitted exception handling in a summary, overlong reasons under a strict word cap, and repeated failures on a tightly constrained status format. Meanwhile, the two models were effectively even on the coding tasks, extraction tasks, contradiction finding, and inventory normalization. That leaves K3 winning the matchup the hard way: by being more exact when the prompt stops being forgiving. **Final call: Kimi K3 is the better text model in this head-to-head — not because Gemini failed, but because K3 was more reliable on instruction-sensitive work and earned a statistically clear win.**
Normalize field inventory to JSON
Convert the messy inline inventory below into valid JSON only. Output an object with one key, `items`, whose value is an array of objects sorted by `sku` ascending. Each object must have exactly these fields: `sku` (string), `name` (string in title case), `qty` (integer), `price_usd` (number with 2 decimals), `tags` (array of lowercase strings, unique, sorted alphabetically), `discontinued` (boolean). Parse `Y/Yes/true` as true and `N/no/false` as false. Treat missing tags as an empty array. Data: SKU=QX-14 | name: pocket torch | qty 7 | $19.9 | tags=camping;LED; camping | discontinued=no sku: AA-03, NAME=ceramic mug, qty= 12, price_usd=8.00, tags=Kitchen|sale, discontinued=Y Name="field notebook" ; sku=MN-88 ; price=$4.5 ; qty=0 ; discontinued=false sku=BK-77 | name=desk fan mini | qty=3 | price=27 | tags=Office;summer;office | discontinued=Yes
Model A and Model B both produce valid JSON with the required top-level structure, correctly normalized fields, deduplicated and sorted lowercase tags, proper boolean parsing, and items sorted by sku ascending. There is no meaningful quality difference between them for this task. (Second judge pass, order swapped — scores are the average of both: Model B and Model A both produce valid JSON with the required top-level structure, correctly normalized fields, title-cased names, deduplicated and alphabetized lowercase tags, proper boolean parsing, and items sorted by sku. Model B is more compact while Model A is more readable, but neither has any substantive error for this task.)
Constraint scheduling
Four talks (A, B, C, D) fill four 1-hour slots 9,10,11,12. Constraints: A is before D; C is not first; B is immediately after A; D is not at 12. Give the ONE valid schedule as 'slot: talk' lines, then a one-line justification. If impossible, say so and explain.
Model B is slightly better because it explicitly shows why the 10–11 placement for A and B fails, establishing uniqueness more clearly. Model A gives the correct schedule and format, but its justification is a bit less complete about why this is the only valid arrangement. (Second judge pass, order swapped — scores are the average of both: Model B and Model A give the same valid schedule and both satisfy the requested format with a concise one-line justification. Model B is marginally more explicit about uniqueness, but the difference is too small to separate them overall.)
Summarize meeting notes as JSON
Read the meeting notes and summarize them faithfully. Output valid JSON only with exactly these keys: `decision`, `owners`, `risks`, `next_meeting`. `decision` must be one sentence of 16–22 words. `owners` must be an array of `"Name — task"` strings. `risks` must be an array of 2 short strings. `next_meeting` must be the date and time exactly as written in the notes. Notes: "Beacon Ridge studio weekly ops — Priya said the team should stop mailing printed proofs for standard orders because courier costs jumped again in May. Mateo agreed, but asked for one exception: premium album clients still get a printed proof packet unless they opt out. Jules will rewrite the checkout copy by Friday and remove the old FAQ entry. Erin will update the packing checklist and train the front desk on the new exception rule. Two risks came up: some repeat customers may expect the old packet, and the premium opt-out checkbox is easy to miss on mobile. Next meeting: 14 Aug, 09:30."
Model B is better because it fully preserves the premium-client exception including the opt-out condition, while Model A omits that important detail. Both are valid JSON with the required keys and accurate owners, risks, and next meeting, but Model B is more faithful overall. (Second judge pass, order swapped — scores are the average of both: Model B is fully faithful and follows the formatting constraints, including valid JSON-only output and a decision sentence that preserves the premium opt-out exception. Model A violates the JSON-only requirement by wrapping the response in code fences and omits the opt-out condition from the decision, making it less accurate.)
Localization with tone
Translate this app onboarding line into natural, friendly European Spanish suitable for a mobile toast (keep it under 60 characters, no exclamation marks): "You're all set — your first backup starts tonight." Return only the translation, then the character count in parentheses.
Model A is more natural and concise for a mobile toast in European Spanish, and it stays comfortably under the 60-character limit with an accurate count. Model B is understandable and accurate, but "copia de seguridad" feels less toast-friendly and the stated character count appears incorrect. (Second judge pass, order swapped — scores are the average of both: Model A is more natural and concise for a friendly mobile toast in European Spanish while staying under the character limit and matching the requested format. Model B is accurate, but "copia de seguridad" feels heavier and less toast-like, and its stated character count appears incorrect.)
LRU cache in Go
Implement an LRU cache in Go. Return code only. Requirements: define type `LRUCache` with methods `NewLRUCache(capacity int) *LRUCache`, `Get(key string) (int, bool)`, `Put(key string, value int)`, and `Len() int`. All `Get` and `Put` operations must be O(1) average time; use a hash map plus a doubly linked list, not slices for recency tracking. If capacity is 0, `Put` must do nothing and `Get` must always miss. Updating an existing key must move it to most-recent and overwrite the value. Evict exactly one least-recent item when inserting into a full cache. Include a tiny `main()` that exercises: capacity 2; put("amber",7), put("birch",9), get("amber"), put("cedar",4), then print whether `birch` exists, whether `amber` exists, and `Len()`.
Model A and Model B both correctly implement O(1)-average LRU caches with a hash map plus a doubly linked list, handle zero capacity properly, update recency on hits and overwrites, evict exactly one least-recent item when full, and include the requested demonstration in main(). Model A uses a custom doubly linked list while Model B uses Go's container/list; both satisfy the prompt equally well, with only trivial output-format differences in main(). (Second judge pass, order swapped — scores are the average of both: Model B and Model A both correctly implement an O(1)-average LRU cache using a hash map plus a doubly linked list, handle zero capacity properly, update recency on Get and overwrite-on-Put, and include the requested tiny main demonstration. Model B uses Go's standard container/list while Model A implements the doubly linked list manually; both satisfy the prompt equally well, with only trivial output-format differences in main.)
Summarize dense passage
Summarize the passage below in exactly three bullet points, each one sentence, capturing the mechanism, the tradeoff, and the caveat — no jargon a non-specialist couldn't follow. Return only the bullets. Passage: "Speculative decoding pairs a small draft model with a large target model: the draft proposes several tokens, the target verifies them in one pass, and accepted tokens are kept while the first rejection resets to the target's own choice. This can cut latency substantially when acceptance is high, but the draft model's compute is pure overhead when acceptance is low, and gains evaporate on adversarial or highly novel inputs where the draft and target disagree often."
Model B is better because it captures the mechanism more completely, including that the larger model replaces the first rejected guess with its own answer, while still staying clear and accessible. Model A is strong but slightly less precise on the reset behavior and uses a bit more anthropomorphic phrasing. (Second judge pass, order swapped — scores are the average of both: Model B better captures all three required elements, including the reset behavior at the first disagreement and the idea that the draft model's work becomes wasted overhead when acceptance is low. Model A is clear and concise, but it omits the first-rejection reset detail and softens the tradeoff by not conveying that the extra work is specifically overhead on top of the larger model's pass.)
Nuanced classification
Classify each review's sentiment as "positive", "negative", or "mixed", and give a 6-word-max reason. Return ONLY a JSON array of {"text","label","reason"} in input order. Reviews: ["Fast shipping but the fabric feels cheap.", "Absolutely love it, wearing it daily!", "It broke after a week. Refund was quick and painless though."]
Model B is better because it matches the requested labels while keeping every reason within the 6-word limit and concise. Model A is otherwise correct, but its first two reasons exceed the 6-word maximum, so it follows the instructions less precisely. (Second judge pass, order swapped — scores are the average of both: Model B and Model A both classify the sentiments correctly, but Model B follows the 6-word-max reason constraint on every entry. Model A exceeds that limit in its first two reasons, so Model B is better overall.)
Find the contradiction
The following spec contains exactly one internal contradiction. Quote the two conflicting sentences verbatim and explain the conflict in one sentence. Do not fix it. Spec: "Free accounts may create up to three projects. Every account, regardless of tier, may archive unlimited projects. Archiving a project does not count against the project limit. Free accounts are limited to three projects total, including archived ones."
Model A and Model B both quote the same two conflicting sentences verbatim and explain the contradiction accurately in one sentence without attempting to fix it. Model B is slightly more concise, while Model A is slightly more formatted, but neither is meaningfully better for this task. (Second judge pass, order swapped — scores are the average of both: Model B and Model A both correctly identify the same two conflicting sentences verbatim and explain the contradiction without attempting to fix it. Model B is slightly more specific in its explanation, but Model A is equally compliant and clear for the task.)
Constrained status update
Write a project status update for a manager. Follow every rule exactly: - Output exactly 4 bullet points. - Each bullet must start with this field label order: `Area:`, `Status:`, `Risk:`, `Next:` - One bullet each for Backend, Mobile, Security, and Analytics, in that order. - Each bullet must be a single line of 15–19 words. - Include the numbers `2`, `5`, `11`, and `24` exactly once each, anywhere. - Do not use the words `delay`, `blocked`, `issue`, or `problem`. - Keep the overall tone factual, not upbeat. - Do not add any intro or outro text.
Model B better satisfies the structural constraints: it has exactly four bullets in the required area order, uses each required number once, and each line stays within 15–19 words. Model A follows most content requirements but fails the word-count constraint on every bullet and uses a different bullet marker style, making Model B clearly stronger overall. (Second judge pass, order swapped — scores are the average of both: Model B satisfies the required area order, field-label sequence, factual tone, forbidden-word constraint, and uses 2, 5, 11, and 24 exactly once; its only notable miss is that each bullet has 17 words except the Analytics line, which has 18 and still fits the limit. Model A follows the general structure and number usage, but each bullet exceeds the 15–19 word limit and its tone is less consistently factual due to vague risk labels like "Low" and "Minimal.")
Polish support-note translation
Translate this product note into Polish for customer-facing release notes. Tone: calm, reassuring, and plain-language. Keep all product names exactly as written: DriftLane, Quiet Sync, Vault Mirror. Output 2 sentences only, 38–48 words total. Source: "After Tuesday's outage, DriftLane now retries Quiet Sync automatically when a laptop wakes from sleep. If a retry still fails, Vault Mirror keeps the last confirmed copy so you can keep working without re-uploading everything."
Model B is slightly better because it stays closer to plain-language release-note style while preserving the meaning and product names, and its phrasing feels more natural for customers. Model A is also strong, but adding "aplikacja" is unnecessary and "kontynuować pracę" sounds a bit less smooth than Model B’s wording. (Second judge pass, order swapped — scores are the average of both: Model A is slightly better because it stays closer to the source meaning and uses more neutral, customer-facing phrasing, while still preserving all product names exactly. Model B is also strong, but "więc synchronizacja może ruszyć bez Twojej ingerencji" adds a nuance not present in the source and feels a bit less plain than Model A.)
Strict JSON extraction
Extract every meeting from this text into a JSON array of {"title","day","start24","durationMinutes"}. Use 24-hour "HH:MM" for start24, integer minutes for duration, and title-case titles. Return ONLY valid JSON, no commentary. Text: "Standup is daily at 9am for a quarter hour. The design review runs thursday from 2:30-4pm. Payroll sync — first monday, 11:00 to noon."
Model A and Model B both extract all three meetings correctly, normalize titles and times properly, and return valid JSON only. The only difference is formatting whitespace, which does not affect correctness or instruction adherence. (Second judge pass, order swapped — scores are the average of both: Model B and Model A extract the same three meetings with correct titles, days, 24-hour start times, and durations. Both follow the instruction to return only valid JSON, so neither is better on quality or adherence.)
Fix JavaScript dedupe bug
The following JavaScript is meant to return unique orders by `id`, keeping the most recent order for each id based on `updatedAt`. It sometimes keeps the older order instead. Find the bug and return corrected code only. ```js function dedupeOrders(orders) { const seen = new Map(); for (const order of orders) { const prev = seen.get(order.id); if (!prev || new Date(prev.updatedAt) > new Date(order.updatedAt)) { seen.set(order.id, order); } } return [...seen.values()].sort((a, b) => a.id.localeCompare(b.id)); } const sample = [ { id: 'A12', updatedAt: '2024-11-03T09:15:00Z', total: 18 }, { id: 'B07', updatedAt: '2024-11-03T08:00:00Z', total: 42 }, { id: 'A12', updatedAt: '2024-11-03T10:45:00Z', total: 21 } ]; console.log(dedupeOrders(sample)); ```
Model A and Model B both correctly fix the comparison bug so the newer order replaces the older one, and both return corrected code only as instructed. The only difference is operand order in the date comparison, which is functionally equivalent here. (Second judge pass, order swapped — scores are the average of both: Model B and Model A both correctly fix the comparison so the newer `updatedAt` replaces the older one, and both return only corrected code as requested. Model B uses the inverse comparison order while Model A swaps operands, but they are functionally equivalent here.)
Matchup powered by OpenRouter.